@shepai/cli 1.43.0 → 1.44.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packages/core/src/application/ports/output/repositories/index.d.ts +1 -0
- package/dist/packages/core/src/application/ports/output/repositories/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +19 -0
- package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.js +6 -0
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +3 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +20 -2
- package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.d.ts +18 -0
- package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.js +64 -0
- package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.d.ts +13 -0
- package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/repositories/delete-repository.use-case.js +38 -0
- package/dist/packages/core/src/application/use-cases/repositories/list-repositories.use-case.d.ts +13 -0
- package/dist/packages/core/src/application/use-cases/repositories/list-repositories.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/repositories/list-repositories.use-case.js +33 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +17 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +22 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +4 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts +30 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js +39 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +60 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +21 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +69 -0
- package/dist/src/presentation/web/app/actions/add-repository.d.ts +11 -0
- package/dist/src/presentation/web/app/actions/add-repository.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/add-repository.js +17 -0
- package/dist/src/presentation/web/app/actions/delete-repository.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/delete-repository.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/delete-repository.js +16 -0
- package/dist/src/presentation/web/app/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/page.js +29 -8
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts +2 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.js +2 -2
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts +3 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.js +8 -2
- package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.js +28 -3
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts +2 -0
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts +1 -1
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +2 -2
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.js +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
- package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +2 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -0
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +81 -19
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +2 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +11 -2
- package/dist/src/presentation/web/lib/layout-with-dagre.js +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/page/server-reference-manifest.json +48 -18
- package/web/.next/server/app/page.js +1 -1
- package/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +4 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__77c0dfc4._.js → [root-of-the-server]__4e8ca89c._.js} +3 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4e8ca89c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_3ac3601c._.js +10 -0
- package/web/.next/server/chunks/ssr/_3ac3601c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_a35f2870._.js +3 -0
- package/web/.next/server/chunks/ssr/_a35f2870._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +49 -19
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +48 -18
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +4 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- 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
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_3ac3601c._.js +10 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_a35f2870._.js +3 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +49 -19
- package/web/.next/standalone/src/presentation/web/app/actions/add-repository.ts +29 -0
- package/web/.next/standalone/src/presentation/web/app/actions/delete-repository.ts +21 -0
- package/web/.next/standalone/src/presentation/web/app/page.tsx +34 -8
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.ts +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.tsx +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node-config.ts +3 -0
- package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.stories.tsx +30 -3
- package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.tsx +57 -1
- package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.ts +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.tsx +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +4 -1
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +3 -0
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center.stories.tsx +6 -3
- package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +122 -34
- package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +12 -1
- package/web/.next/standalone/src/presentation/web/lib/layout-with-dagre.ts +1 -1
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/{8c0b96eb95dd31a9.js → 00f6ac2dde225eb7.js} +1 -1
- package/web/.next/static/chunks/631933b137e91fb2.js +10 -0
- package/web/.next/static/chunks/9f8e71029fb04681.js +5 -0
- package/web/.next/static/chunks/b7b7abe79e05b229.css +2 -0
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__77c0dfc4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_285de9aa._.js +0 -3
- package/web/.next/server/chunks/ssr/_285de9aa._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_b1f2507a._.js +0 -10
- package/web/.next/server/chunks/ssr/_b1f2507a._.js.map +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_285de9aa._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_b1f2507a._.js +0 -10
- package/web/.next/static/chunks/36bb03a0314fb990.css +0 -2
- package/web/.next/static/chunks/ac2bd2a7ffc02cd4.js +0 -10
- package/web/.next/static/chunks/fe6427c156bda6b0.js +0 -5
- /package/web/.next/static/{qVAyP83VDRO7ohQMjLw8T → aWm2zr_Js7tN6yFqI9qT-}/_buildManifest.js +0 -0
- /package/web/.next/static/{qVAyP83VDRO7ohQMjLw8T → aWm2zr_Js7tN6yFqI9qT-}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{qVAyP83VDRO7ohQMjLw8T → aWm2zr_Js7tN6yFqI9qT-}/_ssgManifest.js +0 -0
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
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\":\"
|
|
1
|
+
<!DOCTYPE html><!--aWm2zr_Js7tN6yFqI9qT_--><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,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}
|
|
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\":\"aWm2zr_Js7tN6yFqI9qT-\",\"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 \"
|
|
1
|
+
self.__RSC_SERVER_MANIFEST="{\n \"node\": {\n \"40459844faac9c082e4e6fea29516b92fddc0a934b\": {\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 \"408da6b7a6ee0e9b09fd5a50b21083dce6f429d6db\": {\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 \"40bb8c205b18fb5057bc9eb6133872d71964b8668c\": {\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 \"40683fd30978e29fbeede1bea717f38cea70652587\": {\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 \"40f4f47d8a7722cb66ccacd0305edb653ca62a2dd6\": {\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 \"40e580b91517162148760422b4800a66b3cc785fd1\": {\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 \"00143ea16cf13f5b5fcfbf1bbcfc73e4de2df135d8\": {\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 \"4065c17db1bba19dff8bc12012a332fac9e5791584\": {\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 \"403ff303fad2a557ce324b2cddbf2153d394cd4e42\": {\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 \"40f230da4ad222e5beed07f74da236beb38ab6f16c\": {\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 \"40f95ce2d34a1855d071788fb95ef50f0cb3b1669f\": {\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\": \"etr0yFZjXjGlf5N/uuI0cM0vvz+C+m7ClZyNC7DOAGY=\"\n}"
|
package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"node": {
|
|
3
|
-
"
|
|
3
|
+
"40459844faac9c082e4e6fea29516b92fddc0a934b": {
|
|
4
4
|
"workers": {
|
|
5
5
|
"app/page": {
|
|
6
|
-
"moduleId":
|
|
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
|
-
"
|
|
18
|
+
"408da6b7a6ee0e9b09fd5a50b21083dce6f429d6db": {
|
|
19
19
|
"workers": {
|
|
20
20
|
"app/page": {
|
|
21
|
-
"moduleId":
|
|
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
|
-
"
|
|
33
|
+
"40bb8c205b18fb5057bc9eb6133872d71964b8668c": {
|
|
34
34
|
"workers": {
|
|
35
35
|
"app/page": {
|
|
36
|
-
"moduleId":
|
|
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
|
-
"
|
|
48
|
+
"40683fd30978e29fbeede1bea717f38cea70652587": {
|
|
49
49
|
"workers": {
|
|
50
50
|
"app/page": {
|
|
51
|
-
"moduleId":
|
|
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
|
-
"
|
|
63
|
+
"40f4f47d8a7722cb66ccacd0305edb653ca62a2dd6": {
|
|
64
64
|
"workers": {
|
|
65
65
|
"app/page": {
|
|
66
|
-
"moduleId":
|
|
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
|
-
"
|
|
78
|
+
"40e580b91517162148760422b4800a66b3cc785fd1": {
|
|
79
79
|
"workers": {
|
|
80
80
|
"app/page": {
|
|
81
|
-
"moduleId":
|
|
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
|
-
"
|
|
93
|
+
"00143ea16cf13f5b5fcfbf1bbcfc73e4de2df135d8": {
|
|
94
94
|
"workers": {
|
|
95
95
|
"app/page": {
|
|
96
|
-
"moduleId":
|
|
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
|
-
"
|
|
108
|
+
"4065c17db1bba19dff8bc12012a332fac9e5791584": {
|
|
109
109
|
"workers": {
|
|
110
110
|
"app/page": {
|
|
111
|
-
"moduleId":
|
|
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
|
-
"
|
|
123
|
+
"403ff303fad2a557ce324b2cddbf2153d394cd4e42": {
|
|
124
124
|
"workers": {
|
|
125
125
|
"app/page": {
|
|
126
|
-
"moduleId":
|
|
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
|
+
"40f230da4ad222e5beed07f74da236beb38ab6f16c": {
|
|
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
|
+
"40f95ce2d34a1855d071788fb95ef50f0cb3b1669f": {
|
|
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": "
|
|
170
|
+
"encryptionKey": "etr0yFZjXjGlf5N/uuI0cM0vvz+C+m7ClZyNC7DOAGY="
|
|
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
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
const
|
|
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:
|
|
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:
|
|
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
|
-
{
|
|
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'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
|
-
{
|
|
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
|
-
<
|
|
20
|
-
<
|
|
21
|
-
|
|
20
|
+
<AgentEventsProvider>
|
|
21
|
+
<div style={{ height: '100vh' }}>
|
|
22
|
+
<Story />
|
|
23
|
+
</div>
|
|
24
|
+
</AgentEventsProvider>
|
|
22
25
|
),
|
|
23
26
|
],
|
|
24
27
|
};
|