@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.
Files changed (211) hide show
  1. package/dist/src/presentation/web/app/actions/create-feature.d.ts +1 -2
  2. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  3. package/dist/src/presentation/web/app/actions/create-feature.js +6 -10
  4. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +1 -2
  5. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  6. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +4 -9
  7. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +7 -8
  8. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  9. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +12 -15
  10. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  11. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +6 -1
  12. package/dist/src/presentation/web/components/features/features-canvas/dependency-edge.stories.d.ts.map +1 -1
  13. package/dist/src/presentation/web/components/features/features-canvas/dependency-edge.stories.js +1 -1
  14. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +5 -2
  15. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  16. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +14 -5
  17. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts +2 -0
  18. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts.map +1 -1
  19. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +16 -0
  20. package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts +11 -0
  21. package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts.map +1 -0
  22. package/dist/src/presentation/web/hooks/use-viewport-persistence.js +64 -0
  23. package/dist/tsconfig.build.tsbuildinfo +1 -1
  24. package/package.json +1 -1
  25. package/web/.next/BUILD_ID +1 -1
  26. package/web/.next/build-manifest.json +2 -2
  27. package/web/.next/cache/.previewinfo +1 -1
  28. package/web/.next/cache/.rscinfo +1 -1
  29. package/web/.next/cache/.tsbuildinfo +1 -1
  30. package/web/.next/cache/config.json +3 -3
  31. package/web/.next/fallback-build-manifest.json +2 -2
  32. package/web/.next/prerender-manifest.json +3 -3
  33. package/web/.next/required-server-files.js +1 -1
  34. package/web/.next/required-server-files.json +1 -1
  35. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
  36. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  37. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  38. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
  39. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  42. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
  45. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  46. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
  48. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  49. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  51. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  52. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  54. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/_global-error.html +2 -2
  57. package/web/.next/server/app/_global-error.rsc +1 -1
  58. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  59. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  60. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  61. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  62. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  63. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  64. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  66. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  67. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  68. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  69. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  70. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  71. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  72. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  74. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  75. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  76. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  77. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  78. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  79. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  80. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
  81. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  82. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  83. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
  84. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  96. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
  97. package/web/.next/server/chunks/ssr/{_5024c80d._.js → _165a711c._.js} +3 -3
  98. package/web/.next/server/chunks/ssr/{_5024c80d._.js.map → _165a711c._.js.map} +1 -1
  99. package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  100. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
  101. package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  102. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
  103. package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  104. package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -4
  106. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
  108. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -4
  110. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
  112. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  114. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  116. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  117. package/web/.next/server/pages/500.html +2 -2
  118. package/web/.next/server/server-reference-manifest.js +1 -1
  119. package/web/.next/server/server-reference-manifest.json +22 -22
  120. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  121. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  122. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  123. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  124. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
  125. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  126. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  127. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
  128. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  129. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  130. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  131. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  132. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  133. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
  134. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  135. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  136. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
  137. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  138. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  139. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  140. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  141. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  142. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  143. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  144. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  145. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  146. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  147. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  148. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  149. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  150. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  151. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  152. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  153. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  154. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  155. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  156. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  157. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  158. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  159. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  160. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  161. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  162. 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
  163. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  164. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  165. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  166. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  167. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  168. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  169. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  170. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  171. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  172. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  173. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  174. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  175. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_5024c80d._.js → _165a711c._.js} +3 -3
  176. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  177. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  178. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -4
  180. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
  181. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -4
  182. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
  183. 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
  184. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  185. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  186. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  187. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +22 -22
  188. package/web/.next/standalone/src/presentation/web/app/actions/create-feature.ts +7 -18
  189. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx +16 -15
  190. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +12 -31
  191. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +18 -1
  192. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/dependency-edge.stories.tsx +1 -0
  193. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.stories.tsx +18 -0
  194. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +33 -6
  195. package/web/.next/standalone/src/presentation/web/hooks/use-viewport-persistence.ts +79 -0
  196. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  197. package/web/.next/static/chunks/{0acf10ef003e9399.js → 0efb4eebe8e287d6.js} +1 -1
  198. package/web/.next/static/chunks/{59a74c7dda3d6bb1.js → 32e5da584b2ee731.js} +1 -1
  199. package/web/.next/static/chunks/{66c3cc54f61b0683.js → 571e15176854c4e5.js} +1 -1
  200. package/web/.next/static/chunks/{a36a9b78fa84bfd9.js → 5b6ecf78282b255f.js} +1 -1
  201. package/web/.next/static/chunks/{c6904f5b67ddbcc0.js → 64735b1b52b1da19.js} +2 -2
  202. package/web/.next/static/chunks/{403ed451ae4f0fce.js → 6a1a0ba49a68bbe1.js} +1 -1
  203. package/web/.next/static/chunks/{fa3f61d528918657.js → 8be2936957914955.js} +1 -1
  204. package/web/.next/static/chunks/a2d555fed8db6a7b.js +1 -0
  205. package/web/.next/static/chunks/{46b663a9110c6602.js → dbda0b3e20712ad2.js} +1 -1
  206. package/web/.next/trace +1 -1
  207. package/web/.next/trace-build +1 -1
  208. package/web/.next/static/chunks/4093f165b5f2cc3e.js +0 -1
  209. /package/web/.next/static/{aNoBruNQb2aXRBW0KalUh → 9zQ15Z-LG-2oWOuc-wpQh}/_buildManifest.js +0 -0
  210. /package/web/.next/static/{aNoBruNQb2aXRBW0KalUh → 9zQ15Z-LG-2oWOuc-wpQh}/_clientMiddlewareManifest.json +0 -0
  211. /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
- * - **Feature Name** (required) — text input, submit is disabled when empty
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 `{ name, description, attachments, repositoryPath, approvalGates }` |
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 (name, description, attachments, checkboxes) when the drawer closes
37
- * - Submit button is disabled when name is empty
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 `{ name, description, attachments, repositoryPath, approvalGates }`.',
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 name and description are typed in.
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 nameInput = await body.findByPlaceholderText('e.g. GitHub OAuth Login');
146
- const descInput = body.getByPlaceholderText('Describe what this feature does...');
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 name field.
158
- * The "+ Create Feature" button is disabled because name validation fails.
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 `{ name, description, attachments, repositoryPath, approvalGates }`.
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 nameInput = await body.findByPlaceholderText('e.g. GitHub OAuth Login');
373
- await userEvent.type(nameInput, 'My Feature');
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
- name: string;
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 = name.trim() !== '' || description.trim() !== '' || attachments.length > 0;
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 (!name.trim()) return;
135
+ if (!description.trim()) return;
139
136
  createSound.play();
140
- const trimmedDescription = description.trim() || undefined;
141
137
  onSubmit({
142
- name: name.trim(),
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 type="submit" form="create-feature-form" disabled={!name.trim() || isSubmitting}>
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
- DESCRIPTION
230
+ DESCRIBE YOUR FEATURE
251
231
  </Label>
252
232
  <Textarea
253
233
  id="feature-description"
254
- placeholder="Describe what this feature does..."
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
  );
@@ -76,6 +76,7 @@ export const Default: StoryObj = {
76
76
  fitView
77
77
  nodesDraggable={false}
78
78
  nodesConnectable={false}
79
+ proOptions={{ hideAttribution: true }}
79
80
  />
80
81
  ),
81
82
  };
@@ -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
- defaultViewport={{ x: 30, y: 30, zoom: 0.85 }}
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.73.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"}
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