@shepai/cli 1.28.0 → 1.29.1

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 (165) hide show
  1. package/dist/packages/core/src/infrastructure/di/container.d.ts +6 -0
  2. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  3. package/dist/packages/core/src/infrastructure/di/container.js +24 -0
  4. package/dist/packages/core/src/infrastructure/index.d.ts +1 -1
  5. package/dist/packages/core/src/infrastructure/index.d.ts.map +1 -1
  6. package/dist/packages/core/src/infrastructure/index.js +1 -1
  7. package/dist/packages/core/src/infrastructure/services/filesystem/shep-directory.service.d.ts +12 -21
  8. package/dist/packages/core/src/infrastructure/services/filesystem/shep-directory.service.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/services/filesystem/shep-directory.service.js +27 -31
  10. package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +2 -2
  11. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js +2 -3
  13. package/dist/packages/core/src/infrastructure/services/settings.service.d.ts +1 -2
  14. package/dist/packages/core/src/infrastructure/services/settings.service.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/services/settings.service.js +1 -2
  16. package/dist/src/presentation/cli/commands/feat/new.command.js +2 -2
  17. package/dist/src/presentation/cli/commands/settings/init.command.d.ts.map +1 -1
  18. package/dist/src/presentation/cli/commands/settings/init.command.js +13 -0
  19. package/dist/src/presentation/cli/index.js +2 -6
  20. package/dist/src/presentation/web/app/api/features/[id]/route.d.ts +11 -0
  21. package/dist/src/presentation/web/app/api/features/[id]/route.d.ts.map +1 -0
  22. package/dist/src/presentation/web/app/api/features/[id]/route.js +17 -0
  23. package/dist/src/presentation/web/app/api/features/create/route.d.ts +1 -1
  24. package/dist/src/presentation/web/app/api/features/create/route.d.ts.map +1 -1
  25. package/dist/src/presentation/web/app/api/features/create/route.js +3 -2
  26. package/dist/src/presentation/web/app/page.d.ts +1 -1
  27. package/dist/src/presentation/web/app/page.d.ts.map +1 -1
  28. package/dist/src/presentation/web/app/page.js +6 -4
  29. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +1 -1
  30. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  31. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts +3 -1
  32. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  33. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +4 -3
  34. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts +6 -0
  35. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts.map +1 -1
  36. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +22 -0
  37. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  38. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
  39. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +3 -1
  40. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  41. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +27 -0
  42. package/dist/src/presentation/web/components/ui/alert-dialog.d.ts +19 -0
  43. package/dist/src/presentation/web/components/ui/alert-dialog.d.ts.map +1 -0
  44. package/dist/src/presentation/web/components/ui/alert-dialog.js +42 -0
  45. package/dist/src/presentation/web/components/ui/alert-dialog.stories.d.ts +9 -0
  46. package/dist/src/presentation/web/components/ui/alert-dialog.stories.d.ts.map +1 -0
  47. package/dist/src/presentation/web/components/ui/alert-dialog.stories.js +21 -0
  48. package/dist/src/presentation/web/dev-server.d.ts +1 -2
  49. package/dist/src/presentation/web/dev-server.d.ts.map +1 -1
  50. package/dist/src/presentation/web/dev-server.js +3 -5
  51. package/dist/src/presentation/web/instrumentation.d.ts +13 -0
  52. package/dist/src/presentation/web/instrumentation.d.ts.map +1 -0
  53. package/dist/src/presentation/web/instrumentation.js +14 -0
  54. package/dist/src/presentation/web/lib/server-container.d.ts +21 -0
  55. package/dist/src/presentation/web/lib/server-container.d.ts.map +1 -0
  56. package/dist/src/presentation/web/lib/server-container.js +26 -0
  57. package/dist/src/presentation/web/next.config.d.ts.map +1 -1
  58. package/dist/src/presentation/web/next.config.js +2 -0
  59. package/dist/tsconfig.build.tsbuildinfo +1 -1
  60. package/package.json +1 -1
  61. package/web/.next/BUILD_ID +1 -1
  62. package/web/.next/app-path-routes-manifest.json +1 -0
  63. package/web/.next/build-manifest.json +2 -2
  64. package/web/.next/cache/.previewinfo +1 -1
  65. package/web/.next/cache/.rscinfo +1 -1
  66. package/web/.next/cache/.tsbuildinfo +1 -1
  67. package/web/.next/cache/config.json +3 -3
  68. package/web/.next/fallback-build-manifest.json +2 -2
  69. package/web/.next/prerender-manifest.json +3 -3
  70. package/web/.next/required-server-files.js +8 -2
  71. package/web/.next/required-server-files.json +8 -2
  72. package/web/.next/routes-manifest.json +10 -1
  73. package/web/.next/server/app/_global-error.html +2 -2
  74. package/web/.next/server/app/_global-error.rsc +1 -1
  75. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  76. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  77. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  78. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  79. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  80. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  81. package/web/.next/server/app/_not-found.html +2 -2
  82. package/web/.next/server/app/_not-found.rsc +2 -2
  83. package/web/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  84. package/web/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  85. package/web/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  86. package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  87. package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  88. package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  89. package/web/.next/server/app/api/features/[id]/route/app-paths-manifest.json +3 -0
  90. package/web/.next/server/app/api/features/[id]/route/build-manifest.json +11 -0
  91. package/web/.next/server/app/api/features/[id]/route/server-reference-manifest.json +4 -0
  92. package/web/.next/server/app/api/features/[id]/route.js +7 -0
  93. package/web/.next/server/app/api/features/[id]/route.js.map +5 -0
  94. package/web/.next/server/app/api/features/[id]/route.js.nft.json +1 -0
  95. package/web/.next/server/app/api/features/[id]/route_client-reference-manifest.js +2 -0
  96. package/web/.next/server/app/api/features/create/route.js +1 -1
  97. package/web/.next/server/app/api/features/create/route.js.nft.json +1 -1
  98. package/web/.next/server/app/api/ide/open/route.js +1 -1
  99. package/web/.next/server/app/api/ide/open/route.js.nft.json +1 -1
  100. package/web/.next/server/app/api/shell/open/route.js +1 -1
  101. package/web/.next/server/app/api/shell/open/route.js.nft.json +1 -1
  102. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  103. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/version.html +2 -2
  105. package/web/.next/server/app/version.rsc +2 -2
  106. package/web/.next/server/app/version.segments/_full.segment.rsc +2 -2
  107. package/web/.next/server/app/version.segments/_head.segment.rsc +1 -1
  108. package/web/.next/server/app/version.segments/_index.segment.rsc +2 -2
  109. package/web/.next/server/app/version.segments/_tree.segment.rsc +2 -2
  110. package/web/.next/server/app/version.segments/version/__PAGE__.segment.rsc +1 -1
  111. package/web/.next/server/app/version.segments/version.segment.rsc +1 -1
  112. package/web/.next/server/app-paths-manifest.json +1 -0
  113. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_[id]_route_actions_03b9a4b5.js +3 -0
  114. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_[id]_route_actions_03b9a4b5.js.map +1 -0
  115. package/web/.next/server/chunks/[root-of-the-server]__0af905fe._.js +3 -0
  116. package/web/.next/server/chunks/[root-of-the-server]__0af905fe._.js.map +1 -0
  117. package/web/.next/server/chunks/[root-of-the-server]__3d63a020._.js +8 -0
  118. package/web/.next/server/chunks/[root-of-the-server]__3d63a020._.js.map +1 -0
  119. package/web/.next/server/chunks/[root-of-the-server]__72567d8d._.js +3 -0
  120. package/web/.next/server/chunks/[root-of-the-server]__72567d8d._.js.map +1 -0
  121. package/web/.next/server/chunks/[root-of-the-server]__acfd2769._.js +3 -0
  122. package/web/.next/server/chunks/[root-of-the-server]__acfd2769._.js.map +1 -0
  123. package/web/.next/server/chunks/src_presentation_web_instrumentation_ts_2b921ecb._.js +3 -0
  124. package/web/.next/server/chunks/src_presentation_web_instrumentation_ts_2b921ecb._.js.map +1 -0
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
  126. package/web/.next/server/chunks/ssr/_09afa42a._.js +8 -2
  127. package/web/.next/server/chunks/ssr/_09afa42a._.js.map +1 -1
  128. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  129. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  130. package/web/.next/server/edge/chunks/403f9_next_dist_esm_build_templates_edge-wrapper_f6192dd5.js.map +1 -0
  131. package/web/.next/server/edge/chunks/_5e9af917._.js +3 -0
  132. package/web/.next/server/edge/chunks/_5e9af917._.js.map +1 -0
  133. package/web/.next/server/edge/chunks/b35d5_next_dist_esm_build_templates_edge-wrapper_f6192dd5.js +6 -0
  134. package/web/.next/server/instrumentation/middleware-manifest.json +12 -0
  135. package/web/.next/server/instrumentation.js +4 -0
  136. package/web/.next/server/instrumentation.js.map +5 -0
  137. package/web/.next/server/instrumentation.js.nft.json +1 -0
  138. package/web/.next/server/pages/404.html +2 -2
  139. package/web/.next/server/pages/500.html +2 -2
  140. package/web/.next/server/server-reference-manifest.js +1 -1
  141. package/web/.next/server/server-reference-manifest.json +1 -1
  142. package/web/.next/static/chunks/{28c05929f2636c01.js → daacb9d30e4fc428.js} +9 -3
  143. package/web/.next/static/chunks/fd816afd85fd9a19.css +2 -0
  144. package/web/.next/trace +1 -1
  145. package/web/.next/trace-build +1 -1
  146. package/web/.next/types/link.d.ts +2 -1
  147. package/web/.next/types/routes.d.ts +2 -1
  148. package/web/.next/types/validator.ts +9 -0
  149. package/web/package.json +1 -0
  150. package/dist/packages/core/src/infrastructure/di/populate-use-cases-bridge.d.ts +0 -20
  151. package/dist/packages/core/src/infrastructure/di/populate-use-cases-bridge.d.ts.map +0 -1
  152. package/dist/packages/core/src/infrastructure/di/populate-use-cases-bridge.js +0 -29
  153. package/dist/packages/core/src/infrastructure/di/use-cases-bridge.d.ts +0 -42
  154. package/dist/packages/core/src/infrastructure/di/use-cases-bridge.d.ts.map +0 -1
  155. package/dist/packages/core/src/infrastructure/di/use-cases-bridge.js +0 -88
  156. package/web/.next/server/chunks/[root-of-the-server]__4e987cf3._.js +0 -8
  157. package/web/.next/server/chunks/[root-of-the-server]__4e987cf3._.js.map +0 -1
  158. package/web/.next/server/chunks/[root-of-the-server]__61349adc._.js +0 -3
  159. package/web/.next/server/chunks/[root-of-the-server]__61349adc._.js.map +0 -1
  160. package/web/.next/server/chunks/[root-of-the-server]__aa2074ca._.js +0 -3
  161. package/web/.next/server/chunks/[root-of-the-server]__aa2074ca._.js.map +0 -1
  162. package/web/.next/static/chunks/a7273c84449394e0.css +0 -2
  163. /package/web/.next/static/{wymVMk3X_cTuoYKeS0Gbf → xfxn0ObmVPrJQ_jxVxePe}/_buildManifest.js +0 -0
  164. /package/web/.next/static/{wymVMk3X_cTuoYKeS0Gbf → xfxn0ObmVPrJQ_jxVxePe}/_clientMiddlewareManifest.json +0 -0
  165. /package/web/.next/static/{wymVMk3X_cTuoYKeS0Gbf → xfxn0ObmVPrJQ_jxVxePe}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAK5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAoDzF"}
1
+ {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAK5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CA2DzF"}
@@ -6,12 +6,12 @@ import { FeatureDrawer, FeatureCreateDrawer } from '../../common/index.js';
6
6
  import { ControlCenterEmptyState } from './control-center-empty-state.js';
7
7
  import { useControlCenterState } from './use-control-center-state.js';
8
8
  export function ControlCenterInner({ initialNodes, initialEdges }) {
9
- const { nodes, edges, selectedNode, isCreateDrawerOpen, isSubmitting, pendingRepositoryPath, onNodesChange, handleConnect, handleAddFeature, handleAddFeatureToRepo, handleAddFeatureToFeature, handleAddRepository, handleNodeClick, clearSelection, handleCreateFeatureSubmit, closeCreateDrawer, } = useControlCenterState(initialNodes, initialEdges);
9
+ const { nodes, edges, selectedNode, isCreateDrawerOpen, isSubmitting, isDeleting, pendingRepositoryPath, onNodesChange, handleConnect, handleAddFeature, handleAddFeatureToRepo, handleAddFeatureToFeature, handleAddRepository, handleNodeClick, clearSelection, handleCreateFeatureSubmit, handleDeleteFeature, closeCreateDrawer, } = useControlCenterState(initialNodes, initialEdges);
10
10
  // Listen for global "open create drawer" events from the sidebar
11
11
  useEffect(() => {
12
12
  const handler = () => handleAddFeature();
13
13
  window.addEventListener('shep:open-create-drawer', handler);
14
14
  return () => window.removeEventListener('shep:open-create-drawer', handler);
15
15
  }, [handleAddFeature]);
16
- return (_jsxs(_Fragment, { children: [_jsx(FeaturesCanvas, { nodes: nodes, edges: edges, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeAction: handleAddFeatureToFeature, onNodeClick: handleNodeClick, onPaneClick: clearSelection, onRepositoryAdd: handleAddFeatureToRepo, onRepositorySelect: handleAddRepository, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: handleAddRepository }) }), _jsx(FeatureDrawer, { selectedNode: selectedNode, onClose: clearSelection }), _jsx(FeatureCreateDrawer, { open: isCreateDrawerOpen, onClose: closeCreateDrawer, onSubmit: handleCreateFeatureSubmit, repositoryPath: pendingRepositoryPath, isSubmitting: isSubmitting })] }));
16
+ return (_jsxs(_Fragment, { children: [_jsx(FeaturesCanvas, { nodes: nodes, edges: edges, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeAction: handleAddFeatureToFeature, onNodeClick: handleNodeClick, onPaneClick: clearSelection, onRepositoryAdd: handleAddFeatureToRepo, onRepositorySelect: handleAddRepository, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: handleAddRepository }) }), _jsx(FeatureDrawer, { selectedNode: selectedNode, onClose: clearSelection, onDelete: handleDeleteFeature, isDeleting: isDeleting }), _jsx(FeatureCreateDrawer, { open: isCreateDrawerOpen, onClose: closeCreateDrawer, onSubmit: handleCreateFeatureSubmit, repositoryPath: pendingRepositoryPath, isSubmitting: isSubmitting })] }));
17
17
  }
@@ -1,6 +1,6 @@
1
1
  import type { Connection, Edge, NodeChange } from '@xyflow/react';
2
2
  import type { FeatureNodeData } from '../../common/feature-node/index.js';
3
- import type { CreateFeatureInput } from '../../../../../../packages/core/src/infrastructure/di/use-cases-bridge.js';
3
+ import type { CreateFeatureInput } from '../../../../../../packages/core/src/application/use-cases/features/create/types.js';
4
4
  import type { CanvasNodeType } from '../../features/features-canvas/index.js';
5
5
  import { type LayoutDirection } from '../../../lib/layout-with-dagre.js';
6
6
  export interface ControlCenterState {
@@ -21,6 +21,8 @@ export interface ControlCenterState {
21
21
  handleLayout: (direction: LayoutDirection) => void;
22
22
  handleCreateFeatureSubmit: (data: CreateFeatureInput) => void;
23
23
  closeCreateDrawer: () => void;
24
+ handleDeleteFeature: (featureId: string) => Promise<void>;
25
+ isDeleting: boolean;
24
26
  }
25
27
  export declare function useControlCenterState(initialNodes: CanvasNodeType[], initialEdges: Edge[]): ControlCenterState;
26
28
  //# sourceMappingURL=use-control-center-state.d.ts.map
@@ -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":"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,kBAAkB,EAAE,MAAM,iDAAiD,CAAC;AAC1F,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,qBAAqB,EAAE,MAAM,CAAC;IAC9B,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,kBAAkB,KAAK,IAAI,CAAC;IAC9D,iBAAiB,EAAE,MAAM,IAAI,CAAC;CAC/B;AAID,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CA4SpB"}
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,kBAAkB,EAAE,MAAM,0DAA0D,CAAC;AACnG,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,qBAAqB,EAAE,MAAM,CAAC;IAC9B,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,kBAAkB,KAAK,IAAI,CAAC;IAC9D,iBAAiB,EAAE,MAAM,IAAI,CAAC;IAC9B,mBAAmB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,UAAU,EAAE,OAAO,CAAC;CACrB;AAID,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CA2UpB"}
@@ -12,6 +12,7 @@ export function useControlCenterState(initialNodes, initialEdges) {
12
12
  const [selectedNode, setSelectedNode] = useState(null);
13
13
  const [isCreateDrawerOpen, setIsCreateDrawerOpen] = useState(false);
14
14
  const [isSubmitting, setIsSubmitting] = useState(false);
15
+ const [isDeleting, setIsDeleting] = useState(false);
15
16
  const [pendingRepoNodeId, setPendingRepoNodeId] = useState(null);
16
17
  const onNodesChange = useCallback((changes) => {
17
18
  setNodes((ns) => applyNodeChanges(changes, ns));
@@ -196,6 +197,30 @@ export function useControlCenterState(initialNodes, initialEdges) {
196
197
  const closeCreateDrawer = useCallback(() => {
197
198
  setIsCreateDrawerOpen(false);
198
199
  }, []);
200
+ const handleDeleteFeature = useCallback(async (featureId) => {
201
+ setIsDeleting(true);
202
+ try {
203
+ const response = await fetch(`/api/features/${featureId}`, {
204
+ method: 'DELETE',
205
+ });
206
+ if (!response.ok) {
207
+ const body = await response.json();
208
+ toast.error(body.error ?? 'Failed to delete feature');
209
+ return;
210
+ }
211
+ setSelectedNode(null);
212
+ setNodes((prev) => prev.filter((n) => n.id !== featureId));
213
+ setEdges((prev) => prev.filter((e) => e.source !== featureId && e.target !== featureId));
214
+ toast.success('Feature deleted successfully');
215
+ router.refresh();
216
+ }
217
+ catch {
218
+ toast.error('Failed to delete feature');
219
+ }
220
+ finally {
221
+ setIsDeleting(false);
222
+ }
223
+ }, [router]);
199
224
  const handleAddFeatureToRepo = useCallback((repoNodeId) => {
200
225
  setSelectedNode(null);
201
226
  setPendingRepoNodeId(repoNodeId);
@@ -261,5 +286,7 @@ export function useControlCenterState(initialNodes, initialEdges) {
261
286
  handleLayout,
262
287
  handleCreateFeatureSubmit,
263
288
  closeCreateDrawer,
289
+ handleDeleteFeature,
290
+ isDeleting,
264
291
  };
265
292
  }
@@ -0,0 +1,19 @@
1
+ import * as React from 'react';
2
+ import { AlertDialog as AlertDialogPrimitive } from 'radix-ui';
3
+ import { Button } from '../ui/button.js';
4
+ declare function AlertDialog({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Root>): import("react/jsx-runtime").JSX.Element;
5
+ declare function AlertDialogTrigger({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Trigger>): import("react/jsx-runtime").JSX.Element;
6
+ declare function AlertDialogPortal({ ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Portal>): import("react/jsx-runtime").JSX.Element;
7
+ declare function AlertDialogOverlay({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Overlay>): import("react/jsx-runtime").JSX.Element;
8
+ declare function AlertDialogContent({ className, size, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Content> & {
9
+ size?: 'default' | 'sm';
10
+ }): import("react/jsx-runtime").JSX.Element;
11
+ declare function AlertDialogHeader({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
12
+ declare function AlertDialogFooter({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
13
+ declare function AlertDialogTitle({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Title>): import("react/jsx-runtime").JSX.Element;
14
+ declare function AlertDialogDescription({ className, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Description>): import("react/jsx-runtime").JSX.Element;
15
+ declare function AlertDialogMedia({ className, ...props }: React.ComponentProps<'div'>): import("react/jsx-runtime").JSX.Element;
16
+ declare function AlertDialogAction({ className, variant, size, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Action> & Pick<React.ComponentProps<typeof Button>, 'variant' | 'size'>): import("react/jsx-runtime").JSX.Element;
17
+ declare function AlertDialogCancel({ className, variant, size, ...props }: React.ComponentProps<typeof AlertDialogPrimitive.Cancel> & Pick<React.ComponentProps<typeof Button>, 'variant' | 'size'>): import("react/jsx-runtime").JSX.Element;
18
+ export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, };
19
+ //# sourceMappingURL=alert-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert-dialog.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/alert-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,WAAW,IAAI,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAG/D,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAEhD,iBAAS,WAAW,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,IAAI,CAAC,2CAExF;AAED,iBAAS,kBAAkB,CAAC,EAC1B,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAE3D;AAED,iBAAS,iBAAiB,CAAC,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,2CAEhG;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,2CAW3D;AAED,iBAAS,kBAAkB,CAAC,EAC1B,SAAS,EACT,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,OAAO,CAAC,GAAG;IAC7D,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CACzB,2CAeA;AAED,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAW9E;AAED,iBAAS,iBAAiB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAW9E;AAED,iBAAS,gBAAgB,CAAC,EACxB,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,KAAK,CAAC,2CAWzD;AAED,iBAAS,sBAAsB,CAAC,EAC9B,SAAS,EACT,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,WAAW,CAAC,2CAQ/D;AAED,iBAAS,gBAAgB,CAAC,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,2CAW7E;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,OAAmB,EACnB,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,GACzD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,2CAU9D;AAED,iBAAS,iBAAiB,CAAC,EACzB,SAAS,EACT,OAAmB,EACnB,IAAgB,EAChB,GAAG,KAAK,EACT,EAAE,KAAK,CAAC,cAAc,CAAC,OAAO,oBAAoB,CAAC,MAAM,CAAC,GACzD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC,2CAU9D;AAED,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GACnB,CAAC"}
@@ -0,0 +1,42 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { AlertDialog as AlertDialogPrimitive } from 'radix-ui';
4
+ import { cn } from '../../lib/utils.js';
5
+ import { Button } from '../ui/button.js';
6
+ function AlertDialog({ ...props }) {
7
+ return _jsx(AlertDialogPrimitive.Root, { "data-slot": "alert-dialog", ...props });
8
+ }
9
+ function AlertDialogTrigger({ ...props }) {
10
+ return _jsx(AlertDialogPrimitive.Trigger, { "data-slot": "alert-dialog-trigger", ...props });
11
+ }
12
+ function AlertDialogPortal({ ...props }) {
13
+ return _jsx(AlertDialogPrimitive.Portal, { "data-slot": "alert-dialog-portal", ...props });
14
+ }
15
+ function AlertDialogOverlay({ className, ...props }) {
16
+ return (_jsx(AlertDialogPrimitive.Overlay, { "data-slot": "alert-dialog-overlay", className: cn('data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50', className), ...props }));
17
+ }
18
+ function AlertDialogContent({ className, size = 'default', ...props }) {
19
+ return (_jsxs(AlertDialogPortal, { children: [_jsx(AlertDialogOverlay, {}), _jsx(AlertDialogPrimitive.Content, { "data-slot": "alert-dialog-content", "data-size": size, className: cn('bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 group/alert-dialog-content fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 data-[size=sm]:max-w-xs data-[size=default]:sm:max-w-lg', className), ...props })] }));
20
+ }
21
+ function AlertDialogHeader({ className, ...props }) {
22
+ return (_jsx("div", { "data-slot": "alert-dialog-header", className: cn('grid grid-rows-[auto_1fr] place-items-center gap-1.5 text-center has-data-[slot=alert-dialog-media]:grid-rows-[auto_auto_1fr] has-data-[slot=alert-dialog-media]:gap-x-6 sm:group-data-[size=default]/alert-dialog-content:place-items-start sm:group-data-[size=default]/alert-dialog-content:text-left sm:group-data-[size=default]/alert-dialog-content:has-data-[slot=alert-dialog-media]:grid-rows-[auto_1fr]', className), ...props }));
23
+ }
24
+ function AlertDialogFooter({ className, ...props }) {
25
+ return (_jsx("div", { "data-slot": "alert-dialog-footer", className: cn('flex flex-col-reverse gap-2 group-data-[size=sm]/alert-dialog-content:grid group-data-[size=sm]/alert-dialog-content:grid-cols-2 sm:flex-row sm:justify-end', className), ...props }));
26
+ }
27
+ function AlertDialogTitle({ className, ...props }) {
28
+ return (_jsx(AlertDialogPrimitive.Title, { "data-slot": "alert-dialog-title", className: cn('text-lg font-semibold sm:group-data-[size=default]/alert-dialog-content:group-has-data-[slot=alert-dialog-media]/alert-dialog-content:col-start-2', className), ...props }));
29
+ }
30
+ function AlertDialogDescription({ className, ...props }) {
31
+ return (_jsx(AlertDialogPrimitive.Description, { "data-slot": "alert-dialog-description", className: cn('text-muted-foreground text-sm', className), ...props }));
32
+ }
33
+ function AlertDialogMedia({ className, ...props }) {
34
+ return (_jsx("div", { "data-slot": "alert-dialog-media", className: cn("bg-muted mb-2 inline-flex size-16 items-center justify-center rounded-md sm:group-data-[size=default]/alert-dialog-content:row-span-2 *:[svg:not([class*='size-'])]:size-8", className), ...props }));
35
+ }
36
+ function AlertDialogAction({ className, variant = 'default', size = 'default', ...props }) {
37
+ return (_jsx(Button, { variant: variant, size: size, asChild: true, children: _jsx(AlertDialogPrimitive.Action, { "data-slot": "alert-dialog-action", className: cn(className), ...props }) }));
38
+ }
39
+ function AlertDialogCancel({ className, variant = 'outline', size = 'default', ...props }) {
40
+ return (_jsx(Button, { variant: variant, size: size, asChild: true, children: _jsx(AlertDialogPrimitive.Cancel, { "data-slot": "alert-dialog-cancel", className: cn(className), ...props }) }));
41
+ }
42
+ export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, };
@@ -0,0 +1,9 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { AlertDialog } from './alert-dialog.js';
3
+ declare const meta: Meta<typeof AlertDialog>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof meta>;
6
+ export declare const Default: Story;
7
+ export declare const DestructiveAction: Story;
8
+ export declare const WithDescription: Story;
9
+ //# sourceMappingURL=alert-dialog.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert-dialog.stories.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/alert-dialog.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,WAAW,EASZ,MAAM,gBAAgB,CAAC;AAGxB,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAOlC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAoBrB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAqB/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAqB7B,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from './alert-dialog.js';
3
+ import { Button } from './button.js';
4
+ const meta = {
5
+ title: 'Primitives/AlertDialog',
6
+ component: AlertDialog,
7
+ parameters: {
8
+ layout: 'centered',
9
+ },
10
+ tags: ['autodocs'],
11
+ };
12
+ export default meta;
13
+ export const Default = {
14
+ render: () => (_jsxs(AlertDialog, { children: [_jsx(AlertDialogTrigger, { asChild: true, children: _jsx(Button, { variant: "outline", children: "Show Dialog" }) }), _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Are you sure?" }), _jsx(AlertDialogDescription, { children: "This action cannot be undone. This will permanently apply the changes." })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: "Cancel" }), _jsx(AlertDialogAction, { children: "Continue" })] })] })] })),
15
+ };
16
+ export const DestructiveAction = {
17
+ render: () => (_jsxs(AlertDialog, { children: [_jsx(AlertDialogTrigger, { asChild: true, children: _jsx(Button, { variant: "destructive", children: "Delete Account" }) }), _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Delete account?" }), _jsx(AlertDialogDescription, { children: "This will permanently delete your account and remove all associated data. This action cannot be undone." })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: "Cancel" }), _jsx(AlertDialogAction, { variant: "destructive", children: "Delete" })] })] })] })),
18
+ };
19
+ export const WithDescription = {
20
+ render: () => (_jsxs(AlertDialog, { children: [_jsx(AlertDialogTrigger, { asChild: true, children: _jsx(Button, { variant: "outline", children: "Discard Changes" }) }), _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Discard unsaved changes?" }), _jsxs(AlertDialogDescription, { children: ["You have unsaved changes in ", _jsx("strong", { children: "3 files" }), ". If you discard now, all changes will be lost and cannot be recovered."] })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { children: "Keep Editing" }), _jsx(AlertDialogAction, { variant: "destructive", children: "Discard" })] })] })] })),
21
+ };
@@ -2,8 +2,7 @@
2
2
  * Web UI Development Server
3
3
  *
4
4
  * Initializes the DI container (same as CLI bootstrap) and starts Next.js
5
- * programmatically in dev mode. This ensures the globalThis.__shepUseCases
6
- * bridge is available when running `pnpm dev:web` standalone.
5
+ * programmatically in dev mode.
7
6
  *
8
7
  * Run via: tsx --tsconfig ../../tsconfig.json dev-server.ts
9
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../../../../src/presentation/web/dev-server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,kBAAkB,CAAC"}
1
+ {"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../../../../src/presentation/web/dev-server.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,kBAAkB,CAAC"}
@@ -2,8 +2,7 @@
2
2
  * Web UI Development Server
3
3
  *
4
4
  * Initializes the DI container (same as CLI bootstrap) and starts Next.js
5
- * programmatically in dev mode. This ensures the globalThis.__shepUseCases
6
- * bridge is available when running `pnpm dev:web` standalone.
5
+ * programmatically in dev mode.
7
6
  *
8
7
  * Run via: tsx --tsconfig ../../tsconfig.json dev-server.ts
9
8
  */
@@ -15,7 +14,6 @@ import http from 'node:http';
15
14
  import { initializeContainer, container } from '../../../packages/core/src/infrastructure/di/container.js';
16
15
  import { InitializeSettingsUseCase } from '../../../packages/core/src/application/use-cases/settings/initialize-settings.use-case.js';
17
16
  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
17
  const DEFAULT_PORT = 3000;
20
18
  async function main() {
21
19
  const port = parseInt(process.env.PORT ?? '', 10) || DEFAULT_PORT;
@@ -23,11 +21,11 @@ async function main() {
23
21
  // Same as CLI bootstrap (src/presentation/cli/index.ts:52-58)
24
22
  try {
25
23
  await initializeContainer();
24
+ // Expose the DI container on globalThis for the web UI's server-side code
25
+ globalThis.__shepContainer = container;
26
26
  const initSettingsUseCase = container.resolve(InitializeSettingsUseCase);
27
27
  const settings = await initSettingsUseCase.execute();
28
28
  initializeSettings(settings);
29
- populateUseCasesBridge(container);
30
- console.log('[dev-server] DI bridge initialized');
31
29
  }
32
30
  catch (error) {
33
31
  console.warn('[dev-server] DI initialization failed — features will be empty:', error);
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Next.js Instrumentation — intentionally empty.
3
+ *
4
+ * The DI container is initialized BEFORE Next.js starts:
5
+ * - Production: CLI bootstrap (src/presentation/cli/index.ts) → `shep ui`
6
+ * - Dev mode: dev-server.ts → `pnpm dev:web`
7
+ * - E2E tests: Playwright webServer command uses dev-server.ts
8
+ *
9
+ * Turbopack cannot bundle tsyringe, reflect-metadata, or better-sqlite3,
10
+ * so container initialization must happen outside the Next.js bundle.
11
+ */
12
+ export declare function register(): void;
13
+ //# sourceMappingURL=instrumentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentation.d.ts","sourceRoot":"","sources":["../../../../src/presentation/web/instrumentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,SAEvB"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Next.js Instrumentation — intentionally empty.
3
+ *
4
+ * The DI container is initialized BEFORE Next.js starts:
5
+ * - Production: CLI bootstrap (src/presentation/cli/index.ts) → `shep ui`
6
+ * - Dev mode: dev-server.ts → `pnpm dev:web`
7
+ * - E2E tests: Playwright webServer command uses dev-server.ts
8
+ *
9
+ * Turbopack cannot bundle tsyringe, reflect-metadata, or better-sqlite3,
10
+ * so container initialization must happen outside the Next.js bundle.
11
+ */
12
+ export function register() {
13
+ // no-op: container already on globalThis.__shepContainer
14
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Server Container Accessor
3
+ *
4
+ * Provides a `resolve()` helper for server components and API routes to
5
+ * obtain DI-managed instances. The tsyringe container is placed on globalThis
6
+ * by the CLI bootstrap (`shep ui`) or the dev-server (`pnpm dev:web`).
7
+ */
8
+ import type { InjectionToken } from 'tsyringe';
9
+ /**
10
+ * Resolve a dependency from the DI container.
11
+ *
12
+ * Usage in server components / API routes:
13
+ * ```ts
14
+ * import { resolve } from './server-container.js';
15
+ * import { ListFeaturesUseCase } from '../../../../packages/core/src/application/use-cases/features/list-features.use-case.js';
16
+ *
17
+ * const features = await resolve(ListFeaturesUseCase).execute();
18
+ * ```
19
+ */
20
+ export declare function resolve<T>(token: InjectionToken<T>): T;
21
+ //# sourceMappingURL=server-container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-container.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/server-container.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAuB,cAAc,EAAE,MAAM,UAAU,CAAC;AAIpE;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAYtD"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Server Container Accessor
3
+ *
4
+ * Provides a `resolve()` helper for server components and API routes to
5
+ * obtain DI-managed instances. The tsyringe container is placed on globalThis
6
+ * by the CLI bootstrap (`shep ui`) or the dev-server (`pnpm dev:web`).
7
+ */
8
+ const CONTAINER_KEY = '__shepContainer';
9
+ /**
10
+ * Resolve a dependency from the DI container.
11
+ *
12
+ * Usage in server components / API routes:
13
+ * ```ts
14
+ * import { resolve } from './server-container.js';
15
+ * import { ListFeaturesUseCase } from '../../../../packages/core/src/application/use-cases/features/list-features.use-case.js';
16
+ *
17
+ * const features = await resolve(ListFeaturesUseCase).execute();
18
+ * ```
19
+ */
20
+ export function resolve(token) {
21
+ const container = globalThis[CONTAINER_KEY];
22
+ if (!container) {
23
+ throw new Error('DI container not available. Ensure the CLI bootstrap or dev-server has initialized it.');
24
+ }
25
+ return container.resolve(token);
26
+ }
@@ -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,UASjB,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,UAYjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -28,6 +28,8 @@ function loadDevFallbacks() {
28
28
  }
29
29
  }
30
30
  const nextConfig = {
31
+ // Exclude native/DI packages from Next.js bundling
32
+ serverExternalPackages: ['tsyringe', 'reflect-metadata', 'better-sqlite3'],
31
33
  // Enable typed routes (moved from experimental in Next.js 16)
32
34
  typedRoutes: true,
33
35
  // Configure the output directory