@shepai/cli 1.23.2 → 1.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts.map +1 -1
  2. package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.js +3 -0
  3. package/dist/packages/core/src/infrastructure/di/populate-use-cases-bridge.d.ts +20 -0
  4. package/dist/packages/core/src/infrastructure/di/populate-use-cases-bridge.d.ts.map +1 -0
  5. package/dist/packages/core/src/infrastructure/di/populate-use-cases-bridge.js +29 -0
  6. package/dist/packages/core/src/infrastructure/di/use-cases-bridge.d.ts +42 -0
  7. package/dist/packages/core/src/infrastructure/di/use-cases-bridge.d.ts.map +1 -0
  8. package/dist/packages/core/src/infrastructure/di/use-cases-bridge.js +88 -0
  9. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts +2 -0
  10. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +12 -1
  12. package/dist/src/presentation/cli/commands/upgrade.command.d.ts +17 -0
  13. package/dist/src/presentation/cli/commands/upgrade.command.d.ts.map +1 -0
  14. package/dist/src/presentation/cli/commands/upgrade.command.js +115 -0
  15. package/dist/src/presentation/cli/index.d.ts +1 -0
  16. package/dist/src/presentation/cli/index.d.ts.map +1 -1
  17. package/dist/src/presentation/cli/index.js +9 -8
  18. package/dist/src/presentation/web/app/api/features/create/route.d.ts +5 -0
  19. package/dist/src/presentation/web/app/api/features/create/route.d.ts.map +1 -0
  20. package/dist/src/presentation/web/app/api/features/create/route.js +32 -0
  21. package/dist/src/presentation/web/app/layout.d.ts.map +1 -1
  22. package/dist/src/presentation/web/app/layout.js +2 -1
  23. package/dist/src/presentation/web/app/page.d.ts +2 -0
  24. package/dist/src/presentation/web/app/page.d.ts.map +1 -1
  25. package/dist/src/presentation/web/app/page.js +20 -11
  26. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  27. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
  28. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -0
  29. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  30. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +45 -9
  31. package/dist/src/presentation/web/dev-server.js +19 -10
  32. package/dist/src/presentation/web/next.config.d.ts.map +1 -1
  33. package/dist/src/presentation/web/next.config.js +0 -4
  34. package/dist/tsconfig.build.tsbuildinfo +1 -1
  35. package/package.json +3 -3
  36. package/web/.next/BUILD_ID +1 -1
  37. package/web/.next/app-path-routes-manifest.json +1 -0
  38. package/web/.next/build-manifest.json +2 -2
  39. package/web/.next/cache/.previewinfo +1 -1
  40. package/web/.next/cache/.rscinfo +1 -1
  41. package/web/.next/cache/.tsbuildinfo +1 -1
  42. package/web/.next/cache/config.json +3 -3
  43. package/web/.next/fallback-build-manifest.json +2 -2
  44. package/web/.next/prerender-manifest.json +3 -27
  45. package/web/.next/required-server-files.js +1 -4
  46. package/web/.next/required-server-files.json +1 -4
  47. package/web/.next/routes-manifest.json +6 -0
  48. package/web/.next/server/app/_global-error.html +2 -2
  49. package/web/.next/server/app/_global-error.rsc +1 -1
  50. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  51. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  52. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  53. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  54. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  55. package/web/.next/server/app/_not-found/page.js +1 -1
  56. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  57. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/_not-found.html +2 -2
  59. package/web/.next/server/app/_not-found.rsc +14 -13
  60. package/web/.next/server/app/_not-found.segments/_full.segment.rsc +14 -13
  61. package/web/.next/server/app/_not-found.segments/_head.segment.rsc +3 -3
  62. package/web/.next/server/app/_not-found.segments/_index.segment.rsc +6 -5
  63. package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  64. package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  65. package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  66. package/web/.next/server/app/api/dialog/pick-files/route.js +2 -2
  67. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  68. package/web/.next/server/app/api/dialog/pick-folder/route.js +2 -2
  69. package/web/.next/server/app/api/dialog/pick-folder/route.js.nft.json +1 -1
  70. package/web/.next/server/app/api/features/create/route/app-paths-manifest.json +3 -0
  71. package/web/.next/server/app/api/features/create/route/build-manifest.json +11 -0
  72. package/web/.next/server/app/api/features/create/route/server-reference-manifest.json +4 -0
  73. package/web/.next/server/app/api/features/create/route.js +6 -0
  74. package/web/.next/server/app/api/features/create/route.js.map +5 -0
  75. package/web/.next/server/app/api/features/create/route.js.nft.json +1 -0
  76. package/web/.next/server/app/api/features/create/route_client-reference-manifest.js +2 -0
  77. package/web/.next/server/app/page.js +3 -3
  78. package/web/.next/server/app/page.js.nft.json +1 -1
  79. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/version/page.js +1 -1
  81. package/web/.next/server/app/version/page.js.nft.json +1 -1
  82. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/version.html +2 -2
  84. package/web/.next/server/app/version.rsc +13 -12
  85. package/web/.next/server/app/version.segments/_full.segment.rsc +13 -12
  86. package/web/.next/server/app/version.segments/_head.segment.rsc +1 -1
  87. package/web/.next/server/app/version.segments/_index.segment.rsc +4 -3
  88. package/web/.next/server/app/version.segments/_tree.segment.rsc +2 -2
  89. package/web/.next/server/app/version.segments/version/__PAGE__.segment.rsc +2 -2
  90. package/web/.next/server/app/version.segments/version.segment.rsc +1 -1
  91. package/web/.next/server/app-paths-manifest.json +1 -0
  92. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_create_route_actions_de49a114.js +3 -0
  93. package/web/.next/server/chunks/[root-of-the-server]__4e987cf3._.js +8 -0
  94. package/web/.next/server/chunks/[root-of-the-server]__4e987cf3._.js.map +1 -0
  95. package/web/.next/server/chunks/{[root-of-the-server]__22cabd43._.js → [root-of-the-server]__a6bf88cc._.js} +3 -3
  96. package/web/.next/server/chunks/{[root-of-the-server]__22cabd43._.js.map → [root-of-the-server]__a6bf88cc._.js.map} +1 -1
  97. package/web/.next/server/chunks/{[root-of-the-server]__00833626._.js → [root-of-the-server]__ba6c5641._.js} +2 -2
  98. package/web/.next/server/chunks/{[root-of-the-server]__00833626._.js.map → [root-of-the-server]__ba6c5641._.js.map} +1 -1
  99. package/web/.next/server/chunks/[root-of-the-server]__ec87d735._.js +3 -0
  100. package/web/.next/server/chunks/{[root-of-the-server]__95785ac7._.js.map → [root-of-the-server]__ec87d735._.js.map} +1 -1
  101. package/web/.next/server/chunks/ssr/{[root-of-the-server]__71515c64._.js → [root-of-the-server]__80e5bed2._.js} +2 -2
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__80e5bed2._.js.map +1 -0
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__a21ef212._.js +3 -0
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__a21ef212._.js.map +1 -0
  105. package/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
  106. package/web/.next/server/chunks/ssr/_09afa42a._.js +1 -1
  107. package/web/.next/server/chunks/ssr/_09afa42a._.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/_1c3962d7._.js +10 -0
  109. package/web/.next/server/chunks/ssr/_1c3962d7._.js.map +1 -0
  110. package/web/.next/server/chunks/ssr/src_presentation_web_67178b88._.js +13 -0
  111. package/web/.next/server/chunks/ssr/src_presentation_web_67178b88._.js.map +1 -0
  112. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +3 -0
  113. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -0
  114. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +3 -0
  115. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -0
  116. package/web/.next/server/pages/404.html +2 -2
  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 +1 -1
  120. package/web/.next/static/chunks/{f6b5484377f4e78e.js → 1c236dcc303f3033.js} +1 -1
  121. package/web/.next/static/chunks/74748b4d725c5c74.css +2 -0
  122. package/web/.next/static/chunks/78ef4acb26e4d6ea.js +1 -0
  123. package/web/.next/static/chunks/79009d1ca0d944d2.js +5 -0
  124. package/web/.next/trace +1 -1
  125. package/web/.next/trace-build +1 -1
  126. package/web/.next/types/link.d.ts +1 -0
  127. package/web/.next/types/routes.d.ts +2 -1
  128. package/web/.next/types/validator.ts +9 -0
  129. package/web/next.config.mjs +1 -1
  130. package/dist/src/presentation/web/lib/features.d.ts +0 -30
  131. package/dist/src/presentation/web/lib/features.d.ts.map +0 -1
  132. package/dist/src/presentation/web/lib/features.js +0 -50
  133. package/dist/src/presentation/web/lib/use-cases.d.ts +0 -29
  134. package/dist/src/presentation/web/lib/use-cases.d.ts.map +0 -1
  135. package/dist/src/presentation/web/lib/use-cases.js +0 -46
  136. package/web/.next/server/app/index.html +0 -11
  137. package/web/.next/server/app/index.meta +0 -14
  138. package/web/.next/server/app/index.rsc +0 -16
  139. package/web/.next/server/app/index.segments/__PAGE__.segment.rsc +0 -6
  140. package/web/.next/server/app/index.segments/_full.segment.rsc +0 -16
  141. package/web/.next/server/app/index.segments/_head.segment.rsc +0 -5
  142. package/web/.next/server/app/index.segments/_index.segment.rsc +0 -6
  143. package/web/.next/server/app/index.segments/_tree.segment.rsc +0 -2
  144. package/web/.next/server/chunks/[root-of-the-server]__95785ac7._.js +0 -3
  145. package/web/.next/server/chunks/ssr/[root-of-the-server]__7c64f85c._.js +0 -3
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__7c64f85c._.js.map +0 -1
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__8507ac68._.js +0 -3
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__8507ac68._.js.map +0 -1
  149. package/web/.next/server/chunks/ssr/_1f9347c8._.js +0 -7
  150. package/web/.next/server/chunks/ssr/_1f9347c8._.js.map +0 -1
  151. package/web/.next/server/chunks/ssr/_a0c04017._.js +0 -6
  152. package/web/.next/server/chunks/ssr/_a0c04017._.js.map +0 -1
  153. package/web/.next/server/chunks/ssr/src_presentation_web_372075f9._.js +0 -13
  154. package/web/.next/server/chunks/ssr/src_presentation_web_372075f9._.js.map +0 -1
  155. package/web/.next/static/chunks/66a2ada783ebc0d4.css +0 -2
  156. package/web/.next/static/chunks/8bc34062bc0f4ddc.js +0 -1
  157. package/web/.next/static/chunks/f5099c5888ef9a74.js +0 -5
  158. /package/web/.next/server/chunks/{ssr/[root-of-the-server]__71515c64._.js.map → 744ca_web__next-internal_server_app_api_features_create_route_actions_de49a114.js.map} +0 -0
  159. /package/web/.next/static/{3Y7OJekbogJm47SonWxv7 → -dFLqLT3RMg1ueqbAhsJk}/_buildManifest.js +0 -0
  160. /package/web/.next/static/{3Y7OJekbogJm47SonWxv7 → -dFLqLT3RMg1ueqbAhsJk}/_clientMiddlewareManifest.json +0 -0
  161. /package/web/.next/static/{3Y7OJekbogJm47SonWxv7 → -dFLqLT3RMg1ueqbAhsJk}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEhF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACzE,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,sBAAsB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,yBAAyB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,yBAAyB,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACjE,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B;AAID,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAkRpB"}
1
+ {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2CAA2C,CAAC;AACvF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEhF,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,eAAe,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC;IACzE,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,sBAAsB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACrD,yBAAyB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3D,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,yBAAyB,EAAE,CAAC,IAAI,EAAE,qBAAqB,KAAK,IAAI,CAAC;IACjE,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B;AAID,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAmTpB"}
@@ -1,13 +1,18 @@
1
1
  'use client';
2
2
  import { useState, useCallback, useEffect } from 'react';
3
+ import { useRouter } from 'next/navigation';
4
+ import { toast } from 'sonner';
3
5
  import { applyNodeChanges } from '@xyflow/react';
4
6
  import { layoutWithDagre } from '../../../lib/layout-with-dagre.js';
5
7
  let nextFeatureId = 0;
6
8
  export function useControlCenterState(initialNodes, initialEdges) {
9
+ const router = useRouter();
7
10
  const [nodes, setNodes] = useState(initialNodes);
8
11
  const [edges, setEdges] = useState(initialEdges);
9
12
  const [selectedNode, setSelectedNode] = useState(null);
10
13
  const [isCreateDrawerOpen, setIsCreateDrawerOpen] = useState(false);
14
+ const [isSubmitting, setIsSubmitting] = useState(false);
15
+ const [pendingRepoNodeId, setPendingRepoNodeId] = useState(null);
11
16
  const onNodesChange = useCallback((changes) => {
12
17
  setNodes((ns) => applyNodeChanges(changes, ns));
13
18
  }, []);
@@ -161,19 +166,49 @@ export function useControlCenterState(initialNodes, initialEdges) {
161
166
  setSelectedNode(null);
162
167
  setIsCreateDrawerOpen(true);
163
168
  }, []);
164
- const handleCreateFeatureSubmit = useCallback((data) => {
165
- setIsCreateDrawerOpen(false);
166
- createFeatureNode(null, {
167
- name: data.name,
168
- description: data.description || undefined,
169
- });
170
- }, [createFeatureNode]);
169
+ const handleCreateFeatureSubmit = useCallback(async (data) => {
170
+ if (!pendingRepoNodeId) {
171
+ toast.error('Please create the feature from a repository node.');
172
+ return;
173
+ }
174
+ const repositoryPath = pendingRepoNodeId.replace(/^repo-/, '');
175
+ setIsSubmitting(true);
176
+ try {
177
+ const response = await fetch('/api/features/create', {
178
+ method: 'POST',
179
+ headers: { 'Content-Type': 'application/json' },
180
+ body: JSON.stringify({
181
+ name: data.name,
182
+ description: data.description || '',
183
+ repositoryPath,
184
+ attachments: data.attachments,
185
+ }),
186
+ });
187
+ if (!response.ok) {
188
+ const body = await response.json();
189
+ toast.error(body.error ?? 'Failed to create feature');
190
+ return;
191
+ }
192
+ setIsCreateDrawerOpen(false);
193
+ setPendingRepoNodeId(null);
194
+ toast.success('Feature created successfully');
195
+ router.refresh();
196
+ }
197
+ catch {
198
+ toast.error('Failed to create feature');
199
+ }
200
+ finally {
201
+ setIsSubmitting(false);
202
+ }
203
+ }, [pendingRepoNodeId, router]);
171
204
  const closeCreateDrawer = useCallback(() => {
172
205
  setIsCreateDrawerOpen(false);
173
206
  }, []);
174
207
  const handleAddFeatureToRepo = useCallback((repoNodeId) => {
175
- createFeatureNode(repoNodeId);
176
- }, [createFeatureNode]);
208
+ setSelectedNode(null);
209
+ setPendingRepoNodeId(repoNodeId);
210
+ setIsCreateDrawerOpen(true);
211
+ }, []);
177
212
  const handleAddFeatureToFeature = useCallback((featureNodeId) => {
178
213
  createFeatureNode(featureNodeId);
179
214
  }, [createFeatureNode]);
@@ -220,6 +255,7 @@ export function useControlCenterState(initialNodes, initialEdges) {
220
255
  edges,
221
256
  selectedNode,
222
257
  isCreateDrawerOpen,
258
+ isSubmitting,
223
259
  onNodesChange,
224
260
  handleConnect,
225
261
  clearSelection,
@@ -14,8 +14,8 @@ import next from 'next';
14
14
  import http from 'node:http';
15
15
  import { initializeContainer, container } from '../../../packages/core/src/infrastructure/di/container.js';
16
16
  import { InitializeSettingsUseCase } from '../../../packages/core/src/application/use-cases/settings/initialize-settings.use-case.js';
17
- import { ListFeaturesUseCase } from '../../../packages/core/src/application/use-cases/features/list-features.use-case.js';
18
17
  import { initializeSettings } from '../../../packages/core/src/infrastructure/services/settings.service.js';
18
+ import { populateUseCasesBridge } from '../../../packages/core/src/infrastructure/di/populate-use-cases-bridge.js';
19
19
  const DEFAULT_PORT = 3000;
20
20
  async function main() {
21
21
  const port = parseInt(process.env.PORT ?? '', 10) || DEFAULT_PORT;
@@ -26,11 +26,7 @@ async function main() {
26
26
  const initSettingsUseCase = container.resolve(InitializeSettingsUseCase);
27
27
  const settings = await initSettingsUseCase.execute();
28
28
  initializeSettings(settings);
29
- // Set globalThis bridge for the web layer (same as CLI bootstrap index.ts:74-76)
30
- globalThis.__shepUseCases = {
31
- listFeatures: container.resolve(ListFeaturesUseCase),
32
- agentRunRepo: container.resolve('IAgentRunRepository'),
33
- };
29
+ populateUseCasesBridge(container);
34
30
  console.log('[dev-server] DI bridge initialized');
35
31
  }
36
32
  catch (error) {
@@ -43,21 +39,34 @@ async function main() {
43
39
  const server = http.createServer((req, res) => {
44
40
  handle(req, res);
45
41
  });
42
+ // Forward WebSocket upgrades to Next.js for HMR/Fast Refresh
43
+ server.on('upgrade', (req, socket, head) => {
44
+ app.getUpgradeHandler()(req, socket, head);
45
+ });
46
46
  await new Promise((resolve, reject) => {
47
47
  server.on('error', reject);
48
48
  server.listen(port, 'localhost', resolve);
49
49
  });
50
50
  console.log(`[dev-server] Ready at http://localhost:${port}`);
51
- // Graceful shutdown
51
+ // Graceful shutdown with timeout to avoid hanging on open connections
52
52
  let isShuttingDown = false;
53
53
  const shutdown = async () => {
54
54
  if (isShuttingDown)
55
55
  return;
56
56
  isShuttingDown = true;
57
57
  console.log('\n[dev-server] Shutting down...');
58
- await new Promise((resolve) => server.close(() => resolve()));
59
- await app.close();
60
- process.exit(0);
58
+ const forceExit = setTimeout(() => process.exit(0), 2000);
59
+ try {
60
+ server.closeAllConnections();
61
+ await Promise.all([
62
+ new Promise((resolve) => server.close(() => resolve())),
63
+ app.close(),
64
+ ]);
65
+ }
66
+ finally {
67
+ clearTimeout(forceExit);
68
+ process.exit(0);
69
+ }
61
70
  };
62
71
  process.on('SIGINT', shutdown);
63
72
  process.on('SIGTERM', shutdown);
@@ -1 +1 @@
1
- {"version":3,"file":"next.config.d.ts","sourceRoot":"","sources":["../../../../src/presentation/web/next.config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAgCvC,QAAA,MAAM,UAAU,EAAE,UAejB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"next.config.d.ts","sourceRoot":"","sources":["../../../../src/presentation/web/next.config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAgCvC,QAAA,MAAM,UAAU,EAAE,UASjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -28,14 +28,10 @@ function loadDevFallbacks() {
28
28
  }
29
29
  }
30
30
  const nextConfig = {
31
- // Enable Turbopack for faster development builds
32
- turbopack: {},
33
31
  // Enable typed routes (moved from experimental in Next.js 16)
34
32
  typedRoutes: true,
35
33
  // Configure the output directory
36
34
  distDir: '.next',
37
- // Native Node modules used by CLI infrastructure (server-side only)
38
- serverExternalPackages: ['better-sqlite3'],
39
35
  // Inject version info from package.json for the web UI
40
36
  env: loadDevFallbacks(),
41
37
  };