@shepai/cli 1.73.1 → 1.74.0-pr226.8985ba7
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/actions/create-feature.d.ts +1 -2
- package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/create-feature.js +6 -10
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +1 -2
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +4 -9
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +7 -8
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +12 -15
- 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 +6 -1
- package/dist/src/presentation/web/components/features/features-canvas/dependency-edge.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/dependency-edge.stories.js +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +5 -2
- 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 +14 -5
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts +2 -0
- 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 +16 -0
- package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts +11 -0
- package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/use-viewport-persistence.js +64 -0
- 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/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +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 +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- 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 +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.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]__45dbf93d._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
- package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_5024c80d._.js → _165a711c._.js} +3 -3
- package/web/.next/server/chunks/ssr/{_5024c80d._.js.map → _165a711c._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
- package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
- package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
- package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -4
- package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -4
- package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.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 +22 -22
- 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/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +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 +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/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- 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 +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/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
- 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]__45dbf93d._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_5024c80d._.js → _165a711c._.js} +3 -3
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.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 +22 -22
- package/web/.next/standalone/src/presentation/web/app/actions/create-feature.ts +7 -18
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx +16 -15
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +12 -31
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +18 -1
- package/web/.next/standalone/src/presentation/web/components/features/features-canvas/dependency-edge.stories.tsx +1 -0
- package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.stories.tsx +18 -0
- package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +33 -6
- package/web/.next/standalone/src/presentation/web/hooks/use-viewport-persistence.ts +79 -0
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/{0acf10ef003e9399.js → 0efb4eebe8e287d6.js} +1 -1
- package/web/.next/static/chunks/{59a74c7dda3d6bb1.js → 32e5da584b2ee731.js} +1 -1
- package/web/.next/static/chunks/{66c3cc54f61b0683.js → 571e15176854c4e5.js} +1 -1
- package/web/.next/static/chunks/{a36a9b78fa84bfd9.js → 5b6ecf78282b255f.js} +1 -1
- package/web/.next/static/chunks/{c6904f5b67ddbcc0.js → 64735b1b52b1da19.js} +2 -2
- package/web/.next/static/chunks/{403ed451ae4f0fce.js → 6a1a0ba49a68bbe1.js} +1 -1
- package/web/.next/static/chunks/{fa3f61d528918657.js → 8be2936957914955.js} +1 -1
- package/web/.next/static/chunks/a2d555fed8db6a7b.js +1 -0
- package/web/.next/static/chunks/{46b663a9110c6602.js → dbda0b3e20712ad2.js} +1 -1
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/static/chunks/4093f165b5f2cc3e.js +0 -1
- /package/web/.next/static/{aNoBruNQb2aXRBW0KalUh → 9zQ15Z-LG-2oWOuc-wpQh}/_buildManifest.js +0 -0
- /package/web/.next/static/{aNoBruNQb2aXRBW0KalUh → 9zQ15Z-LG-2oWOuc-wpQh}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{aNoBruNQb2aXRBW0KalUh → 9zQ15Z-LG-2oWOuc-wpQh}/_ssgManifest.js +0 -0
|
@@ -16,8 +16,7 @@ import { DrawerCloseGuardProvider } from '@/hooks/drawer-close-guard';
|
|
|
16
16
|
* create a new feature in the Control Center.
|
|
17
17
|
*
|
|
18
18
|
* ### Form sections
|
|
19
|
-
* - **
|
|
20
|
-
* - **Description** (optional) — multi-line textarea
|
|
19
|
+
* - **Description** (required) — multi-line textarea, submit is disabled when empty
|
|
21
20
|
* - **Auto Approve** — Tri-state parent checkbox with 3 child checkboxes (PRD, Plan, Merge).
|
|
22
21
|
* Parent shows indeterminate when some children are selected, checks/unchecks all on click.
|
|
23
22
|
* - **Attachments** (optional) — native OS file picker with extension-based icon system:
|
|
@@ -29,12 +28,12 @@ import { DrawerCloseGuardProvider } from '@/hooks/drawer-close-guard';
|
|
|
29
28
|
* |------|------|-------------|
|
|
30
29
|
* | `open` | `boolean` | Controls drawer visibility |
|
|
31
30
|
* | `onClose` | `() => void` | Called on dismiss (close button, cancel, or backdrop) |
|
|
32
|
-
* | `onSubmit` | `(data: FeatureCreatePayload) => void` | Called with `{
|
|
31
|
+
* | `onSubmit` | `(data: FeatureCreatePayload) => void` | Called with `{ description, attachments, repositoryPath, approvalGates }` |
|
|
33
32
|
* | `repositoryPath` | `string` | Repository path (mandatory) included in the submitted data |
|
|
34
33
|
*
|
|
35
34
|
* ### Behavior
|
|
36
|
-
* - Form resets (
|
|
37
|
-
* - Submit button is disabled when
|
|
35
|
+
* - Form resets (description, attachments, checkboxes) when the drawer closes
|
|
36
|
+
* - Submit button is disabled when description is empty
|
|
38
37
|
* - `approvalGates` always included: `{ allowPrd, allowPlan, allowMerge }` (all false by default)
|
|
39
38
|
* - Non-modal (`modal={false}`) — canvas stays interactive behind the drawer
|
|
40
39
|
* - Fixed width: 448px (`w-xl`) — matches review drawers (PRD, Plan, Merge)
|
|
@@ -66,7 +65,7 @@ const meta: Meta<typeof FeatureCreateDrawer> = {
|
|
|
66
65
|
},
|
|
67
66
|
onSubmit: {
|
|
68
67
|
description:
|
|
69
|
-
'Callback fired with `FeatureCreatePayload` when the form is submitted. Receives `{
|
|
68
|
+
'Callback fired with `FeatureCreatePayload` when the form is submitted. Receives `{ description, attachments, repositoryPath, approvalGates }`.',
|
|
70
69
|
},
|
|
71
70
|
repositoryPath: {
|
|
72
71
|
control: 'text',
|
|
@@ -131,7 +130,7 @@ export const Default: Story = {
|
|
|
131
130
|
};
|
|
132
131
|
|
|
133
132
|
/**
|
|
134
|
-
* Pre-filled form — click to open, then
|
|
133
|
+
* Pre-filled form — click to open, then description is typed in.
|
|
135
134
|
* Demonstrates the form in a "ready to submit" state.
|
|
136
135
|
*/
|
|
137
136
|
export const PreFilled: Story = {
|
|
@@ -142,10 +141,10 @@ export const PreFilled: Story = {
|
|
|
142
141
|
|
|
143
142
|
// Drawer renders in a portal — query from document body
|
|
144
143
|
const body = within(canvasElement.ownerDocument.body);
|
|
145
|
-
const
|
|
146
|
-
|
|
144
|
+
const descInput = await body.findByPlaceholderText(
|
|
145
|
+
'e.g. Add GitHub OAuth login with callback handling and token refresh...'
|
|
146
|
+
);
|
|
147
147
|
|
|
148
|
-
await userEvent.type(nameInput, 'GitHub OAuth Login');
|
|
149
148
|
await userEvent.type(
|
|
150
149
|
descInput,
|
|
151
150
|
'Implement OAuth2 authentication with GitHub as the identity provider. Includes login, callback handling, and token refresh.'
|
|
@@ -154,8 +153,8 @@ export const PreFilled: Story = {
|
|
|
154
153
|
};
|
|
155
154
|
|
|
156
155
|
/**
|
|
157
|
-
* Validation state — open the drawer with an empty
|
|
158
|
-
* The "+ Create Feature" button is disabled because
|
|
156
|
+
* Validation state — open the drawer with an empty description field.
|
|
157
|
+
* The "+ Create Feature" button is disabled because description validation fails.
|
|
159
158
|
*/
|
|
160
159
|
export const ValidationDisabled: Story = {
|
|
161
160
|
render: () => <CreateDrawerTrigger label="Open Validation Demo" />,
|
|
@@ -312,7 +311,7 @@ export const WithWorkflowDefaults: Story = {
|
|
|
312
311
|
* and click "Add Files" to attach files via the native OS file picker.
|
|
313
312
|
*
|
|
314
313
|
* **Submitted data** is displayed in a styled panel showing `FeatureCreatePayload`
|
|
315
|
-
* with `{
|
|
314
|
+
* with `{ description, attachments, repositoryPath, approvalGates }`.
|
|
316
315
|
*
|
|
317
316
|
* In Storybook, the native picker won't work (no backend), but submitted data
|
|
318
317
|
* would show the paths if files were attached programmatically.
|
|
@@ -369,8 +368,10 @@ export const DiscardConfirmation: Story = {
|
|
|
369
368
|
await userEvent.click(canvas.getByRole('button', { name: 'Open (Discard Confirmation)' }));
|
|
370
369
|
|
|
371
370
|
const body = within(canvasElement.ownerDocument.body);
|
|
372
|
-
const
|
|
373
|
-
|
|
371
|
+
const descInput = await body.findByPlaceholderText(
|
|
372
|
+
'e.g. Add GitHub OAuth login with callback handling and token refresh...'
|
|
373
|
+
);
|
|
374
|
+
await userEvent.type(descInput, 'My Feature');
|
|
374
375
|
|
|
375
376
|
// Click Cancel — should show the discard confirmation dialog
|
|
376
377
|
const cancelButton = body.getByRole('button', { name: 'Cancel' });
|
|
@@ -38,8 +38,7 @@ export interface ParentFeatureOption {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
export interface FeatureCreatePayload {
|
|
41
|
-
|
|
42
|
-
description?: string;
|
|
41
|
+
description: string;
|
|
43
42
|
attachments: FileAttachment[];
|
|
44
43
|
repositoryPath: string;
|
|
45
44
|
approvalGates: {
|
|
@@ -92,7 +91,6 @@ export function FeatureCreateDrawer({
|
|
|
92
91
|
const defaultPush = workflowDefaults?.push ?? false;
|
|
93
92
|
const defaultOpenPr = workflowDefaults?.openPr ?? false;
|
|
94
93
|
|
|
95
|
-
const [name, setName] = useState('');
|
|
96
94
|
const [description, setDescription] = useState('');
|
|
97
95
|
const [attachments, setAttachments] = useState<FileAttachment[]>([]);
|
|
98
96
|
const [approvalGates, setApprovalGates] = useState<Record<string, boolean>>({ ...defaultGates });
|
|
@@ -117,7 +115,6 @@ export function FeatureCreateDrawer({
|
|
|
117
115
|
}, [open, initialParentId]);
|
|
118
116
|
|
|
119
117
|
const resetForm = useCallback(() => {
|
|
120
|
-
setName('');
|
|
121
118
|
setDescription('');
|
|
122
119
|
setAttachments([]);
|
|
123
120
|
setApprovalGates({ ...defaultGates });
|
|
@@ -127,7 +124,7 @@ export function FeatureCreateDrawer({
|
|
|
127
124
|
}, [defaultGates, defaultPush, defaultOpenPr]);
|
|
128
125
|
|
|
129
126
|
// Track whether the form has unsaved data
|
|
130
|
-
const isDirty =
|
|
127
|
+
const isDirty = description.trim() !== '' || attachments.length > 0;
|
|
131
128
|
|
|
132
129
|
// Shared close guard — shows confirmation when dirty, prevents navigation
|
|
133
130
|
const { attemptClose } = useGuardedDrawerClose({ open, isDirty, onClose, onReset: resetForm });
|
|
@@ -135,12 +132,10 @@ export function FeatureCreateDrawer({
|
|
|
135
132
|
const handleSubmit = useCallback(
|
|
136
133
|
(e: React.FormEvent) => {
|
|
137
134
|
e.preventDefault();
|
|
138
|
-
if (!
|
|
135
|
+
if (!description.trim()) return;
|
|
139
136
|
createSound.play();
|
|
140
|
-
const trimmedDescription = description.trim() || undefined;
|
|
141
137
|
onSubmit({
|
|
142
|
-
|
|
143
|
-
description: trimmedDescription,
|
|
138
|
+
description: description.trim(),
|
|
144
139
|
attachments,
|
|
145
140
|
repositoryPath,
|
|
146
141
|
approvalGates: {
|
|
@@ -155,7 +150,6 @@ export function FeatureCreateDrawer({
|
|
|
155
150
|
resetForm();
|
|
156
151
|
},
|
|
157
152
|
[
|
|
158
|
-
name,
|
|
159
153
|
description,
|
|
160
154
|
attachments,
|
|
161
155
|
approvalGates,
|
|
@@ -214,7 +208,11 @@ export function FeatureCreateDrawer({
|
|
|
214
208
|
<Button variant="outline" onClick={attemptClose} disabled={isSubmitting}>
|
|
215
209
|
Cancel
|
|
216
210
|
</Button>
|
|
217
|
-
<Button
|
|
211
|
+
<Button
|
|
212
|
+
type="submit"
|
|
213
|
+
form="create-feature-form"
|
|
214
|
+
disabled={!description.trim() || isSubmitting}
|
|
215
|
+
>
|
|
218
216
|
{isSubmitting ? 'Creating...' : '+ Create Feature'}
|
|
219
217
|
</Button>
|
|
220
218
|
</div>
|
|
@@ -223,38 +221,21 @@ export function FeatureCreateDrawer({
|
|
|
223
221
|
{/* Form body */}
|
|
224
222
|
<div className="overflow-y-auto p-4">
|
|
225
223
|
<form id="create-feature-form" onSubmit={handleSubmit} className="flex flex-col gap-4">
|
|
226
|
-
{/* Feature name */}
|
|
227
|
-
<div className="flex flex-col gap-1.5">
|
|
228
|
-
<Label
|
|
229
|
-
htmlFor="feature-name"
|
|
230
|
-
className="text-muted-foreground text-xs font-semibold tracking-wider"
|
|
231
|
-
>
|
|
232
|
-
FEATURE NAME
|
|
233
|
-
</Label>
|
|
234
|
-
<Input
|
|
235
|
-
id="feature-name"
|
|
236
|
-
placeholder="e.g. GitHub OAuth Login"
|
|
237
|
-
value={name}
|
|
238
|
-
onChange={(e) => setName(e.target.value)}
|
|
239
|
-
required
|
|
240
|
-
disabled={isSubmitting}
|
|
241
|
-
/>
|
|
242
|
-
</div>
|
|
243
|
-
|
|
244
224
|
{/* Description */}
|
|
245
225
|
<div className="flex flex-col gap-1.5">
|
|
246
226
|
<Label
|
|
247
227
|
htmlFor="feature-description"
|
|
248
228
|
className="text-muted-foreground text-xs font-semibold tracking-wider"
|
|
249
229
|
>
|
|
250
|
-
|
|
230
|
+
DESCRIBE YOUR FEATURE
|
|
251
231
|
</Label>
|
|
252
232
|
<Textarea
|
|
253
233
|
id="feature-description"
|
|
254
|
-
placeholder="
|
|
234
|
+
placeholder="e.g. Add GitHub OAuth login with callback handling and token refresh..."
|
|
255
235
|
value={description}
|
|
256
236
|
onChange={(e) => setDescription(e.target.value)}
|
|
257
237
|
rows={4}
|
|
238
|
+
required
|
|
258
239
|
disabled={isSubmitting}
|
|
259
240
|
/>
|
|
260
241
|
</div>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { useCallback, useEffect, useMemo } from 'react';
|
|
4
4
|
import { useRouter, usePathname } from 'next/navigation';
|
|
5
|
-
import type { Edge } from '@xyflow/react';
|
|
5
|
+
import type { Edge, Viewport } from '@xyflow/react';
|
|
6
6
|
import { FeaturesCanvas } from '@/components/features/features-canvas';
|
|
7
7
|
import type { CanvasNodeType } from '@/components/features/features-canvas';
|
|
8
8
|
import type { FeatureNodeData } from '@/components/common/feature-node';
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
import { useSelectedFeatureId } from '@/hooks/use-selected-feature-id';
|
|
15
15
|
import { useSoundAction } from '@/hooks/use-sound-action';
|
|
16
16
|
import { useDrawerCloseGuard } from '@/hooks/drawer-close-guard';
|
|
17
|
+
import { useViewportPersistence } from '@/hooks/use-viewport-persistence';
|
|
17
18
|
import { ControlCenterEmptyState } from './control-center-empty-state';
|
|
18
19
|
import { useControlCenterState } from './use-control-center-state';
|
|
19
20
|
|
|
@@ -29,6 +30,12 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
|
|
|
29
30
|
const clickSound = useSoundAction('click');
|
|
30
31
|
const { guardedNavigate } = useDrawerCloseGuard();
|
|
31
32
|
|
|
33
|
+
const {
|
|
34
|
+
defaultViewport,
|
|
35
|
+
onMoveEnd: handleViewportChange,
|
|
36
|
+
resetViewport,
|
|
37
|
+
} = useViewportPersistence();
|
|
38
|
+
|
|
32
39
|
const {
|
|
33
40
|
nodes,
|
|
34
41
|
edges,
|
|
@@ -231,6 +238,13 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
|
|
|
231
238
|
handleDeleteRepository,
|
|
232
239
|
]);
|
|
233
240
|
|
|
241
|
+
const handleMoveEnd = useCallback(
|
|
242
|
+
(_event: unknown, viewport: Viewport) => {
|
|
243
|
+
handleViewportChange(viewport);
|
|
244
|
+
},
|
|
245
|
+
[handleViewportChange]
|
|
246
|
+
);
|
|
247
|
+
|
|
234
248
|
const hasRepositories = nodes.some((n) => n.type === 'repositoryNode');
|
|
235
249
|
|
|
236
250
|
if (!hasRepositories) {
|
|
@@ -242,11 +256,14 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
|
|
|
242
256
|
nodes={nodes}
|
|
243
257
|
edges={edges}
|
|
244
258
|
selectedFeatureId={selectedFeatureId}
|
|
259
|
+
defaultViewport={defaultViewport}
|
|
245
260
|
onNodesChange={onNodesChange}
|
|
246
261
|
onConnect={handleConnect}
|
|
247
262
|
onAddFeature={handleAddFeature}
|
|
248
263
|
onNodeClick={handleNodeClick}
|
|
249
264
|
onPaneClick={handleClearDrawers}
|
|
265
|
+
onMoveEnd={handleMoveEnd}
|
|
266
|
+
onResetViewport={resetViewport}
|
|
250
267
|
emptyState={<ControlCenterEmptyState onRepositorySelect={handleAddRepository} />}
|
|
251
268
|
/>
|
|
252
269
|
);
|
|
@@ -560,3 +560,21 @@ export const InteractiveWithRepository: Story = {
|
|
|
560
560
|
onAddFeature: () => undefined,
|
|
561
561
|
},
|
|
562
562
|
};
|
|
563
|
+
|
|
564
|
+
export const WithSavedViewport: Story = {
|
|
565
|
+
args: {
|
|
566
|
+
nodes: repoFeatureNodes,
|
|
567
|
+
edges: repoFeatureEdges,
|
|
568
|
+
defaultViewport: { x: 200, y: 150, zoom: 1.0 },
|
|
569
|
+
onResetViewport: () => ({ x: 30, y: 30, zoom: 0.85 }),
|
|
570
|
+
},
|
|
571
|
+
};
|
|
572
|
+
|
|
573
|
+
export const ZoomedOutViewport: Story = {
|
|
574
|
+
args: {
|
|
575
|
+
nodes: mixedLayoutedNodes,
|
|
576
|
+
edges: mixedLayoutedEdges,
|
|
577
|
+
defaultViewport: { x: 0, y: 0, zoom: 0.5 },
|
|
578
|
+
onResetViewport: () => ({ x: 30, y: 30, zoom: 0.85 }),
|
|
579
|
+
},
|
|
580
|
+
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import { useMemo } from 'react';
|
|
4
|
-
import { ReactFlow, Background, Controls } from '@xyflow/react';
|
|
5
|
-
import type { Connection, Edge, NodeChange } from '@xyflow/react';
|
|
6
|
-
import { Plus } from 'lucide-react';
|
|
3
|
+
import { useCallback, useMemo } from 'react';
|
|
4
|
+
import { ReactFlow, Background, Controls, ControlButton, useReactFlow } from '@xyflow/react';
|
|
5
|
+
import type { Connection, Edge, NodeChange, OnMoveEnd, Viewport } from '@xyflow/react';
|
|
6
|
+
import { Plus, RotateCcw } from 'lucide-react';
|
|
7
7
|
import { Button } from '@/components/ui/button';
|
|
8
8
|
import { EmptyState } from '@/components/common/empty-state';
|
|
9
9
|
import { FeatureNode } from '@/components/common/feature-node';
|
|
@@ -18,26 +18,49 @@ export interface FeaturesCanvasProps {
|
|
|
18
18
|
nodes: CanvasNodeType[];
|
|
19
19
|
edges: Edge[];
|
|
20
20
|
selectedFeatureId?: string | null;
|
|
21
|
+
defaultViewport?: Viewport;
|
|
21
22
|
onNodesChange?: (changes: NodeChange<CanvasNodeType>[]) => void;
|
|
22
23
|
onAddFeature?: () => void;
|
|
23
24
|
onNodeClick?: (event: React.MouseEvent, node: CanvasNodeType) => void;
|
|
24
25
|
onPaneClick?: (event: React.MouseEvent) => void;
|
|
25
26
|
onConnect?: (connection: Connection) => void;
|
|
26
27
|
onCanvasDrag?: () => void;
|
|
28
|
+
onMoveEnd?: OnMoveEnd;
|
|
29
|
+
onResetViewport?: () => Viewport;
|
|
27
30
|
toolbar?: React.ReactNode;
|
|
28
31
|
emptyState?: React.ReactNode;
|
|
29
32
|
}
|
|
30
33
|
|
|
34
|
+
const FALLBACK_VIEWPORT: Viewport = { x: 30, y: 30, zoom: 0.85 };
|
|
35
|
+
|
|
36
|
+
function ResetButton({ onResetViewport }: { onResetViewport: () => Viewport }) {
|
|
37
|
+
const { setViewport } = useReactFlow();
|
|
38
|
+
|
|
39
|
+
const handleReset = useCallback(() => {
|
|
40
|
+
const viewport = onResetViewport();
|
|
41
|
+
setViewport(viewport, { duration: 400 });
|
|
42
|
+
}, [onResetViewport, setViewport]);
|
|
43
|
+
|
|
44
|
+
return (
|
|
45
|
+
<ControlButton onClick={handleReset} title="Reset view" aria-label="Reset view">
|
|
46
|
+
<RotateCcw />
|
|
47
|
+
</ControlButton>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
31
51
|
export function FeaturesCanvas({
|
|
32
52
|
nodes,
|
|
33
53
|
edges,
|
|
34
54
|
selectedFeatureId,
|
|
55
|
+
defaultViewport,
|
|
35
56
|
onNodesChange,
|
|
36
57
|
onAddFeature,
|
|
37
58
|
onConnect,
|
|
38
59
|
onNodeClick,
|
|
39
60
|
onPaneClick,
|
|
40
61
|
onCanvasDrag,
|
|
62
|
+
onMoveEnd,
|
|
63
|
+
onResetViewport,
|
|
41
64
|
toolbar,
|
|
42
65
|
emptyState,
|
|
43
66
|
}: FeaturesCanvasProps) {
|
|
@@ -111,13 +134,17 @@ export function FeaturesCanvas({
|
|
|
111
134
|
onNodeClick={onNodeClick}
|
|
112
135
|
onPaneClick={onPaneClick}
|
|
113
136
|
onMoveStart={onCanvasDrag}
|
|
114
|
-
|
|
137
|
+
onMoveEnd={onMoveEnd}
|
|
138
|
+
defaultViewport={defaultViewport ?? FALLBACK_VIEWPORT}
|
|
115
139
|
nodesDraggable={false}
|
|
116
140
|
nodesConnectable={false}
|
|
117
141
|
elementsSelectable={false}
|
|
142
|
+
proOptions={{ hideAttribution: true }}
|
|
118
143
|
>
|
|
119
144
|
<Background />
|
|
120
|
-
<Controls
|
|
145
|
+
<Controls showInteractive={false}>
|
|
146
|
+
{onResetViewport ? <ResetButton onResetViewport={onResetViewport} /> : null}
|
|
147
|
+
</Controls>
|
|
121
148
|
{toolbar}
|
|
122
149
|
</ReactFlow>
|
|
123
150
|
</div>
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
4
|
+
import type { Viewport } from '@xyflow/react';
|
|
5
|
+
|
|
6
|
+
export const STORAGE_KEY = 'shep-canvas-viewport';
|
|
7
|
+
export const DEBOUNCE_MS = 500;
|
|
8
|
+
|
|
9
|
+
export const DEFAULT_VIEWPORT: Viewport = { x: 30, y: 30, zoom: 0.85 };
|
|
10
|
+
|
|
11
|
+
export interface UseViewportPersistenceResult {
|
|
12
|
+
defaultViewport: Viewport;
|
|
13
|
+
onMoveEnd: (viewport: Viewport) => void;
|
|
14
|
+
resetViewport: () => Viewport;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function isValidViewport(value: unknown): value is Viewport {
|
|
18
|
+
if (value == null || typeof value !== 'object' || Array.isArray(value)) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const v = value as Record<string, unknown>;
|
|
22
|
+
return (
|
|
23
|
+
typeof v.x === 'number' &&
|
|
24
|
+
typeof v.y === 'number' &&
|
|
25
|
+
typeof v.zoom === 'number' &&
|
|
26
|
+
Number.isFinite(v.x) &&
|
|
27
|
+
Number.isFinite(v.y) &&
|
|
28
|
+
Number.isFinite(v.zoom) &&
|
|
29
|
+
v.zoom > 0
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function readViewport(): Viewport {
|
|
34
|
+
try {
|
|
35
|
+
const raw = localStorage.getItem(STORAGE_KEY);
|
|
36
|
+
if (raw == null) return DEFAULT_VIEWPORT;
|
|
37
|
+
const parsed: unknown = JSON.parse(raw);
|
|
38
|
+
return isValidViewport(parsed) ? parsed : DEFAULT_VIEWPORT;
|
|
39
|
+
} catch {
|
|
40
|
+
return DEFAULT_VIEWPORT;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function useViewportPersistence(): UseViewportPersistenceResult {
|
|
45
|
+
const defaultViewport = useRef<Viewport>(readViewport()).current;
|
|
46
|
+
const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
47
|
+
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
return () => {
|
|
50
|
+
if (timerRef.current != null) {
|
|
51
|
+
clearTimeout(timerRef.current);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}, []);
|
|
55
|
+
|
|
56
|
+
const onMoveEnd = useCallback((viewport: Viewport) => {
|
|
57
|
+
if (timerRef.current != null) {
|
|
58
|
+
clearTimeout(timerRef.current);
|
|
59
|
+
}
|
|
60
|
+
timerRef.current = setTimeout(() => {
|
|
61
|
+
try {
|
|
62
|
+
localStorage.setItem(STORAGE_KEY, JSON.stringify(viewport));
|
|
63
|
+
} catch {
|
|
64
|
+
// Silently ignore localStorage errors (quota exceeded, private browsing, etc.)
|
|
65
|
+
}
|
|
66
|
+
}, DEBOUNCE_MS);
|
|
67
|
+
}, []);
|
|
68
|
+
|
|
69
|
+
const resetViewport = useCallback((): Viewport => {
|
|
70
|
+
try {
|
|
71
|
+
localStorage.removeItem(STORAGE_KEY);
|
|
72
|
+
} catch {
|
|
73
|
+
// Silently ignore localStorage errors
|
|
74
|
+
}
|
|
75
|
+
return DEFAULT_VIEWPORT;
|
|
76
|
+
}, []);
|
|
77
|
+
|
|
78
|
+
return { defaultViewport, onMoveEnd, resetViewport };
|
|
79
|
+
}
|
|
@@ -15,7 +15,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
|
|
|
15
15
|
const hostname = process.env.HOSTNAME || '0.0.0.0'
|
|
16
16
|
|
|
17
17
|
let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
|
|
18
|
-
const nextConfig = {"env":{"NEXT_PUBLIC_SHEP_VERSION":"1.
|
|
18
|
+
const nextConfig = {"env":{"NEXT_PUBLIC_SHEP_VERSION":"1.74.0","NEXT_PUBLIC_SHEP_PACKAGE_NAME":"@shepai/cli","NEXT_PUBLIC_SHEP_DESCRIPTION":"Autonomous AI Native SDLC Platform - Automate the development cycle from idea to deploy"},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":true,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/cli/cli","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"dynamicOnHover":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":false,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":false,"lockDistDir":true,"isolatedDevBuild":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":false,"optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","turbopack":{"root":"/home/runner/work/cli/cli"},"serverExternalPackages":["tsyringe","reflect-metadata","better-sqlite3","node:os","node:child_process","node:fs"],"distDirRoot":".next"}
|
|
19
19
|
|
|
20
20
|
process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
|
|
21
21
|
|