@shepai/cli 1.57.0 → 1.59.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.
- package/dist/src/presentation/web/app/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/page.js +9 -0
- package/dist/src/presentation/web/components/common/add-repository-node/add-repository-button.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/add-repository-node/add-repository-button.js +4 -2
- package/dist/src/presentation/web/components/common/add-repository-node/add-repository-node.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/add-repository-node/add-repository-node.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/add-repository-node/add-repository-node.stories.js +6 -0
- package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.d.ts +5 -0
- package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.js +14 -0
- package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.stories.d.ts +12 -0
- package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.stories.js +20 -0
- package/dist/src/presentation/web/components/common/ci-status-badge/index.d.ts +2 -0
- package/dist/src/presentation/web/components/common/ci-status-badge/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/ci-status-badge/index.js +1 -0
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +13 -2
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts +8 -0
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +41 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +9 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/merge-review/merge-review.js +2 -12
- 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 +9 -0
- 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 +3 -3
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts +0 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +1 -31
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +5 -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/page.js +1 -1
- package/web/.next/server/app/_global-error/page.js.nft.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/server-reference-manifest.json +17 -1
- package/web/.next/server/app/_not-found/page.js +2 -2
- 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/api/dialog/pick-files/route.js +1 -1
- package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
- package/web/.next/server/app/page/server-reference-manifest.json +41 -41
- package/web/.next/server/app/page.js +2 -3
- 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/tools/page/server-reference-manifest.json +17 -1
- package/web/.next/server/app/tools/page.js +2 -2
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +17 -1
- package/web/.next/server/app/version/page.js +2 -2
- 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/{[root-of-the-server]__332c8d91._.js → [root-of-the-server]__a6bf88cc._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__86c7bba5._.js +9 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__86c7bba5._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +12 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -0
- package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__dbd220d2._.js → server/chunks/ssr/[root-of-the-server]__b79b0516._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__dbd220d2._.js.map → [root-of-the-server]__b79b0516._.js.map} +1 -1
- package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__847521e6._.js → server/chunks/ssr/[root-of-the-server]__bced1185._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__847521e6._.js.map → [root-of-the-server]__bced1185._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__757c7912._.js → [root-of-the-server]__f7f90528._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__757c7912._.js.map → [root-of-the-server]__f7f90528._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
- package/web/.next/server/chunks/ssr/{_0e2c2b4f._.js → _027596cf._.js} +2 -2
- package/web/.next/server/chunks/ssr/_027596cf._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- 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 +63 -42
- 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/page.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page.js.nft.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/server-reference-manifest.json +17 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js +2 -2
- 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/api/dialog/pick-files/route.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +41 -41
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +2 -3
- 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/tools/page/server-reference-manifest.json +17 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +17 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js +2 -2
- 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/{[root-of-the-server]__332c8d91._.js → [root-of-the-server]__a6bf88cc._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +4 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__86c7bba5._.js +9 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +12 -0
- package/web/.next/{server/chunks/ssr/[root-of-the-server]__dbd220d2._.js → standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__b79b0516._.js} +2 -2
- package/web/.next/{server/chunks/ssr/[root-of-the-server]__847521e6._.js → standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__bced1185._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__757c7912._.js → [root-of-the-server]__f7f90528._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_0e2c2b4f._.js → _027596cf._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- 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 +63 -42
- package/web/.next/standalone/src/presentation/web/app/page.tsx +9 -0
- package/web/.next/standalone/src/presentation/web/components/common/add-repository-node/add-repository-button.tsx +24 -15
- package/web/.next/standalone/src/presentation/web/components/common/add-repository-node/add-repository-node.stories.tsx +12 -0
- package/web/.next/standalone/src/presentation/web/components/common/ci-status-badge/ci-status-badge.stories.tsx +27 -0
- package/web/.next/standalone/src/presentation/web/components/common/ci-status-badge/ci-status-badge.tsx +29 -0
- package/web/.next/standalone/src/presentation/web/components/common/ci-status-badge/index.ts +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.tsx +53 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +61 -1
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node-state-config.ts +9 -0
- package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.tsx +1 -29
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +10 -0
- package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.stories.tsx +0 -41
- package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +2 -7
- package/web/.next/standalone/src/presentation/web/components/layouts/app-shell/app-shell.tsx +6 -0
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/4f7d89c9e09aed99.js +10 -0
- package/web/.next/static/chunks/{ef237b70209d9853.js → 67459433cc866344.js} +1 -1
- package/web/.next/static/chunks/{7138c478667158d0.js → 6d33cb9af6245c98.js} +1 -1
- package/web/.next/static/chunks/b511c65023ec1889.css +2 -0
- package/web/.next/static/chunks/d85b95e893db08bc.js +1 -0
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js +0 -9
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__48c68a96._.js +0 -12
- package/web/.next/server/chunks/ssr/[root-of-the-server]__48c68a96._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__950afd5e._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__950afd5e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0e2c2b4f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app__not-found_page_actions_a836bb2a.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app__not-found_page_actions_a836bb2a.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_f1dd7791.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_f1dd7791.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_version_page_actions_ea925032.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_version_page_actions_ea925032.js.map +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js +0 -9
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__48c68a96._.js +0 -12
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__950afd5e._.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app__not-found_page_actions_a836bb2a.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_f1dd7791.js +0 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_version_page_actions_ea925032.js +0 -3
- package/web/.next/static/chunks/225de19e886a62ab.js +0 -10
- package/web/.next/static/chunks/4651f20be1a3b7d7.css +0 -2
- package/web/.next/static/chunks/a1f2befd62b321c0.js +0 -1
- /package/web/.next/server/chunks/{[root-of-the-server]__332c8d91._.js.map → [root-of-the-server]__a6bf88cc._.js.map} +0 -0
- /package/web/.next/static/{V2579MPjpJ_hqKjPsmMlR → xjc1tfvwTdK1Xv5Id2oaO}/_buildManifest.js +0 -0
- /package/web/.next/static/{V2579MPjpJ_hqKjPsmMlR → xjc1tfvwTdK1Xv5Id2oaO}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{V2579MPjpJ_hqKjPsmMlR → xjc1tfvwTdK1Xv5Id2oaO}/_ssgManifest.js +0 -0
package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json
CHANGED
|
@@ -1,9 +1,45 @@
|
|
|
1
1
|
{
|
|
2
2
|
"node": {
|
|
3
|
-
"
|
|
3
|
+
"00f283d375a68f16f486b4d96a73d29642d70e2c49": {
|
|
4
|
+
"workers": {
|
|
5
|
+
"app/_not-found/page": {
|
|
6
|
+
"moduleId": 66973,
|
|
7
|
+
"async": false,
|
|
8
|
+
"exportedName": "pickFolder",
|
|
9
|
+
"filename": "src/presentation/web/app/actions/pick-folder.ts"
|
|
10
|
+
},
|
|
11
|
+
"app/page": {
|
|
12
|
+
"moduleId": 16555,
|
|
13
|
+
"async": false,
|
|
14
|
+
"exportedName": "pickFolder",
|
|
15
|
+
"filename": "src/presentation/web/app/actions/pick-folder.ts"
|
|
16
|
+
},
|
|
17
|
+
"app/tools/page": {
|
|
18
|
+
"moduleId": 19036,
|
|
19
|
+
"async": false,
|
|
20
|
+
"exportedName": "pickFolder",
|
|
21
|
+
"filename": "src/presentation/web/app/actions/pick-folder.ts"
|
|
22
|
+
},
|
|
23
|
+
"app/version/page": {
|
|
24
|
+
"moduleId": 86139,
|
|
25
|
+
"async": false,
|
|
26
|
+
"exportedName": "pickFolder",
|
|
27
|
+
"filename": "src/presentation/web/app/actions/pick-folder.ts"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"layer": {
|
|
31
|
+
"app/_not-found/page": "action-browser",
|
|
32
|
+
"app/page": "action-browser",
|
|
33
|
+
"app/tools/page": "action-browser",
|
|
34
|
+
"app/version/page": "action-browser"
|
|
35
|
+
},
|
|
36
|
+
"filename": "src/presentation/web/app/actions/pick-folder.ts",
|
|
37
|
+
"exportedName": "pickFolder"
|
|
38
|
+
},
|
|
39
|
+
"604b2436c25d3184a91e706af2aee635c1ebd4a82d": {
|
|
4
40
|
"workers": {
|
|
5
41
|
"app/page": {
|
|
6
|
-
"moduleId":
|
|
42
|
+
"moduleId": 16555,
|
|
7
43
|
"async": false,
|
|
8
44
|
"exportedName": "approveFeature",
|
|
9
45
|
"filename": "src/presentation/web/app/actions/approve-feature.ts"
|
|
@@ -15,10 +51,10 @@
|
|
|
15
51
|
"filename": "src/presentation/web/app/actions/approve-feature.ts",
|
|
16
52
|
"exportedName": "approveFeature"
|
|
17
53
|
},
|
|
18
|
-
"
|
|
54
|
+
"606b19bfa1c0b5083719b9769235270652970ac528": {
|
|
19
55
|
"workers": {
|
|
20
56
|
"app/page": {
|
|
21
|
-
"moduleId":
|
|
57
|
+
"moduleId": 16555,
|
|
22
58
|
"async": false,
|
|
23
59
|
"exportedName": "rejectFeature",
|
|
24
60
|
"filename": "src/presentation/web/app/actions/reject-feature.ts"
|
|
@@ -30,10 +66,10 @@
|
|
|
30
66
|
"filename": "src/presentation/web/app/actions/reject-feature.ts",
|
|
31
67
|
"exportedName": "rejectFeature"
|
|
32
68
|
},
|
|
33
|
-
"
|
|
69
|
+
"40ab134a3e230ca75ec945b21530996f28478eaebd": {
|
|
34
70
|
"workers": {
|
|
35
71
|
"app/page": {
|
|
36
|
-
"moduleId":
|
|
72
|
+
"moduleId": 16555,
|
|
37
73
|
"async": false,
|
|
38
74
|
"exportedName": "getFeatureArtifact",
|
|
39
75
|
"filename": "src/presentation/web/app/actions/get-feature-artifact.ts"
|
|
@@ -45,10 +81,10 @@
|
|
|
45
81
|
"filename": "src/presentation/web/app/actions/get-feature-artifact.ts",
|
|
46
82
|
"exportedName": "getFeatureArtifact"
|
|
47
83
|
},
|
|
48
|
-
"
|
|
84
|
+
"4089deaf16fedc6a345e56ad7bfc988b487e34eefa": {
|
|
49
85
|
"workers": {
|
|
50
86
|
"app/page": {
|
|
51
|
-
"moduleId":
|
|
87
|
+
"moduleId": 16555,
|
|
52
88
|
"async": false,
|
|
53
89
|
"exportedName": "getResearchArtifact",
|
|
54
90
|
"filename": "src/presentation/web/app/actions/get-research-artifact.ts"
|
|
@@ -60,10 +96,10 @@
|
|
|
60
96
|
"filename": "src/presentation/web/app/actions/get-research-artifact.ts",
|
|
61
97
|
"exportedName": "getResearchArtifact"
|
|
62
98
|
},
|
|
63
|
-
"
|
|
99
|
+
"004b4a427a9b3db7f8002cfc69e453961d25caa5c5": {
|
|
64
100
|
"workers": {
|
|
65
101
|
"app/page": {
|
|
66
|
-
"moduleId":
|
|
102
|
+
"moduleId": 16555,
|
|
67
103
|
"async": false,
|
|
68
104
|
"exportedName": "getWorkflowDefaults",
|
|
69
105
|
"filename": "src/presentation/web/app/actions/get-workflow-defaults.ts"
|
|
@@ -75,10 +111,10 @@
|
|
|
75
111
|
"filename": "src/presentation/web/app/actions/get-workflow-defaults.ts",
|
|
76
112
|
"exportedName": "getWorkflowDefaults"
|
|
77
113
|
},
|
|
78
|
-
"
|
|
114
|
+
"402a4ec8d26f9c9f41e698de41dd62bd38c3094f15": {
|
|
79
115
|
"workers": {
|
|
80
116
|
"app/page": {
|
|
81
|
-
"moduleId":
|
|
117
|
+
"moduleId": 16555,
|
|
82
118
|
"async": false,
|
|
83
119
|
"exportedName": "getMergeReviewData",
|
|
84
120
|
"filename": "src/presentation/web/app/actions/get-merge-review-data.ts"
|
|
@@ -90,10 +126,10 @@
|
|
|
90
126
|
"filename": "src/presentation/web/app/actions/get-merge-review-data.ts",
|
|
91
127
|
"exportedName": "getMergeReviewData"
|
|
92
128
|
},
|
|
93
|
-
"
|
|
129
|
+
"40548f2101be4900dc1959a49650c2e0006397bd9a": {
|
|
94
130
|
"workers": {
|
|
95
131
|
"app/page": {
|
|
96
|
-
"moduleId":
|
|
132
|
+
"moduleId": 16555,
|
|
97
133
|
"async": false,
|
|
98
134
|
"exportedName": "openIde",
|
|
99
135
|
"filename": "src/presentation/web/app/actions/open-ide.ts"
|
|
@@ -105,10 +141,10 @@
|
|
|
105
141
|
"filename": "src/presentation/web/app/actions/open-ide.ts",
|
|
106
142
|
"exportedName": "openIde"
|
|
107
143
|
},
|
|
108
|
-
"
|
|
144
|
+
"40586217019fa643c0babbbde4463a3cc1c92294e3": {
|
|
109
145
|
"workers": {
|
|
110
146
|
"app/page": {
|
|
111
|
-
"moduleId":
|
|
147
|
+
"moduleId": 16555,
|
|
112
148
|
"async": false,
|
|
113
149
|
"exportedName": "openShell",
|
|
114
150
|
"filename": "src/presentation/web/app/actions/open-shell.ts"
|
|
@@ -120,10 +156,10 @@
|
|
|
120
156
|
"filename": "src/presentation/web/app/actions/open-shell.ts",
|
|
121
157
|
"exportedName": "openShell"
|
|
122
158
|
},
|
|
123
|
-
"
|
|
159
|
+
"40515f42aff14843ca67f2bd609b840bdda32955f9": {
|
|
124
160
|
"workers": {
|
|
125
161
|
"app/page": {
|
|
126
|
-
"moduleId":
|
|
162
|
+
"moduleId": 16555,
|
|
127
163
|
"async": false,
|
|
128
164
|
"exportedName": "openFolder",
|
|
129
165
|
"filename": "src/presentation/web/app/actions/open-folder.ts"
|
|
@@ -135,25 +171,10 @@
|
|
|
135
171
|
"filename": "src/presentation/web/app/actions/open-folder.ts",
|
|
136
172
|
"exportedName": "openFolder"
|
|
137
173
|
},
|
|
138
|
-
"
|
|
139
|
-
"workers": {
|
|
140
|
-
"app/page": {
|
|
141
|
-
"moduleId": 4510,
|
|
142
|
-
"async": false,
|
|
143
|
-
"exportedName": "pickFolder",
|
|
144
|
-
"filename": "src/presentation/web/app/actions/pick-folder.ts"
|
|
145
|
-
}
|
|
146
|
-
},
|
|
147
|
-
"layer": {
|
|
148
|
-
"app/page": "action-browser"
|
|
149
|
-
},
|
|
150
|
-
"filename": "src/presentation/web/app/actions/pick-folder.ts",
|
|
151
|
-
"exportedName": "pickFolder"
|
|
152
|
-
},
|
|
153
|
-
"400ce58b45c3a6d27dc5430fab6ff5d608fdf9d798": {
|
|
174
|
+
"40d08b0d92d2b703d3db56e765e35375751ac01684": {
|
|
154
175
|
"workers": {
|
|
155
176
|
"app/page": {
|
|
156
|
-
"moduleId":
|
|
177
|
+
"moduleId": 16555,
|
|
157
178
|
"async": false,
|
|
158
179
|
"exportedName": "createFeature",
|
|
159
180
|
"filename": "src/presentation/web/app/actions/create-feature.ts"
|
|
@@ -165,10 +186,10 @@
|
|
|
165
186
|
"filename": "src/presentation/web/app/actions/create-feature.ts",
|
|
166
187
|
"exportedName": "createFeature"
|
|
167
188
|
},
|
|
168
|
-
"
|
|
189
|
+
"4041951039830c9a9b9643f88550f93dec377c5f3f": {
|
|
169
190
|
"workers": {
|
|
170
191
|
"app/page": {
|
|
171
|
-
"moduleId":
|
|
192
|
+
"moduleId": 16555,
|
|
172
193
|
"async": false,
|
|
173
194
|
"exportedName": "deleteFeature",
|
|
174
195
|
"filename": "src/presentation/web/app/actions/delete-feature.ts"
|
|
@@ -180,10 +201,10 @@
|
|
|
180
201
|
"filename": "src/presentation/web/app/actions/delete-feature.ts",
|
|
181
202
|
"exportedName": "deleteFeature"
|
|
182
203
|
},
|
|
183
|
-
"
|
|
204
|
+
"40fbe3ea2311abba27bc48c26f5508fb7025e4f58a": {
|
|
184
205
|
"workers": {
|
|
185
206
|
"app/page": {
|
|
186
|
-
"moduleId":
|
|
207
|
+
"moduleId": 16555,
|
|
187
208
|
"async": false,
|
|
188
209
|
"exportedName": "addRepository",
|
|
189
210
|
"filename": "src/presentation/web/app/actions/add-repository.ts"
|
|
@@ -195,10 +216,10 @@
|
|
|
195
216
|
"filename": "src/presentation/web/app/actions/add-repository.ts",
|
|
196
217
|
"exportedName": "addRepository"
|
|
197
218
|
},
|
|
198
|
-
"
|
|
219
|
+
"404aff2a63b14ad2f9b6417055e6f2ba87fe90e911": {
|
|
199
220
|
"workers": {
|
|
200
221
|
"app/page": {
|
|
201
|
-
"moduleId":
|
|
222
|
+
"moduleId": 16555,
|
|
202
223
|
"async": false,
|
|
203
224
|
"exportedName": "deleteRepository",
|
|
204
225
|
"filename": "src/presentation/web/app/actions/delete-repository.ts"
|
|
@@ -212,5 +233,5 @@
|
|
|
212
233
|
}
|
|
213
234
|
},
|
|
214
235
|
"edge": {},
|
|
215
|
-
"encryptionKey": "
|
|
236
|
+
"encryptionKey": "/62RwJFHaetWcHvJhUZemNYnHwGJ6+ItihS+zZR0WQw="
|
|
216
237
|
}
|
|
@@ -104,6 +104,15 @@ export default async function HomePage() {
|
|
|
104
104
|
...(run?.agentType && { agentType: run.agentType as FeatureNodeData['agentType'] }),
|
|
105
105
|
...(run?.error && { errorMessage: run.error }),
|
|
106
106
|
...(blockedBy && { blockedBy }),
|
|
107
|
+
...(feature.pr && {
|
|
108
|
+
pr: {
|
|
109
|
+
url: feature.pr.url,
|
|
110
|
+
number: feature.pr.number,
|
|
111
|
+
status: feature.pr.status,
|
|
112
|
+
ciStatus: feature.pr.ciStatus,
|
|
113
|
+
commitHash: feature.pr.commitHash,
|
|
114
|
+
},
|
|
115
|
+
}),
|
|
107
116
|
};
|
|
108
117
|
|
|
109
118
|
const featureNodeId = `feat-${feature.id}`;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import { useState } from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { FolderPlus, Loader2 } from 'lucide-react';
|
|
5
|
+
import { Button } from '@/components/ui/button';
|
|
6
|
+
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
|
|
5
7
|
import { pickFolder } from './pick-folder';
|
|
6
8
|
|
|
7
9
|
interface AddRepositoryButtonProps {
|
|
@@ -25,19 +27,26 @@ export function AddRepositoryButton({ onSelect }: AddRepositoryButtonProps) {
|
|
|
25
27
|
}
|
|
26
28
|
|
|
27
29
|
return (
|
|
28
|
-
<
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
30
|
+
<TooltipProvider>
|
|
31
|
+
<Tooltip>
|
|
32
|
+
<TooltipTrigger asChild>
|
|
33
|
+
<Button
|
|
34
|
+
variant="ghost"
|
|
35
|
+
size="icon"
|
|
36
|
+
aria-label="Add Repository"
|
|
37
|
+
data-testid="add-repository-button"
|
|
38
|
+
onClick={handleClick}
|
|
39
|
+
disabled={loading}
|
|
40
|
+
>
|
|
41
|
+
{loading ? (
|
|
42
|
+
<Loader2 className="h-5 w-5 animate-spin" />
|
|
43
|
+
) : (
|
|
44
|
+
<FolderPlus className="h-5 w-5" />
|
|
45
|
+
)}
|
|
46
|
+
</Button>
|
|
47
|
+
</TooltipTrigger>
|
|
48
|
+
<TooltipContent>Add Repository</TooltipContent>
|
|
49
|
+
</Tooltip>
|
|
50
|
+
</TooltipProvider>
|
|
42
51
|
);
|
|
43
52
|
}
|
|
@@ -2,6 +2,7 @@ import { useMemo } from 'react';
|
|
|
2
2
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
3
|
import { ReactFlowProvider, ReactFlow } from '@xyflow/react';
|
|
4
4
|
import { AddRepositoryNode } from './add-repository-node';
|
|
5
|
+
import { AddRepositoryButton } from './add-repository-button';
|
|
5
6
|
import type { AddRepositoryNodeData, AddRepositoryNodeType } from './add-repository-node-config';
|
|
6
7
|
|
|
7
8
|
const nodeTypes = { addRepositoryNode: AddRepositoryNode };
|
|
@@ -56,3 +57,14 @@ export const WithCallback: Story = {
|
|
|
56
57
|
},
|
|
57
58
|
render: (args) => <AddRepositoryNodeCanvas data={args} />,
|
|
58
59
|
};
|
|
60
|
+
|
|
61
|
+
// --- Add Repository Button (top bar icon) stories ---
|
|
62
|
+
|
|
63
|
+
/** Add Repository button as it appears in the top bar alongside other toggles */
|
|
64
|
+
export const TopBarButton: StoryObj = {
|
|
65
|
+
render: () => (
|
|
66
|
+
<div className="flex gap-1">
|
|
67
|
+
<AddRepositoryButton onSelect={() => undefined} />
|
|
68
|
+
</div>
|
|
69
|
+
),
|
|
70
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { CiStatus } from '@shepai/core/domain/generated/output';
|
|
3
|
+
import { CiStatusBadge } from './ci-status-badge';
|
|
4
|
+
|
|
5
|
+
const meta: Meta<typeof CiStatusBadge> = {
|
|
6
|
+
title: 'Common/CiStatusBadge',
|
|
7
|
+
component: CiStatusBadge,
|
|
8
|
+
tags: ['autodocs'],
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export default meta;
|
|
12
|
+
type Story = StoryObj<typeof CiStatusBadge>;
|
|
13
|
+
|
|
14
|
+
/** CI passed — green badge with check icon. */
|
|
15
|
+
export const Success: Story = {
|
|
16
|
+
args: { status: CiStatus.Success },
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/** CI pending — yellow badge with animated spinner. */
|
|
20
|
+
export const Pending: Story = {
|
|
21
|
+
args: { status: CiStatus.Pending },
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/** CI failed — red badge with X icon. */
|
|
25
|
+
export const Failure: Story = {
|
|
26
|
+
args: { status: CiStatus.Failure },
|
|
27
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { CheckCircle2, Loader2, XCircle } from 'lucide-react';
|
|
2
|
+
import { CiStatus } from '@shepai/core/domain/generated/output';
|
|
3
|
+
import { Badge } from '@/components/ui/badge';
|
|
4
|
+
|
|
5
|
+
export function CiStatusBadge({ status }: { status: CiStatus }) {
|
|
6
|
+
switch (status) {
|
|
7
|
+
case CiStatus.Success:
|
|
8
|
+
return (
|
|
9
|
+
<Badge className="border-transparent bg-green-50 text-green-700 hover:bg-green-50">
|
|
10
|
+
<CheckCircle2 className="mr-1 h-3.5 w-3.5" />
|
|
11
|
+
Passing
|
|
12
|
+
</Badge>
|
|
13
|
+
);
|
|
14
|
+
case CiStatus.Pending:
|
|
15
|
+
return (
|
|
16
|
+
<Badge className="border-transparent bg-yellow-50 text-yellow-700 hover:bg-yellow-50">
|
|
17
|
+
<Loader2 className="mr-1 h-3.5 w-3.5 animate-spin" />
|
|
18
|
+
Pending
|
|
19
|
+
</Badge>
|
|
20
|
+
);
|
|
21
|
+
case CiStatus.Failure:
|
|
22
|
+
return (
|
|
23
|
+
<Badge className="border-transparent bg-red-50 text-red-700 hover:bg-red-50">
|
|
24
|
+
<XCircle className="mr-1 h-3.5 w-3.5" />
|
|
25
|
+
Failing
|
|
26
|
+
</Badge>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CiStatusBadge } from './ci-status-badge';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { useState } from 'react';
|
|
2
2
|
import type { Meta, StoryObj } from '@storybook/react';
|
|
3
|
+
import { PrStatus, CiStatus } from '@shepai/core/domain/generated/output';
|
|
3
4
|
import { FeatureDrawer } from './feature-drawer';
|
|
4
5
|
import type { FeatureNodeData } from '@/components/common/feature-node';
|
|
5
6
|
import type { FeatureLifecyclePhase, FeatureNodeState } from '@/components/common/feature-node';
|
|
@@ -353,3 +354,55 @@ export const DeletingState: Story = {
|
|
|
353
354
|
export const DeleteRunningAgent: Story = {
|
|
354
355
|
render: () => <DrawerTriggerWithDelete data={runningData} label="Open Running Agent Delete" />,
|
|
355
356
|
};
|
|
357
|
+
|
|
358
|
+
/* ---------------------------------------------------------------------------
|
|
359
|
+
* PR info stories
|
|
360
|
+
* ------------------------------------------------------------------------- */
|
|
361
|
+
|
|
362
|
+
const doneWithPrData: FeatureNodeData = {
|
|
363
|
+
...doneData,
|
|
364
|
+
pr: {
|
|
365
|
+
url: 'https://github.com/org/repo/pull/42',
|
|
366
|
+
number: 42,
|
|
367
|
+
status: PrStatus.Merged,
|
|
368
|
+
ciStatus: CiStatus.Success,
|
|
369
|
+
commitHash: 'abc1234567890def',
|
|
370
|
+
},
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
const doneWithPartialPrData: FeatureNodeData = {
|
|
374
|
+
...doneData,
|
|
375
|
+
pr: {
|
|
376
|
+
url: 'https://github.com/org/repo/pull/99',
|
|
377
|
+
number: 99,
|
|
378
|
+
status: PrStatus.Merged,
|
|
379
|
+
},
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
/** Done feature with full PR card — number, status, CI, commit hash. */
|
|
383
|
+
export const DoneWithPr: Story = {
|
|
384
|
+
render: () => <DrawerTrigger data={doneWithPrData} label="Open Done + PR" />,
|
|
385
|
+
};
|
|
386
|
+
|
|
387
|
+
/** Done feature with partial PR data — no CI status, no commit hash. */
|
|
388
|
+
export const DoneWithPartialPr: Story = {
|
|
389
|
+
render: () => <DrawerTrigger data={doneWithPartialPrData} label="Open Done + Partial PR" />,
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
/** PR with Open status — blue badge. */
|
|
393
|
+
export const PrStatusOpen: Story = {
|
|
394
|
+
render: () => (
|
|
395
|
+
<DrawerTrigger
|
|
396
|
+
data={{
|
|
397
|
+
...doneWithPrData,
|
|
398
|
+
pr: { ...doneWithPrData.pr!, status: PrStatus.Open, ciStatus: CiStatus.Pending },
|
|
399
|
+
}}
|
|
400
|
+
label="Open PR Status: Open"
|
|
401
|
+
/>
|
|
402
|
+
),
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
/** PR with Merged status — purple badge. */
|
|
406
|
+
export const PrStatusMerged: Story = {
|
|
407
|
+
render: () => <DrawerTrigger data={doneWithPrData} label="Open PR Status: Merged" />,
|
|
408
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { XIcon, Loader2, Trash2 } from 'lucide-react';
|
|
3
|
+
import { XIcon, Loader2, Trash2, ExternalLink, GitCommitHorizontal } from 'lucide-react';
|
|
4
|
+
import { PrStatus } from '@shepai/core/domain/generated/output';
|
|
4
5
|
import { cn } from '@/lib/utils';
|
|
5
6
|
import { OpenActionMenu } from '@/components/common/open-action-menu';
|
|
6
7
|
import {
|
|
@@ -11,6 +12,7 @@ import {
|
|
|
11
12
|
DrawerDescription,
|
|
12
13
|
} from '@/components/ui/drawer';
|
|
13
14
|
import { Button } from '@/components/ui/button';
|
|
15
|
+
import { Badge } from '@/components/ui/badge';
|
|
14
16
|
import { Separator } from '@/components/ui/separator';
|
|
15
17
|
import { CometSpinner } from '@/components/ui/comet-spinner';
|
|
16
18
|
import {
|
|
@@ -24,6 +26,7 @@ import {
|
|
|
24
26
|
AlertDialogTitle,
|
|
25
27
|
AlertDialogTrigger,
|
|
26
28
|
} from '@/components/ui/alert-dialog';
|
|
29
|
+
import { CiStatusBadge } from '@/components/common/ci-status-badge';
|
|
27
30
|
import { featureNodeStateConfig, lifecycleDisplayLabels } from '@/components/common/feature-node';
|
|
28
31
|
import type { FeatureNodeData } from '@/components/common/feature-node';
|
|
29
32
|
import { useFeatureActions } from './use-feature-actions';
|
|
@@ -108,6 +111,14 @@ export function FeatureDrawer({
|
|
|
108
111
|
) : null}
|
|
109
112
|
</div>
|
|
110
113
|
|
|
114
|
+
{/* PR info */}
|
|
115
|
+
{selectedNode.pr ? (
|
|
116
|
+
<>
|
|
117
|
+
<Separator />
|
|
118
|
+
<PrInfoSection pr={selectedNode.pr} />
|
|
119
|
+
</>
|
|
120
|
+
) : null}
|
|
121
|
+
|
|
111
122
|
<Separator />
|
|
112
123
|
|
|
113
124
|
{/* Details */}
|
|
@@ -213,6 +224,55 @@ function DetailRow({ label, value }: { label: string; value: string }) {
|
|
|
213
224
|
);
|
|
214
225
|
}
|
|
215
226
|
|
|
227
|
+
const prStatusStyles: Record<PrStatus, string> = {
|
|
228
|
+
[PrStatus.Open]: 'border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50',
|
|
229
|
+
[PrStatus.Merged]: 'border-transparent bg-purple-50 text-purple-700 hover:bg-purple-50',
|
|
230
|
+
[PrStatus.Closed]: 'border-transparent bg-red-50 text-red-700 hover:bg-red-50',
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
function PrInfoSection({ pr }: { pr: NonNullable<FeatureNodeData['pr']> }) {
|
|
234
|
+
return (
|
|
235
|
+
<div data-testid="feature-drawer-pr" className="border-border mx-4 rounded-lg border">
|
|
236
|
+
<div className="space-y-3 px-4 py-3">
|
|
237
|
+
{/* PR number + link */}
|
|
238
|
+
<div className="flex items-center justify-between">
|
|
239
|
+
<a
|
|
240
|
+
href={pr.url}
|
|
241
|
+
target="_blank"
|
|
242
|
+
rel="noopener noreferrer"
|
|
243
|
+
className="text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2"
|
|
244
|
+
>
|
|
245
|
+
PR #{pr.number}
|
|
246
|
+
<ExternalLink className="h-3.5 w-3.5" />
|
|
247
|
+
</a>
|
|
248
|
+
<Badge className={prStatusStyles[pr.status]}>{pr.status}</Badge>
|
|
249
|
+
</div>
|
|
250
|
+
|
|
251
|
+
{/* CI status */}
|
|
252
|
+
{pr.ciStatus ? (
|
|
253
|
+
<div className="flex items-center justify-between">
|
|
254
|
+
<span className="text-muted-foreground text-xs font-medium">CI Status</span>
|
|
255
|
+
<CiStatusBadge status={pr.ciStatus} />
|
|
256
|
+
</div>
|
|
257
|
+
) : null}
|
|
258
|
+
|
|
259
|
+
{/* Commit hash */}
|
|
260
|
+
{pr.commitHash ? (
|
|
261
|
+
<div className="flex items-center justify-between">
|
|
262
|
+
<span className="text-muted-foreground text-xs font-medium">Commit</span>
|
|
263
|
+
<div className="flex items-center gap-1.5">
|
|
264
|
+
<GitCommitHorizontal className="text-muted-foreground h-3.5 w-3.5" />
|
|
265
|
+
<code className="bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]">
|
|
266
|
+
{pr.commitHash.slice(0, 7)}
|
|
267
|
+
</code>
|
|
268
|
+
</div>
|
|
269
|
+
</div>
|
|
270
|
+
) : null}
|
|
271
|
+
</div>
|
|
272
|
+
</div>
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
|
|
216
276
|
function DrawerActions({
|
|
217
277
|
repositoryPath,
|
|
218
278
|
branch,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Loader2, CircleAlert, CircleCheck, Ban, CircleX, type LucideIcon } from 'lucide-react';
|
|
2
2
|
import type { Node } from '@xyflow/react';
|
|
3
|
+
import type { PrStatus, CiStatus } from '@shepai/core/domain/generated/output';
|
|
3
4
|
import type { AgentTypeValue } from './agent-type-icons';
|
|
4
5
|
|
|
5
6
|
export type FeatureNodeState =
|
|
@@ -60,6 +61,14 @@ export interface FeatureNodeData {
|
|
|
60
61
|
errorMessage?: string;
|
|
61
62
|
/** Agent executor type (e.g. "claude-code", "cursor"). */
|
|
62
63
|
agentType?: AgentTypeValue;
|
|
64
|
+
/** PR metadata for features with an associated pull request */
|
|
65
|
+
pr?: {
|
|
66
|
+
url: string;
|
|
67
|
+
number: number;
|
|
68
|
+
status: PrStatus;
|
|
69
|
+
ciStatus?: CiStatus;
|
|
70
|
+
commitHash?: string;
|
|
71
|
+
};
|
|
63
72
|
onAction?: () => void;
|
|
64
73
|
onSettings?: () => void;
|
|
65
74
|
showHandles?: boolean;
|
package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.tsx
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
3
|
import {
|
|
4
|
-
CheckCircle2,
|
|
5
4
|
ExternalLink,
|
|
6
5
|
GitMerge,
|
|
7
6
|
Loader2,
|
|
8
|
-
XCircle,
|
|
9
7
|
AlertTriangle,
|
|
10
8
|
FileDiff,
|
|
11
9
|
GitCommitHorizontal,
|
|
@@ -13,37 +11,11 @@ import {
|
|
|
13
11
|
ArrowRight,
|
|
14
12
|
Layers,
|
|
15
13
|
} from 'lucide-react';
|
|
16
|
-
import { CiStatus } from '@shepai/core/domain/generated/output';
|
|
17
14
|
import { Badge } from '@/components/ui/badge';
|
|
15
|
+
import { CiStatusBadge } from '@/components/common/ci-status-badge';
|
|
18
16
|
import { DrawerActionBar } from '@/components/common/drawer-action-bar';
|
|
19
17
|
import type { MergeReviewProps, MergeReviewPhase } from './merge-review-config';
|
|
20
18
|
|
|
21
|
-
function CiStatusBadge({ status }: { status: CiStatus }) {
|
|
22
|
-
switch (status) {
|
|
23
|
-
case CiStatus.Success:
|
|
24
|
-
return (
|
|
25
|
-
<Badge className="border-transparent bg-green-50 text-green-700 hover:bg-green-50">
|
|
26
|
-
<CheckCircle2 className="mr-1 h-3.5 w-3.5" />
|
|
27
|
-
Passing
|
|
28
|
-
</Badge>
|
|
29
|
-
);
|
|
30
|
-
case CiStatus.Pending:
|
|
31
|
-
return (
|
|
32
|
-
<Badge className="border-transparent bg-yellow-50 text-yellow-700 hover:bg-yellow-50">
|
|
33
|
-
<Loader2 className="mr-1 h-3.5 w-3.5 animate-spin" />
|
|
34
|
-
Pending
|
|
35
|
-
</Badge>
|
|
36
|
-
);
|
|
37
|
-
case CiStatus.Failure:
|
|
38
|
-
return (
|
|
39
|
-
<Badge className="border-transparent bg-red-50 text-red-700 hover:bg-red-50">
|
|
40
|
-
<XCircle className="mr-1 h-3.5 w-3.5" />
|
|
41
|
-
Failing
|
|
42
|
-
</Badge>
|
|
43
|
-
);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
19
|
function PhaseList({ phases }: { phases: MergeReviewPhase[] }) {
|
|
48
20
|
return (
|
|
49
21
|
<div className="border-border rounded-lg border">
|
|
@@ -329,6 +329,16 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
|
|
|
329
329
|
return () => window.removeEventListener('shep:open-create-drawer', handler);
|
|
330
330
|
}, [handleAddFeature]);
|
|
331
331
|
|
|
332
|
+
// Listen for global "add repository" events from the top bar button
|
|
333
|
+
useEffect(() => {
|
|
334
|
+
const handler = (e: Event) => {
|
|
335
|
+
const path = (e as CustomEvent<{ path: string }>).detail.path;
|
|
336
|
+
handleAddRepository(path);
|
|
337
|
+
};
|
|
338
|
+
window.addEventListener('shep:add-repository', handler);
|
|
339
|
+
return () => window.removeEventListener('shep:add-repository', handler);
|
|
340
|
+
}, [handleAddRepository]);
|
|
341
|
+
|
|
332
342
|
// Listen for notification "Review" clicks to open the relevant drawer
|
|
333
343
|
useEffect(() => {
|
|
334
344
|
const handler = (e: Event) => {
|
|
@@ -608,44 +608,3 @@ export const InteractiveWithRepository: Story = {
|
|
|
608
608
|
onRepositoryAdd: () => undefined,
|
|
609
609
|
},
|
|
610
610
|
};
|
|
611
|
-
|
|
612
|
-
// Story to visually verify the Add Repository button does not overlap the ThemeToggle.
|
|
613
|
-
// The simulated ThemeToggle (top-3 right-3, 40×40 px) is rendered as an overlay so
|
|
614
|
-
// reviewers can confirm the mr-16 (64 px) gap keeps the Panel clear of the toggle zone.
|
|
615
|
-
export const AddRepositoryButtonClearanceCheck: Story = {
|
|
616
|
-
decorators: [
|
|
617
|
-
(Story) => (
|
|
618
|
-
<div style={{ height: '100vh', position: 'relative' }}>
|
|
619
|
-
<Story />
|
|
620
|
-
{/* Simulated ThemeToggle at top-3 right-3 (same position as AppShell) */}
|
|
621
|
-
<div
|
|
622
|
-
style={{
|
|
623
|
-
position: 'absolute',
|
|
624
|
-
top: 12,
|
|
625
|
-
right: 12,
|
|
626
|
-
width: 40,
|
|
627
|
-
height: 40,
|
|
628
|
-
background: 'rgba(255, 0, 0, 0.35)',
|
|
629
|
-
border: '2px dashed red',
|
|
630
|
-
borderRadius: 6,
|
|
631
|
-
display: 'flex',
|
|
632
|
-
alignItems: 'center',
|
|
633
|
-
justifyContent: 'center',
|
|
634
|
-
fontSize: 10,
|
|
635
|
-
pointerEvents: 'none',
|
|
636
|
-
zIndex: 50,
|
|
637
|
-
}}
|
|
638
|
-
>
|
|
639
|
-
Theme
|
|
640
|
-
</div>
|
|
641
|
-
</div>
|
|
642
|
-
),
|
|
643
|
-
],
|
|
644
|
-
args: {
|
|
645
|
-
nodes: repoFeatureNodes,
|
|
646
|
-
edges: repoFeatureEdges,
|
|
647
|
-
onNodeAction: () => undefined,
|
|
648
|
-
onNodeSettings: () => undefined,
|
|
649
|
-
onRepositorySelect: () => undefined,
|
|
650
|
-
},
|
|
651
|
-
};
|