@shepai/cli 1.75.0-pr237.5e7fa4f → 1.76.0-pr238.49844a7

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 (242) hide show
  1. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +0 -1
  2. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts +1 -4
  4. package/dist/packages/core/src/application/ports/output/services/spec-initializer.interface.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +2 -5
  7. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +0 -2
  8. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +0 -1
  10. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +0 -3
  12. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +0 -1
  13. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  14. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +1 -10
  15. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/lifecycle-context.d.ts.map +1 -1
  16. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/lifecycle-context.js +0 -1
  17. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts +1 -1
  18. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/services/spec/spec-initializer.service.js +3 -8
  20. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  21. package/dist/src/presentation/cli/commands/feat/new.command.js +0 -2
  22. package/dist/src/presentation/web/app/actions/create-feature.d.ts +0 -2
  23. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  24. package/dist/src/presentation/web/app/actions/create-feature.js +1 -3
  25. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +0 -2
  26. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  27. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +1 -5
  28. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +0 -18
  29. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  30. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +0 -49
  31. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  32. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +9 -30
  33. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -4
  34. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  35. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +2 -4
  36. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +4 -4
  37. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  38. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +14 -6
  39. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts +2 -3
  40. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts.map +1 -1
  41. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +8 -81
  42. package/dist/src/presentation/web/hooks/use-graph-state.d.ts +0 -2
  43. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  44. package/dist/src/presentation/web/hooks/use-graph-state.js +0 -4
  45. package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts +7 -11
  46. package/dist/src/presentation/web/hooks/use-viewport-persistence.d.ts.map +1 -1
  47. package/dist/src/presentation/web/hooks/use-viewport-persistence.js +59 -12
  48. package/dist/tsconfig.build.tsbuildinfo +1 -1
  49. package/package.json +1 -1
  50. package/web/.next/BUILD_ID +1 -1
  51. package/web/.next/build-manifest.json +2 -2
  52. package/web/.next/cache/.previewinfo +1 -1
  53. package/web/.next/cache/.rscinfo +1 -1
  54. package/web/.next/cache/.tsbuildinfo +1 -1
  55. package/web/.next/cache/config.json +3 -3
  56. package/web/.next/fallback-build-manifest.json +2 -2
  57. package/web/.next/prerender-manifest.json +3 -3
  58. package/web/.next/required-server-files.js +1 -1
  59. package/web/.next/required-server-files.json +1 -1
  60. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
  61. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  62. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
  64. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  65. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  67. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  68. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
  70. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  71. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
  73. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  74. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  76. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  77. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  79. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  80. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  81. package/web/.next/server/app/_global-error.html +2 -2
  82. package/web/.next/server/app/_global-error.rsc +1 -1
  83. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  84. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  85. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  86. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  87. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  88. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  89. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  91. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  93. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  95. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  97. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  98. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  99. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  100. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  101. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js.map +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js.map +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  119. package/web/.next/server/chunks/ssr/_0e9d6bf7._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  121. package/web/.next/server/chunks/ssr/_61351ed3._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  123. package/web/.next/server/chunks/ssr/_8400c8bb._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  125. package/web/.next/server/chunks/ssr/_9f940437._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/{_70427cc3._.js → _e091d951._.js} +3 -3
  127. package/web/.next/server/chunks/ssr/{_70427cc3._.js.map → _e091d951._.js.map} +1 -1
  128. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
  129. package/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js.map +1 -1
  130. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
  131. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
  133. package/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
  135. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  137. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  138. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  139. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  140. package/web/.next/server/pages/500.html +2 -2
  141. package/web/.next/server/server-reference-manifest.js +1 -1
  142. package/web/.next/server/server-reference-manifest.json +22 -22
  143. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  144. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  145. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  146. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  147. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +16 -16
  148. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  149. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  150. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +19 -19
  151. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  152. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  153. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  154. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  155. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  156. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +16 -16
  157. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  158. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  159. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +19 -19
  160. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  161. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  162. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  163. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  164. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  165. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  166. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  167. package/web/.next/standalone/src/presentation/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  168. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  169. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  170. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  171. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  172. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  173. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  174. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  175. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  176. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  177. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  178. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  180. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  181. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  182. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  183. 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
  184. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  185. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  186. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__17a611f0._.js +2 -2
  187. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  188. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__45dbf93d._.js +2 -2
  189. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6258349c._.js +1 -1
  190. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  191. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6cbc1149._.js +2 -2
  192. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  193. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__94a6d275._.js +1 -1
  194. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  195. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_0e9d6bf7._.js +1 -1
  196. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_61351ed3._.js +1 -1
  197. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_8400c8bb._.js +1 -1
  198. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_9f940437._.js +1 -1
  199. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{_70427cc3._.js → _e091d951._.js} +3 -3
  200. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_163038ba._.js +2 -2
  201. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +1 -1
  202. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_459cb687._.js +2 -2
  203. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +1 -1
  204. 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
  205. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  206. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  207. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  208. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +22 -22
  209. package/web/.next/standalone/src/presentation/web/app/actions/create-feature.ts +1 -6
  210. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx +0 -57
  211. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +0 -21
  212. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +20 -35
  213. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +3 -7
  214. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.stories.tsx +8 -93
  215. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +30 -10
  216. package/web/.next/standalone/src/presentation/web/hooks/use-graph-state.ts +0 -7
  217. package/web/.next/standalone/src/presentation/web/hooks/use-viewport-persistence.ts +68 -17
  218. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  219. package/web/.next/static/chunks/{bafdd9797848cd20.js → 067dc08b689d8955.js} +3 -3
  220. package/web/.next/static/chunks/{a88681644bdb457b.js → 1e7380ea9e3c019e.js} +1 -1
  221. package/web/.next/static/chunks/{ed9bf11850c038ad.js → 3d88e23beec6608e.js} +1 -1
  222. package/web/.next/static/chunks/{9de39ba6f1d109ce.js → 5d28ad531ad6b65c.js} +1 -1
  223. package/web/.next/static/chunks/{9fd70802deb2e4b6.js → 65b5bd3861131047.js} +1 -1
  224. package/web/.next/static/chunks/{31a91284309556ca.js → 71d33d172eb1f602.js} +1 -1
  225. package/web/.next/static/chunks/8305a3f93197e23a.js +1 -0
  226. package/web/.next/static/chunks/{224919f6f72a4a90.js → 8fe874fd92309313.js} +1 -1
  227. package/web/.next/static/chunks/{ab7bce7118a0f933.js → eb2dc4b01d975cef.js} +1 -1
  228. package/web/.next/trace +1 -1
  229. package/web/.next/trace-build +1 -1
  230. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +0 -220
  231. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +0 -1
  232. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.js +0 -66
  233. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.d.ts +0 -21
  234. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.d.ts.map +0 -1
  235. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.js +0 -60
  236. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/fast-implement.prompt.d.ts +0 -25
  237. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/fast-implement.prompt.d.ts.map +0 -1
  238. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/fast-implement.prompt.js +0 -176
  239. package/web/.next/static/chunks/9b07281f9fa372ca.js +0 -1
  240. /package/web/.next/static/{Z3nGW8HgUl_Ajpr-2arJQ → IVTB-1bqXTCz0djYEeD2G}/_buildManifest.js +0 -0
  241. /package/web/.next/static/{Z3nGW8HgUl_Ajpr-2arJQ → IVTB-1bqXTCz0djYEeD2G}/_clientMiddlewareManifest.json +0 -0
  242. /package/web/.next/static/{Z3nGW8HgUl_Ajpr-2arJQ → IVTB-1bqXTCz0djYEeD2G}/_ssgManifest.js +0 -0
@@ -49,8 +49,6 @@ export interface FeatureCreatePayload {
49
49
  push: boolean;
50
50
  openPr: boolean;
51
51
  parentId?: string;
52
- /** When true, skip SDLC phases and implement directly from the prompt. */
53
- fast: boolean;
54
52
  }
55
53
 
56
54
  const AUTO_APPROVE_OPTIONS = [
@@ -99,7 +97,6 @@ export function FeatureCreateDrawer({
99
97
  const [push, setPush] = useState(defaultPush);
100
98
  const [openPr, setOpenPr] = useState(defaultOpenPr);
101
99
  const [parentId, setParentId] = useState<string | undefined>(undefined);
102
- const [fast, setFast] = useState(false);
103
100
 
104
101
  // Sync state when workflowDefaults load asynchronously
105
102
  useEffect(() => {
@@ -124,7 +121,6 @@ export function FeatureCreateDrawer({
124
121
  setPush(defaultPush);
125
122
  setOpenPr(defaultOpenPr);
126
123
  setParentId(undefined);
127
- setFast(false);
128
124
  }, [defaultGates, defaultPush, defaultOpenPr]);
129
125
 
130
126
  // Track whether the form has unsaved data
@@ -149,7 +145,6 @@ export function FeatureCreateDrawer({
149
145
  },
150
146
  push: push || openPr,
151
147
  openPr,
152
- fast,
153
148
  ...(parentId ? { parentId } : {}),
154
149
  });
155
150
  resetForm();
@@ -162,7 +157,6 @@ export function FeatureCreateDrawer({
162
157
  onSubmit,
163
158
  push,
164
159
  openPr,
165
- fast,
166
160
  parentId,
167
161
  createSound,
168
162
  resetForm,
@@ -264,21 +258,6 @@ export function FeatureCreateDrawer({
264
258
  </div>
265
259
  ) : null}
266
260
 
267
- {/* Fast mode toggle */}
268
- <div className="flex flex-col gap-1.5">
269
- <Label className="text-muted-foreground text-xs font-semibold tracking-wider">
270
- MODE
271
- </Label>
272
- <CheckboxGroupItem
273
- id="fast-mode"
274
- label="Fast Mode"
275
- description="Skip SDLC phases and implement directly from your prompt."
276
- checked={fast}
277
- onCheckedChange={setFast}
278
- disabled={isSubmitting}
279
- />
280
- </div>
281
-
282
261
  {/* Auto-approve checkboxes */}
283
262
  <div className="flex flex-col gap-1.5">
284
263
  <Label className="text-muted-foreground text-xs font-semibold tracking-wider">
@@ -1,9 +1,8 @@
1
1
  'use client';
2
2
 
3
- import { useCallback, useEffect, useMemo, useRef } from 'react';
3
+ import { useCallback, useEffect, useMemo } from 'react';
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
- import type { Edge } from '@xyflow/react';
6
- import { useReactFlow } from '@xyflow/react';
5
+ import type { Edge, Viewport } from '@xyflow/react';
7
6
  import { FeaturesCanvas } from '@/components/features/features-canvas';
8
7
  import type { CanvasNodeType } from '@/components/features/features-canvas';
9
8
  import type { FeatureNodeData } from '@/components/common/feature-node';
@@ -19,14 +18,6 @@ import { useViewportPersistence } from '@/hooks/use-viewport-persistence';
19
18
  import { ControlCenterEmptyState } from './control-center-empty-state';
20
19
  import { useControlCenterState } from './use-control-center-state';
21
20
 
22
- const AUTO_FOCUS_OPTIONS = {
23
- maxZoom: 1.0,
24
- padding: 0.5,
25
- duration: 500,
26
- } as const;
27
-
28
- const AUTO_FOCUS_DRAWER_DELAY_MS = 600;
29
-
30
21
  interface ControlCenterInnerProps {
31
22
  initialNodes: CanvasNodeType[];
32
23
  initialEdges: Edge[];
@@ -38,9 +29,12 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
38
29
  const selectedFeatureId = useSelectedFeatureId();
39
30
  const clickSound = useSoundAction('click');
40
31
  const { guardedNavigate } = useDrawerCloseGuard();
41
- const { defaultViewport, onMoveEnd } = useViewportPersistence();
42
- const { fitView } = useReactFlow();
43
- const drawerTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
32
+
33
+ const {
34
+ defaultViewport,
35
+ onMoveEnd: handleViewportChange,
36
+ resetViewport,
37
+ } = useViewportPersistence();
44
38
 
45
39
  const {
46
40
  nodes,
@@ -170,28 +164,11 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
170
164
  useEffect(() => {
171
165
  const handler = (e: Event) => {
172
166
  const path = (e as CustomEvent<{ path: string }>).detail.path;
173
- const { wasEmpty, repoPath } = handleAddRepository(path);
174
-
175
- if (wasEmpty) {
176
- // Wait for next render so the repo node exists in the DOM, then auto-focus
177
- setTimeout(() => {
178
- fitView(AUTO_FOCUS_OPTIONS);
179
-
180
- // Open the create-feature drawer after the fitView animation completes
181
- drawerTimerRef.current = setTimeout(() => {
182
- guardedNavigate(() => router.push(`/create?repo=${encodeURIComponent(repoPath)}`));
183
- }, AUTO_FOCUS_DRAWER_DELAY_MS);
184
- }, 0);
185
- }
167
+ handleAddRepository(path);
186
168
  };
187
169
  window.addEventListener('shep:add-repository', handler);
188
- return () => {
189
- window.removeEventListener('shep:add-repository', handler);
190
- if (drawerTimerRef.current != null) {
191
- clearTimeout(drawerTimerRef.current);
192
- }
193
- };
194
- }, [handleAddRepository, fitView, guardedNavigate, router]);
170
+ return () => window.removeEventListener('shep:add-repository', handler);
171
+ }, [handleAddRepository]);
195
172
 
196
173
  // Listen for create events from the create drawer (with real feature ID from server)
197
174
  useEffect(() => {
@@ -261,6 +238,13 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
261
238
  handleDeleteRepository,
262
239
  ]);
263
240
 
241
+ const handleMoveEnd = useCallback(
242
+ (_event: unknown, viewport: Viewport) => {
243
+ handleViewportChange(viewport);
244
+ },
245
+ [handleViewportChange]
246
+ );
247
+
264
248
  const hasRepositories = nodes.some((n) => n.type === 'repositoryNode');
265
249
 
266
250
  if (!hasRepositories) {
@@ -278,7 +262,8 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
278
262
  onAddFeature={handleAddFeature}
279
263
  onNodeClick={handleNodeClick}
280
264
  onPaneClick={handleClearDrawers}
281
- onMoveEnd={onMoveEnd}
265
+ onMoveEnd={handleMoveEnd}
266
+ onResetViewport={resetViewport}
282
267
  emptyState={<ControlCenterEmptyState onRepositorySelect={handleAddRepository} />}
283
268
  />
284
269
  );
@@ -36,7 +36,7 @@ export interface ControlCenterState {
36
36
  edges: Edge[];
37
37
  onNodesChange: (changes: NodeChange<CanvasNodeType>[]) => void;
38
38
  handleConnect: (connection: Connection) => void;
39
- handleAddRepository: (path: string) => { wasEmpty: boolean; repoPath: string };
39
+ handleAddRepository: (path: string) => void;
40
40
  handleLayout: (direction: LayoutDirection) => void;
41
41
  handleDeleteFeature: (featureId: string) => void;
42
42
  handleDeleteRepository: (repositoryId: string) => Promise<void>;
@@ -79,7 +79,6 @@ export function useControlCenterState(
79
79
  replaceRepository,
80
80
  getFeatureRepositoryPath,
81
81
  getRepositoryData,
82
- getRepoMapSize,
83
82
  setCallbacks,
84
83
  } = useGraphState(initialNodes, initialEdges);
85
84
 
@@ -385,8 +384,7 @@ export function useControlCenterState(
385
384
  );
386
385
 
387
386
  const handleAddRepository = useCallback(
388
- (path: string): { wasEmpty: boolean; repoPath: string } => {
389
- const wasEmpty = getRepoMapSize() === 0;
387
+ (path: string) => {
390
388
  const tempId = `repo-temp-${Date.now()}`;
391
389
  const repoName =
392
390
  path
@@ -416,10 +414,8 @@ export function useControlCenterState(
416
414
  removeRepository(tempId);
417
415
  toast.error('Failed to add repository');
418
416
  });
419
-
420
- return { wasEmpty, repoPath: path };
421
417
  },
422
- [addRepositoryToMap, removeRepository, replaceRepository, createSound, getRepoMapSize]
418
+ [addRepositoryToMap, removeRepository, replaceRepository, createSound]
423
419
  );
424
420
 
425
421
  return {
@@ -5,8 +5,6 @@ import type { CanvasNodeType } from './features-canvas';
5
5
  import type { FeatureNodeType } from '@/components/common/feature-node';
6
6
  import type { RepositoryNodeType } from '@/components/common/repository-node';
7
7
  import { layoutWithDagre } from '@/lib/layout-with-dagre';
8
- // Viewport type used in story args below
9
- import type { Viewport } from '@/hooks/use-viewport-persistence';
10
8
 
11
9
  const meta: Meta<typeof FeaturesCanvas> = {
12
10
  title: 'Features/FeaturesCanvas',
@@ -563,103 +561,20 @@ export const InteractiveWithRepository: Story = {
563
561
  },
564
562
  };
565
563
 
566
- // --- Viewport Persistence Stories ---
567
-
568
- export const SavedViewport: Story = {
569
- name: 'Saved Viewport (Zoomed & Panned)',
564
+ export const WithSavedViewport: Story = {
570
565
  args: {
571
566
  nodes: repoFeatureNodes,
572
567
  edges: repoFeatureEdges,
573
- defaultViewport: { x: 200, y: 150, zoom: 1.5 },
574
- onMoveEnd: (_viewport: Viewport) => {
575
- // Viewport change handler — visible in Storybook Actions panel
576
- },
568
+ defaultViewport: { x: 200, y: 150, zoom: 1.0 },
569
+ onResetViewport: () => ({ x: 30, y: 30, zoom: 0.85 }),
577
570
  },
578
571
  };
579
572
 
580
- export const DefaultViewport: Story = {
581
- name: 'Default Viewport (No Saved State)',
573
+ export const ZoomedOutViewport: Story = {
582
574
  args: {
583
- nodes: repoFeatureNodes,
584
- edges: repoFeatureEdges,
585
- onMoveEnd: (_viewport: Viewport) => {
586
- // Viewport change handler — visible in Storybook Actions panel
587
- },
588
- },
589
- };
590
-
591
- // --- Fast-mode feature scenario ---
592
-
593
- const fastModeNodesRaw: CanvasNodeType[] = [
594
- {
595
- id: 'repo-1',
596
- type: 'repositoryNode',
597
- position: { x: 0, y: 0 },
598
- data: { name: 'shep-ai/cli' },
599
- },
600
- {
601
- id: 'feat-fast-1',
602
- type: 'featureNode',
603
- position: { x: 0, y: 0 },
604
- data: {
605
- name: 'Quick Bug Fix',
606
- description: 'Fast-mode feature — skips SDLC, starts at implementation',
607
- featureId: '#ff1',
608
- lifecycle: 'implementation',
609
- state: 'running',
610
- progress: 30,
611
- repositoryPath: '/home/user/my-repo',
612
- branch: 'feat/quick-bug-fix',
613
- },
614
- },
615
- {
616
- id: 'feat-full-1',
617
- type: 'featureNode',
618
- position: { x: 0, y: 0 },
619
- data: {
620
- name: 'Auth Module',
621
- description: 'Full-pipeline feature — goes through all SDLC phases',
622
- featureId: '#ff2',
623
- lifecycle: 'requirements',
624
- state: 'running',
625
- progress: 15,
626
- repositoryPath: '/home/user/my-repo',
627
- branch: 'feat/auth-module',
628
- },
629
- },
630
- {
631
- id: 'feat-fast-2',
632
- type: 'featureNode',
633
- position: { x: 0, y: 0 },
634
- data: {
635
- name: 'Update README',
636
- description: 'Fast-mode feature — already done',
637
- featureId: '#ff3',
638
- lifecycle: 'deploy',
639
- state: 'done',
640
- progress: 100,
641
- repositoryPath: '/home/user/my-repo',
642
- branch: 'feat/update-readme',
643
- },
644
- },
645
- ];
646
-
647
- const fastModeEdges: Edge[] = [
648
- { id: 'e-r1-ff1', source: 'repo-1', target: 'feat-fast-1', ...dashedEdge },
649
- { id: 'e-r1-ff2', source: 'repo-1', target: 'feat-full-1', ...dashedEdge },
650
- { id: 'e-r1-ff3', source: 'repo-1', target: 'feat-fast-2', ...dashedEdge },
651
- ];
652
-
653
- const { nodes: fastModeLayoutedNodes, edges: fastModeLayoutedEdges } = layoutWithDagre(
654
- fastModeNodesRaw,
655
- fastModeEdges,
656
- { direction: 'LR' }
657
- );
658
-
659
- export const FastModeFeatures: Story = {
660
- name: 'Fast Mode Features (Mixed Pipeline)',
661
- args: {
662
- nodes: fastModeLayoutedNodes,
663
- edges: fastModeLayoutedEdges,
575
+ nodes: mixedLayoutedNodes,
576
+ edges: mixedLayoutedEdges,
577
+ defaultViewport: { x: 0, y: 0, zoom: 0.5 },
578
+ onResetViewport: () => ({ x: 30, y: 30, zoom: 0.85 }),
664
579
  },
665
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';
@@ -11,7 +11,6 @@ import type { FeatureNodeType, FeatureNodeData } from '@/components/common/featu
11
11
  import { RepositoryNode } from '@/components/common/repository-node';
12
12
  import type { RepositoryNodeType } from '@/components/common/repository-node';
13
13
  import { DependencyEdge } from './dependency-edge';
14
- import { DEFAULT_VIEWPORT, type Viewport } from '@/hooks/use-viewport-persistence';
15
14
 
16
15
  export type CanvasNodeType = FeatureNodeType | RepositoryNodeType;
17
16
 
@@ -26,16 +25,34 @@ export interface FeaturesCanvasProps {
26
25
  onPaneClick?: (event: React.MouseEvent) => void;
27
26
  onConnect?: (connection: Connection) => void;
28
27
  onCanvasDrag?: () => void;
29
- onMoveEnd?: (viewport: Viewport) => void;
28
+ onMoveEnd?: OnMoveEnd;
29
+ onResetViewport?: () => Viewport;
30
30
  toolbar?: React.ReactNode;
31
31
  emptyState?: React.ReactNode;
32
32
  }
33
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
+
34
51
  export function FeaturesCanvas({
35
52
  nodes,
36
53
  edges,
37
54
  selectedFeatureId,
38
- defaultViewport: defaultViewportProp,
55
+ defaultViewport,
39
56
  onNodesChange,
40
57
  onAddFeature,
41
58
  onConnect,
@@ -43,6 +60,7 @@ export function FeaturesCanvas({
43
60
  onPaneClick,
44
61
  onCanvasDrag,
45
62
  onMoveEnd,
63
+ onResetViewport,
46
64
  toolbar,
47
65
  emptyState,
48
66
  }: FeaturesCanvasProps) {
@@ -116,15 +134,17 @@ export function FeaturesCanvas({
116
134
  onNodeClick={onNodeClick}
117
135
  onPaneClick={onPaneClick}
118
136
  onMoveStart={onCanvasDrag}
119
- onMoveEnd={onMoveEnd ? (_event, viewport) => onMoveEnd(viewport) : undefined}
120
- defaultViewport={defaultViewportProp ?? DEFAULT_VIEWPORT}
137
+ onMoveEnd={onMoveEnd}
138
+ defaultViewport={defaultViewport ?? FALLBACK_VIEWPORT}
121
139
  nodesDraggable={false}
122
140
  nodesConnectable={false}
123
141
  elementsSelectable={false}
124
142
  proOptions={{ hideAttribution: true }}
125
143
  >
126
144
  <Background />
127
- <Controls />
145
+ <Controls showInteractive={false}>
146
+ {onResetViewport ? <ResetButton onResetViewport={onResetViewport} /> : null}
147
+ </Controls>
128
148
  {toolbar}
129
149
  </ReactFlow>
130
150
  </div>
@@ -45,8 +45,6 @@ export interface UseGraphStateReturn {
45
45
  getFeatureRepositoryPath: (featureNodeId: string) => string | undefined;
46
46
  /** Stable lookup: get repository node data by nodeId. */
47
47
  getRepositoryData: (nodeId: string) => RepositoryNodeData | undefined;
48
- /** Stable lookup: get the current number of repositories in the domain Map. */
49
- getRepoMapSize: () => number;
50
48
  /** Update callbacks injected into node data (does NOT trigger re-render). */
51
49
  setCallbacks: (callbacks: GraphCallbacks) => void;
52
50
  }
@@ -355,10 +353,6 @@ export function useGraphState(
355
353
  return repoMapRef.current.get(nodeId)?.data;
356
354
  }, []);
357
355
 
358
- const getRepoMapSize = useCallback((): number => {
359
- return repoMapRef.current.size;
360
- }, []);
361
-
362
356
  const setCallbacks = useCallback((callbacks: GraphCallbacks) => {
363
357
  callbacksRef.current = callbacks;
364
358
  }, []);
@@ -377,7 +371,6 @@ export function useGraphState(
377
371
  replaceRepository,
378
372
  getFeatureRepositoryPath,
379
373
  getRepositoryData,
380
- getRepoMapSize,
381
374
  setCallbacks,
382
375
  };
383
376
  }
@@ -1,28 +1,79 @@
1
1
  'use client';
2
2
 
3
- import { useCallback, useRef } from 'react';
3
+ import { useCallback, useEffect, useRef } from 'react';
4
+ import type { Viewport } from '@xyflow/react';
4
5
 
5
- export interface Viewport {
6
- x: number;
7
- y: number;
8
- zoom: number;
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;
9
15
  }
10
16
 
11
- export const DEFAULT_VIEWPORT: Viewport = { x: 0, y: 0, zoom: 1 };
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
+ }
12
43
 
13
- /**
14
- * Persists the ReactFlow viewport position across re-renders so the canvas
15
- * doesn't jump back to the origin when nodes update.
16
- */
17
- export function useViewportPersistence() {
18
- const viewportRef = useRef<Viewport>(DEFAULT_VIEWPORT);
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
+ }, []);
19
55
 
20
56
  const onMoveEnd = useCallback((viewport: Viewport) => {
21
- viewportRef.current = 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;
22
76
  }, []);
23
77
 
24
- return {
25
- defaultViewport: viewportRef.current,
26
- onMoveEnd,
27
- };
78
+ return { defaultViewport, onMoveEnd, resetViewport };
28
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.75.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.76.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