@shepai/cli 1.25.0 → 1.27.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 (241) hide show
  1. package/dist/packages/core/src/application/ports/output/index.d.ts +1 -1
  2. package/dist/packages/core/src/application/ports/output/index.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
  4. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/ports/output/services/notification-service.interface.d.ts +29 -0
  6. package/dist/packages/core/src/application/ports/output/services/notification-service.interface.d.ts.map +1 -0
  7. package/dist/packages/core/src/application/ports/output/services/notification-service.interface.js +12 -0
  8. package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts +3 -2
  9. package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.d.ts.map +1 -1
  10. package/dist/packages/core/src/application/use-cases/features/create/metadata-generator.js +36 -15
  11. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  12. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +13 -0
  13. package/dist/packages/core/src/domain/generated/output.d.ts +105 -0
  14. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  15. package/dist/packages/core/src/domain/generated/output.js +15 -0
  16. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/di/container.js +17 -0
  18. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +8 -0
  19. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +22 -0
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +14 -0
  23. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +17 -3
  25. package/dist/packages/core/src/infrastructure/services/ide-launchers/antigravity.launcher.d.ts.map +1 -1
  26. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.d.ts +17 -0
  27. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.d.ts.map +1 -0
  28. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js +24 -0
  29. package/dist/packages/core/src/infrastructure/services/ide-launchers/cursor.launcher.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/services/ide-launchers/ide-launcher.interface.d.ts.map +1 -1
  31. package/dist/packages/core/src/infrastructure/services/ide-launchers/ide-launcher.registry.d.ts.map +1 -1
  32. package/dist/packages/core/src/infrastructure/services/ide-launchers/launch-ide.d.ts +30 -0
  33. package/dist/packages/core/src/infrastructure/services/ide-launchers/launch-ide.d.ts.map +1 -0
  34. package/dist/packages/core/src/infrastructure/services/ide-launchers/launch-ide.js +41 -0
  35. package/dist/packages/core/src/infrastructure/services/ide-launchers/vscode.launcher.d.ts.map +1 -1
  36. package/dist/packages/core/src/infrastructure/services/ide-launchers/windsurf.launcher.d.ts.map +1 -1
  37. package/dist/packages/core/src/infrastructure/services/ide-launchers/zed.launcher.d.ts.map +1 -1
  38. package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts +22 -0
  39. package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts.map +1 -0
  40. package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.js +39 -0
  41. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts +52 -0
  42. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts.map +1 -0
  43. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.js +64 -0
  44. package/dist/packages/core/src/infrastructure/services/notifications/notification-watcher.service.d.ts +60 -0
  45. package/dist/packages/core/src/infrastructure/services/notifications/notification-watcher.service.d.ts.map +1 -0
  46. package/dist/packages/core/src/infrastructure/services/notifications/notification-watcher.service.js +225 -0
  47. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.d.ts +21 -0
  48. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.d.ts.map +1 -0
  49. package/dist/packages/core/src/infrastructure/services/notifications/notification.service.js +43 -0
  50. package/dist/packages/core/src/infrastructure/services/settings.service.d.ts +3 -1
  51. package/dist/packages/core/src/infrastructure/services/settings.service.d.ts.map +1 -1
  52. package/dist/packages/core/src/infrastructure/services/settings.service.js +27 -12
  53. package/dist/src/presentation/cli/commands/agent/show.command.d.ts.map +1 -1
  54. package/dist/src/presentation/cli/commands/agent/show.command.js +1 -8
  55. package/dist/src/presentation/cli/commands/feat/show.command.d.ts.map +1 -1
  56. package/dist/src/presentation/cli/commands/feat/show.command.js +1 -8
  57. package/dist/src/presentation/cli/commands/ide-open.command.d.ts.map +1 -1
  58. package/dist/src/presentation/cli/commands/ide-open.command.js +11 -21
  59. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  60. package/dist/src/presentation/cli/commands/ui.command.js +8 -0
  61. package/dist/src/presentation/web/app/api/agent-events/route.d.ts +14 -0
  62. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -0
  63. package/dist/src/presentation/web/app/api/agent-events/route.js +77 -0
  64. package/dist/src/presentation/web/app/api/ide/open/route.d.ts +9 -0
  65. package/dist/src/presentation/web/app/api/ide/open/route.d.ts.map +1 -0
  66. package/dist/src/presentation/web/app/api/ide/open/route.js +29 -0
  67. package/dist/src/presentation/web/app/api/shell/open/route.d.ts +9 -0
  68. package/dist/src/presentation/web/app/api/shell/open/route.d.ts.map +1 -0
  69. package/dist/src/presentation/web/app/api/shell/open/route.js +51 -0
  70. package/dist/src/presentation/web/app/api/validate-toolbar-input.d.ts +17 -0
  71. package/dist/src/presentation/web/app/api/validate-toolbar-input.d.ts.map +1 -0
  72. package/dist/src/presentation/web/app/api/validate-toolbar-input.js +25 -0
  73. package/dist/src/presentation/web/app/page.d.ts.map +1 -1
  74. package/dist/src/presentation/web/app/page.js +11 -12
  75. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  76. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +13 -4
  77. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts +8 -0
  78. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts.map +1 -1
  79. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +34 -3
  80. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts +14 -0
  81. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -0
  82. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.js +58 -0
  83. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +9 -2
  84. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  85. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +9 -0
  86. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  87. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +9 -7
  88. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  89. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +18 -0
  90. package/dist/src/presentation/web/components/common/index.d.ts +1 -0
  91. package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
  92. package/dist/src/presentation/web/components/common/index.js +1 -0
  93. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
  94. package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +16 -0
  95. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  96. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +2 -0
  97. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts.map +1 -1
  98. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +44 -0
  99. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  100. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +3 -0
  101. package/dist/src/presentation/web/components/ui/button.d.ts +1 -1
  102. package/dist/src/presentation/web/hooks/use-agent-events.d.ts +12 -0
  103. package/dist/src/presentation/web/hooks/use-agent-events.d.ts.map +1 -0
  104. package/dist/src/presentation/web/hooks/use-agent-events.js +58 -0
  105. package/dist/src/presentation/web/hooks/use-notifications.d.ts +10 -0
  106. package/dist/src/presentation/web/hooks/use-notifications.d.ts.map +1 -0
  107. package/dist/src/presentation/web/hooks/use-notifications.js +57 -0
  108. package/dist/src/presentation/web/hooks/use-notifications.stories.d.ts +6 -0
  109. package/dist/src/presentation/web/hooks/use-notifications.stories.d.ts.map +1 -0
  110. package/dist/src/presentation/web/hooks/use-notifications.stories.js +62 -0
  111. package/dist/tsconfig.build.tsbuildinfo +1 -1
  112. package/package.json +3 -1
  113. package/web/.next/BUILD_ID +1 -1
  114. package/web/.next/app-path-routes-manifest.json +3 -0
  115. package/web/.next/build-manifest.json +2 -2
  116. package/web/.next/cache/.previewinfo +1 -1
  117. package/web/.next/cache/.rscinfo +1 -1
  118. package/web/.next/cache/.tsbuildinfo +1 -1
  119. package/web/.next/cache/config.json +3 -3
  120. package/web/.next/fallback-build-manifest.json +2 -2
  121. package/web/.next/prerender-manifest.json +3 -3
  122. package/web/.next/required-server-files.js +1 -1
  123. package/web/.next/required-server-files.json +1 -1
  124. package/web/.next/routes-manifest.json +18 -0
  125. package/web/.next/server/app/_global-error/page.js +1 -1
  126. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  127. package/web/.next/server/app/_global-error.html +2 -2
  128. package/web/.next/server/app/_global-error.rsc +1 -1
  129. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  130. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  131. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  132. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  133. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  134. package/web/.next/server/app/_not-found/page.js +1 -1
  135. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  136. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  137. package/web/.next/server/app/_not-found.html +2 -2
  138. package/web/.next/server/app/_not-found.rsc +10 -10
  139. package/web/.next/server/app/_not-found.segments/_full.segment.rsc +10 -10
  140. package/web/.next/server/app/_not-found.segments/_head.segment.rsc +3 -3
  141. package/web/.next/server/app/_not-found.segments/_index.segment.rsc +6 -6
  142. package/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  143. package/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  144. package/web/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  145. package/web/.next/server/app/api/agent-events/route/app-paths-manifest.json +3 -0
  146. package/web/.next/server/app/api/agent-events/route/build-manifest.json +11 -0
  147. package/web/.next/server/app/api/agent-events/route/server-reference-manifest.json +4 -0
  148. package/web/.next/server/app/api/agent-events/route.js +6 -0
  149. package/web/.next/server/app/api/agent-events/route.js.map +5 -0
  150. package/web/.next/server/app/api/agent-events/route.js.nft.json +1 -0
  151. package/web/.next/server/app/api/agent-events/route_client-reference-manifest.js +2 -0
  152. package/web/.next/server/app/api/dialog/pick-files/route.js +2 -1
  153. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  154. package/web/.next/server/app/api/dialog/pick-folder/route.js +2 -1
  155. package/web/.next/server/app/api/dialog/pick-folder/route.js.nft.json +1 -1
  156. package/web/.next/server/app/api/features/create/route.js +2 -1
  157. package/web/.next/server/app/api/features/create/route.js.nft.json +1 -1
  158. package/web/.next/server/app/api/ide/open/route/app-paths-manifest.json +3 -0
  159. package/web/.next/server/app/api/ide/open/route/build-manifest.json +11 -0
  160. package/web/.next/server/app/api/ide/open/route/server-reference-manifest.json +4 -0
  161. package/web/.next/server/app/api/ide/open/route.js +8 -0
  162. package/web/.next/server/app/api/ide/open/route.js.map +5 -0
  163. package/web/.next/server/app/api/ide/open/route.js.nft.json +1 -0
  164. package/web/.next/server/app/api/ide/open/route_client-reference-manifest.js +2 -0
  165. package/web/.next/server/app/api/shell/open/route/app-paths-manifest.json +3 -0
  166. package/web/.next/server/app/api/shell/open/route/build-manifest.json +11 -0
  167. package/web/.next/server/app/api/shell/open/route/server-reference-manifest.json +4 -0
  168. package/web/.next/server/app/api/shell/open/route.js +7 -0
  169. package/web/.next/server/app/api/shell/open/route.js.map +5 -0
  170. package/web/.next/server/app/api/shell/open/route.js.nft.json +1 -0
  171. package/web/.next/server/app/api/shell/open/route_client-reference-manifest.js +2 -0
  172. package/web/.next/server/app/page.js +2 -2
  173. package/web/.next/server/app/page.js.nft.json +1 -1
  174. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  175. package/web/.next/server/app/version/page.js +1 -1
  176. package/web/.next/server/app/version/page.js.nft.json +1 -1
  177. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  178. package/web/.next/server/app/version.html +2 -2
  179. package/web/.next/server/app/version.rsc +5 -5
  180. package/web/.next/server/app/version.segments/_full.segment.rsc +5 -5
  181. package/web/.next/server/app/version.segments/_head.segment.rsc +1 -1
  182. package/web/.next/server/app/version.segments/_index.segment.rsc +4 -4
  183. package/web/.next/server/app/version.segments/_tree.segment.rsc +2 -2
  184. package/web/.next/server/app/version.segments/version/__PAGE__.segment.rsc +2 -2
  185. package/web/.next/server/app/version.segments/version.segment.rsc +1 -1
  186. package/web/.next/server/app-paths-manifest.json +3 -0
  187. package/web/.next/server/chunks/403f9_next_567de315._.js +17 -0
  188. package/web/.next/server/chunks/403f9_next_567de315._.js.map +1 -0
  189. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_12059e3e.js +3 -0
  190. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_12059e3e.js.map +1 -0
  191. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_agent-events_route_actions_686edb08.js +3 -0
  192. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_agent-events_route_actions_686edb08.js.map +1 -0
  193. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_shell_open_route_actions_814dc5b6.js +3 -0
  194. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_shell_open_route_actions_814dc5b6.js.map +1 -0
  195. package/web/.next/server/chunks/[root-of-the-server]__57104a4c._.js +7 -0
  196. package/web/.next/server/chunks/[root-of-the-server]__57104a4c._.js.map +1 -0
  197. package/web/.next/server/chunks/[root-of-the-server]__61349adc._.js +3 -0
  198. package/web/.next/server/chunks/[root-of-the-server]__61349adc._.js.map +1 -0
  199. package/web/.next/server/chunks/[root-of-the-server]__aa2074ca._.js +3 -0
  200. package/web/.next/server/chunks/[root-of-the-server]__aa2074ca._.js.map +1 -0
  201. package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js +3 -0
  202. package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js.map +1 -0
  203. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_ide_open_route_actions_9fe6e1cd.js +3 -0
  204. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_ide_open_route_actions_9fe6e1cd.js.map +1 -0
  205. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_dbf21e04.js +1 -1
  206. package/web/.next/server/chunks/ssr/[root-of-the-server]__80e5bed2._.js +1 -1
  207. package/web/.next/server/chunks/ssr/[root-of-the-server]__97377864._.js +3 -0
  208. package/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
  209. package/web/.next/server/chunks/ssr/[root-of-the-server]__f285e474._.js +3 -0
  210. package/web/.next/server/chunks/ssr/[root-of-the-server]__fa87595c._.js +1 -1
  211. package/web/.next/server/chunks/ssr/_09afa42a._.js +1 -1
  212. package/web/.next/server/chunks/ssr/_09afa42a._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/_884ddade._.js +1 -1
  214. package/web/.next/server/chunks/ssr/_c5d377cc._.js +1 -1
  215. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  216. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  217. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  218. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  219. package/web/.next/server/pages/404.html +2 -2
  220. package/web/.next/server/pages/500.html +2 -2
  221. package/web/.next/server/server-reference-manifest.js +1 -1
  222. package/web/.next/server/server-reference-manifest.json +1 -1
  223. package/web/.next/static/chunks/b32b17f102226f32.js +1 -0
  224. package/web/.next/static/chunks/d8905884f147599c.css +2 -0
  225. package/web/.next/static/chunks/{1c236dcc303f3033.js → fd961ef835ff4867.js} +2 -2
  226. package/web/.next/trace +1 -1
  227. package/web/.next/trace-build +1 -1
  228. package/web/.next/types/link.d.ts +3 -0
  229. package/web/.next/types/routes.d.ts +4 -1
  230. package/web/.next/types/validator.ts +27 -0
  231. package/web/.next/server/chunks/[root-of-the-server]__ba6c5641._.js +0 -21
  232. package/web/.next/server/chunks/[root-of-the-server]__ba6c5641._.js.map +0 -1
  233. package/web/.next/server/chunks/ssr/[root-of-the-server]__757c7912._.js +0 -3
  234. package/web/.next/server/chunks/ssr/[root-of-the-server]__dbd220d2._.js +0 -3
  235. package/web/.next/static/chunks/74748b4d725c5c74.css +0 -2
  236. package/web/.next/static/chunks/78ef4acb26e4d6ea.js +0 -1
  237. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__757c7912._.js.map → [root-of-the-server]__97377864._.js.map} +0 -0
  238. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__dbd220d2._.js.map → [root-of-the-server]__f285e474._.js.map} +0 -0
  239. /package/web/.next/static/{-dFLqLT3RMg1ueqbAhsJk → AmQVHj-yhxaqpAg8gC7MH}/_buildManifest.js +0 -0
  240. /package/web/.next/static/{-dFLqLT3RMg1ueqbAhsJk → AmQVHj-yhxaqpAg8gC7MH}/_clientMiddlewareManifest.json +0 -0
  241. /package/web/.next/static/{-dFLqLT3RMg1ueqbAhsJk → AmQVHj-yhxaqpAg8gC7MH}/_ssgManifest.js +0 -0
@@ -1,16 +1,18 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { XIcon } from 'lucide-react';
3
+ import { XIcon, Code2, Terminal, Loader2, CircleAlert } from 'lucide-react';
4
4
  import { cn } from '../../../lib/utils.js';
5
5
  import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerDescription, } from '../../ui/drawer.js';
6
+ import { Button } from '../../ui/button.js';
6
7
  import { Separator } from '../../ui/separator.js';
7
8
  import { CometSpinner } from '../../ui/comet-spinner.js';
8
9
  import { featureNodeStateConfig, lifecycleDisplayLabels } from '../../common/feature-node/index.js';
10
+ import { useFeatureActions } from './use-feature-actions.js';
9
11
  export function FeatureDrawer({ selectedNode, onClose }) {
10
12
  return (_jsx(Drawer, { direction: "right", modal: false, open: selectedNode !== null, onOpenChange: (open) => {
11
13
  if (!open)
12
14
  onClose();
13
- }, children: _jsx(DrawerContent, { direction: "right", className: "w-96", showCloseButton: false, children: selectedNode ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", "aria-label": "Close", onClick: onClose, className: "ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden", children: _jsx(XIcon, { className: "size-4" }) }), _jsxs(DrawerHeader, { "data-testid": "feature-drawer-header", children: [_jsx(DrawerTitle, { children: selectedNode.name }), _jsx(DrawerDescription, { children: selectedNode.featureId })] }), _jsx(Separator, {}), _jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[selectedNode.lifecycle] }), _jsx(StateBadge, { data: selectedNode }), selectedNode.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [selectedNode.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[selectedNode.state].progressClass), style: { width: `${selectedNode.progress}%` } }) })] })) : null] }), _jsx(Separator, {}), _jsx(DetailsSection, { data: selectedNode })] })) : null }) }));
15
+ }, children: _jsx(DrawerContent, { direction: "right", className: "w-96", showCloseButton: false, children: selectedNode ? (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", "aria-label": "Close", onClick: onClose, className: "ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden", children: _jsx(XIcon, { className: "size-4" }) }), _jsxs(DrawerHeader, { "data-testid": "feature-drawer-header", children: [_jsx(DrawerTitle, { children: selectedNode.name }), _jsx(DrawerDescription, { children: selectedNode.featureId })] }), selectedNode.repositoryPath && selectedNode.branch ? (_jsx(DrawerActions, { repositoryPath: selectedNode.repositoryPath, branch: selectedNode.branch })) : null, _jsx(Separator, {}), _jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[selectedNode.lifecycle] }), _jsx(StateBadge, { data: selectedNode }), selectedNode.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [selectedNode.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[selectedNode.state].progressClass), style: { width: `${selectedNode.progress}%` } }) })] })) : null] }), _jsx(Separator, {}), _jsx(DetailsSection, { data: selectedNode })] })) : null }) }));
14
16
  }
15
17
  function StateBadge({ data }) {
16
18
  const config = featureNodeStateConfig[data.state];
@@ -18,11 +20,18 @@ function StateBadge({ data }) {
18
20
  return (_jsxs("div", { className: cn('flex items-center gap-2 rounded-full px-3 py-1.5 text-sm font-medium', config.badgeBgClass, config.badgeClass), children: [data.state === 'running' ? (_jsx(CometSpinner, { size: "sm", className: "shrink-0" })) : (_jsx(Icon, { className: "h-4 w-4 shrink-0" })), _jsx("span", { children: config.label })] }));
19
21
  }
20
22
  function DetailsSection({ data }) {
21
- const hasAnyDetail = data.description ?? data.agentName ?? data.runtime ?? data.blockedBy ?? data.errorMessage;
23
+ const hasAnyDetail = data.description ?? data.agentType ?? data.runtime ?? data.blockedBy ?? data.errorMessage;
22
24
  if (!hasAnyDetail)
23
25
  return null;
24
- return (_jsxs("div", { "data-testid": "feature-drawer-details", className: "flex flex-col gap-3 p-4", children: [data.description ? _jsx(DetailRow, { label: "Description", value: data.description }) : null, data.agentName ? _jsx(DetailRow, { label: "Agent", value: data.agentName }) : null, data.runtime ? _jsx(DetailRow, { label: "Runtime", value: data.runtime }) : null, data.blockedBy ? _jsx(DetailRow, { label: "Blocked by", value: data.blockedBy }) : null, data.errorMessage ? _jsx(DetailRow, { label: "Error", value: data.errorMessage }) : null] }));
26
+ return (_jsxs("div", { "data-testid": "feature-drawer-details", className: "flex flex-col gap-3 p-4", children: [data.description ? _jsx(DetailRow, { label: "Description", value: data.description }) : null, data.agentType ? _jsx(DetailRow, { label: "Agent", value: data.agentType }) : null, data.runtime ? _jsx(DetailRow, { label: "Runtime", value: data.runtime }) : null, data.blockedBy ? _jsx(DetailRow, { label: "Blocked by", value: data.blockedBy }) : null, data.errorMessage ? _jsx(DetailRow, { label: "Error", value: data.errorMessage }) : null] }));
25
27
  }
26
28
  function DetailRow({ label, value }) {
27
29
  return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: label }), _jsx("span", { className: "text-sm", children: value })] }));
28
30
  }
31
+ function DrawerActions({ repositoryPath, branch }) {
32
+ const { openInIde, openInShell, ideLoading, shellLoading, ideError, shellError } = useFeatureActions({ repositoryPath, branch });
33
+ return (_jsxs("div", { className: "flex gap-2 px-4 pb-3", children: [_jsx(DrawerActionButton, { label: "Open in IDE", onClick: openInIde, loading: ideLoading, error: !!ideError, icon: Code2 }), _jsx(DrawerActionButton, { label: "Open in Shell", onClick: openInShell, loading: shellLoading, error: !!shellError, icon: Terminal })] }));
34
+ }
35
+ function DrawerActionButton({ label, onClick, loading, error, icon: Icon, }) {
36
+ return (_jsxs(Button, { variant: "outline", size: "sm", "aria-label": label, disabled: loading, onClick: onClick, className: cn('gap-1.5', error && 'text-destructive hover:text-destructive'), children: [loading ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : error ? (_jsx(CircleAlert, { className: "size-4" })) : (_jsx(Icon, { className: "size-4" })), label] }));
37
+ }
@@ -16,4 +16,12 @@ export declare const AllFields: Story;
16
16
  export declare const AllStates: Story;
17
17
  /** Cycle through all 6 lifecycle phases via buttons. */
18
18
  export declare const AllLifecycles: Story;
19
+ /** No repositoryPath — action buttons are hidden. */
20
+ export declare const NoRepositoryPath: Story;
21
+ /**
22
+ * Action buttons visible — click "Open in IDE" or "Open in Shell" to see
23
+ * loading spinner (while API call is in flight) followed by error state
24
+ * (API routes are not available in Storybook).
25
+ */
26
+ export declare const WithActionButtons: Story;
19
27
  //# sourceMappingURL=feature-drawer.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/feature-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAOpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,aAAa,CAAC,CAAC;AAoF5C,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAMF,wEAAwE;AACxE,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,SAAS,EAAE,KAmBvB,CAAC;AAuDF,0DAA0D;AAC1D,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AA2CF,wDAAwD;AACxD,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC"}
1
+ {"version":3,"file":"feature-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/feature-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAOpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,aAAa,CAAC,CAAC;AAgG5C,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAMF,wEAAwE;AACxE,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,SAAS,EAAE,KAqBvB,CAAC;AAuDF,0DAA0D;AAC1D,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AA6CF,wDAAwD;AACxD,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAMF,qDAAqD;AACrD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC"}
@@ -20,6 +20,8 @@ const baseData = {
20
20
  lifecycle: 'implementation',
21
21
  state: 'running',
22
22
  progress: 45,
23
+ repositoryPath: '/home/user/my-repo',
24
+ branch: 'feat/auth-module',
23
25
  };
24
26
  const runningData = {
25
27
  name: 'Auth Module',
@@ -28,7 +30,9 @@ const runningData = {
28
30
  lifecycle: 'implementation',
29
31
  state: 'running',
30
32
  progress: 45,
31
- agentName: 'Planner',
33
+ agentType: 'claude-code',
34
+ repositoryPath: '/home/user/my-repo',
35
+ branch: 'feat/auth-module',
32
36
  };
33
37
  const actionRequiredData = {
34
38
  name: 'API Rate Limiting',
@@ -37,6 +41,8 @@ const actionRequiredData = {
37
41
  lifecycle: 'requirements',
38
42
  state: 'action-required',
39
43
  progress: 22,
44
+ repositoryPath: '/home/user/my-repo',
45
+ branch: 'feat/api-rate-limiting',
40
46
  };
41
47
  const doneData = {
42
48
  name: 'Payment Gateway',
@@ -46,6 +52,8 @@ const doneData = {
46
52
  state: 'done',
47
53
  progress: 100,
48
54
  runtime: '1h 42m',
55
+ repositoryPath: '/home/user/my-repo',
56
+ branch: 'feat/payment-gateway',
49
57
  };
50
58
  const blockedData = {
51
59
  name: 'Search Index',
@@ -55,6 +63,8 @@ const blockedData = {
55
63
  state: 'blocked',
56
64
  progress: 20,
57
65
  blockedBy: 'Auth Module',
66
+ repositoryPath: '/home/user/my-repo',
67
+ branch: 'feat/search-index',
58
68
  };
59
69
  const errorData = {
60
70
  name: 'Email Service',
@@ -64,6 +74,8 @@ const errorData = {
64
74
  state: 'error',
65
75
  progress: 30,
66
76
  errorMessage: 'Build failed: type mismatch',
77
+ repositoryPath: '/home/user/my-repo',
78
+ branch: 'feat/email-service',
67
79
  };
68
80
  /* ---------------------------------------------------------------------------
69
81
  * Trigger wrapper — starts closed, click to open
@@ -106,10 +118,12 @@ export const AllFields = {
106
118
  lifecycle: 'implementation',
107
119
  state: 'running',
108
120
  progress: 68,
109
- agentName: 'Implementer',
121
+ agentType: 'cursor',
110
122
  runtime: '3h 15m',
111
123
  blockedBy: 'Database Migration',
112
124
  errorMessage: 'Token refresh failed: invalid_grant',
125
+ repositoryPath: '/home/user/enterprise-app',
126
+ branch: 'feat/enterprise-auth',
113
127
  }, label: "Open All Fields" })),
114
128
  };
115
129
  /* ---------------------------------------------------------------------------
@@ -155,7 +169,9 @@ function AllLifecyclesRender() {
155
169
  lifecycle: phase,
156
170
  state: 'running',
157
171
  progress: 50,
158
- agentName: 'Agent',
172
+ agentType: 'claude-code',
173
+ repositoryPath: '/home/user/my-repo',
174
+ branch: 'feat/feature-name',
159
175
  });
160
176
  }, className: `rounded-md px-3 py-1.5 text-left text-sm ${phase === lifecycle
161
177
  ? 'bg-primary text-primary-foreground'
@@ -165,3 +181,18 @@ function AllLifecyclesRender() {
165
181
  export const AllLifecycles = {
166
182
  render: () => _jsx(AllLifecyclesRender, {}),
167
183
  };
184
+ /* ---------------------------------------------------------------------------
185
+ * Action button stories
186
+ * ------------------------------------------------------------------------- */
187
+ /** No repositoryPath — action buttons are hidden. */
188
+ export const NoRepositoryPath = {
189
+ render: () => (_jsx(DrawerTrigger, { data: { ...baseData, repositoryPath: '', branch: '' }, label: "Open Without Repo Path" })),
190
+ };
191
+ /**
192
+ * Action buttons visible — click "Open in IDE" or "Open in Shell" to see
193
+ * loading spinner (while API call is in flight) followed by error state
194
+ * (API routes are not available in Storybook).
195
+ */
196
+ export const WithActionButtons = {
197
+ render: () => _jsx(DrawerTrigger, { data: runningData, label: "Open With Actions" }),
198
+ };
@@ -0,0 +1,14 @@
1
+ export interface FeatureActionsInput {
2
+ repositoryPath: string;
3
+ branch: string;
4
+ }
5
+ export interface FeatureActionsState {
6
+ openInIde: () => Promise<void>;
7
+ openInShell: () => Promise<void>;
8
+ ideLoading: boolean;
9
+ shellLoading: boolean;
10
+ ideError: string | null;
11
+ shellError: string | null;
12
+ }
13
+ export declare function useFeatureActions(input: FeatureActionsInput | null): FeatureActionsState;
14
+ //# sourceMappingURL=use-feature-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-feature-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/use-feature-actions.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,mBAAmB,CA0ExF"}
@@ -0,0 +1,58 @@
1
+ 'use client';
2
+ import { useState, useCallback, useRef, useEffect } from 'react';
3
+ const ERROR_CLEAR_DELAY = 5000;
4
+ export function useFeatureActions(input) {
5
+ const [ideLoading, setIdeLoading] = useState(false);
6
+ const [shellLoading, setShellLoading] = useState(false);
7
+ const [ideError, setIdeError] = useState(null);
8
+ const [shellError, setShellError] = useState(null);
9
+ const ideTimerRef = useRef(null);
10
+ const shellTimerRef = useRef(null);
11
+ // Clear timers on unmount
12
+ useEffect(() => {
13
+ const ideTimer = ideTimerRef.current;
14
+ const shellTimer = shellTimerRef.current;
15
+ return () => {
16
+ if (ideTimer)
17
+ clearTimeout(ideTimer);
18
+ if (shellTimer)
19
+ clearTimeout(shellTimer);
20
+ };
21
+ }, []);
22
+ const performAction = useCallback(async (url, setLoading, setError, timerRef, isLoading) => {
23
+ if (!input || isLoading)
24
+ return;
25
+ // Clear any existing timer
26
+ if (timerRef.current)
27
+ clearTimeout(timerRef.current);
28
+ setLoading(true);
29
+ setError(null);
30
+ try {
31
+ const response = await fetch(url, {
32
+ method: 'POST',
33
+ headers: { 'Content-Type': 'application/json' },
34
+ body: JSON.stringify({
35
+ repositoryPath: input.repositoryPath,
36
+ branch: input.branch,
37
+ }),
38
+ });
39
+ if (!response.ok) {
40
+ const data = await response.json();
41
+ const errorMessage = data.error ?? 'An unexpected error occurred';
42
+ setError(errorMessage);
43
+ timerRef.current = setTimeout(() => setError(null), ERROR_CLEAR_DELAY);
44
+ }
45
+ }
46
+ catch (err) {
47
+ const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred';
48
+ setError(errorMessage);
49
+ timerRef.current = setTimeout(() => setError(null), ERROR_CLEAR_DELAY);
50
+ }
51
+ finally {
52
+ setLoading(false);
53
+ }
54
+ }, [input]);
55
+ const openInIde = useCallback(() => performAction('/api/ide/open', setIdeLoading, setIdeError, ideTimerRef, ideLoading), [performAction, ideLoading]);
56
+ const openInShell = useCallback(() => performAction('/api/shell/open', setShellLoading, setShellError, shellTimerRef, shellLoading), [performAction, shellLoading]);
57
+ return { openInIde, openInShell, ideLoading, shellLoading, ideError, shellError };
58
+ }
@@ -1,9 +1,12 @@
1
1
  import { type LucideIcon } from 'lucide-react';
2
2
  import type { Node } from '@xyflow/react';
3
+ import type { AgentTypeValue } from './agent-type-icons.js';
3
4
  export type FeatureNodeState = 'running' | 'action-required' | 'done' | 'blocked' | 'error';
4
5
  export type FeatureLifecyclePhase = 'requirements' | 'research' | 'implementation' | 'review' | 'deploy' | 'maintain';
5
6
  /** Human-readable display labels for lifecycle phases. */
6
7
  export declare const lifecycleDisplayLabels: Record<FeatureLifecyclePhase, string>;
8
+ /** Present-participle verbs for the running badge, keyed by lifecycle phase. */
9
+ export declare const lifecycleRunningVerbs: Record<FeatureLifecyclePhase, string>;
7
10
  export interface FeatureNodeData {
8
11
  [key: string]: unknown;
9
12
  name: string;
@@ -12,14 +15,18 @@ export interface FeatureNodeData {
12
15
  lifecycle: FeatureLifecyclePhase;
13
16
  state: FeatureNodeState;
14
17
  progress: number;
18
+ /** Absolute path to the repository on disk */
19
+ repositoryPath: string;
20
+ /** Git branch name for this feature */
21
+ branch: string;
15
22
  /** Human-readable runtime for done state (e.g. "2h 15m") */
16
23
  runtime?: string;
17
24
  /** Feature name this node is blocked by */
18
25
  blockedBy?: string;
19
26
  /** Short error message for error state */
20
27
  errorMessage?: string;
21
- /** Agent name shown in the running badge (e.g. "Planner") */
22
- agentName?: string;
28
+ /** Agent executor type (e.g. "claude-code", "cursor"). */
29
+ agentType?: AgentTypeValue;
23
30
  onAction?: () => void;
24
31
  onSettings?: () => void;
25
32
  showHandles?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmD,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAE5F,MAAM,MAAM,qBAAqB,GAC7B,cAAc,GACd,UAAU,GACV,gBAAgB,GAChB,QAAQ,GACR,QAAQ,GACR,UAAU,CAAC;AAEf,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAOxE,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,qBAAqB,CAAC;IACjC,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAmDnF,CAAC"}
1
+ {"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmD,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAE5F,MAAM,MAAM,qBAAqB,GAC7B,cAAc,GACd,UAAU,GACV,gBAAgB,GAChB,QAAQ,GACR,QAAQ,GACR,UAAU,CAAC;AAEf,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAOxE,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAOvE,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,qBAAqB,CAAC;IACjC,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAmDnF,CAAC"}
@@ -8,6 +8,15 @@ export const lifecycleDisplayLabels = {
8
8
  deploy: 'DEPLOY & QA',
9
9
  maintain: 'COMPLETED',
10
10
  };
11
+ /** Present-participle verbs for the running badge, keyed by lifecycle phase. */
12
+ export const lifecycleRunningVerbs = {
13
+ requirements: 'Analyzing',
14
+ research: 'Researching',
15
+ implementation: 'Implementing',
16
+ review: 'Reviewing',
17
+ deploy: 'Deploying',
18
+ maintain: 'Maintaining',
19
+ };
11
20
  export const featureNodeStateConfig = {
12
21
  running: {
13
22
  icon: Loader2,
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAoBnE,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CA0IA"}
1
+ {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAwBnE,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAqJA"}
@@ -3,15 +3,17 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  import { Handle, Position } from '@xyflow/react';
4
4
  import { Settings, Plus } from 'lucide-react';
5
5
  import { cn } from '../../../lib/utils.js';
6
- import { CometSpinner } from '../../ui/comet-spinner.js';
7
- import { featureNodeStateConfig, lifecycleDisplayLabels } from './feature-node-state-config.js';
6
+ import { featureNodeStateConfig, lifecycleDisplayLabels, lifecycleRunningVerbs, } from './feature-node-state-config.js';
7
+ import { getAgentTypeIcon } from './agent-type-icons.js';
8
+ function AgentIcon({ agentType, className }) {
9
+ const IconComponent = getAgentTypeIcon(agentType);
10
+ return _jsx(IconComponent, { className: className });
11
+ }
8
12
  function getBadgeText(data) {
9
13
  const config = featureNodeStateConfig[data.state];
10
14
  switch (data.state) {
11
- case 'running': {
12
- const agent = data.agentName ?? 'Agent';
13
- return `${agent} ${data.featureId} running`;
14
- }
15
+ case 'running':
16
+ return lifecycleRunningVerbs[data.lifecycle];
15
17
  case 'done':
16
18
  return data.runtime ? `Completed in ${data.runtime}` : 'Completed';
17
19
  case 'blocked':
@@ -28,7 +30,7 @@ export function FeatureNode({ data, selected, }) {
28
30
  return (_jsxs("div", { className: "group relative", children: [data.showHandles ? (_jsx(Handle, { type: "target", position: Position.Left, isConnectable: false, className: "opacity-0!" })) : null, _jsxs("div", { "data-testid": "feature-node-card", className: cn('bg-card flex min-h-35 w-72 flex-col rounded-lg border p-3 shadow-sm', selected && 'ring-primary ring-2'), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { "data-testid": "feature-node-lifecycle-label", className: cn('text-[10px] font-semibold tracking-wider'), children: lifecycleDisplayLabels[data.lifecycle] }), data.onSettings ? (_jsx("button", { type: "button", "aria-label": "Settings", "data-testid": "feature-node-settings-button", onClick: (e) => {
29
31
  e.stopPropagation();
30
32
  data.onSettings?.();
31
- }, className: "nodrag text-muted-foreground hover:text-foreground -mt-1 -mr-1 p-1", children: _jsx(Settings, { className: "h-3.5 w-3.5" }) })) : null] }), _jsx("h3", { className: "mt-1 truncate text-sm font-bold", children: data.name }), data.description ? (_jsx("p", { "data-testid": "feature-node-description", className: "text-muted-foreground mt-0.5 truncate text-xs", children: data.description })) : null, _jsx("div", { className: "mt-auto pt-2", children: config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-[10px]", children: [_jsx("span", { children: data.featureId }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground text-[10px]", children: _jsx("span", { children: data.featureId }) }), _jsxs("div", { "data-testid": "feature-node-badge", className: cn('mt-1.5 flex items-center justify-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium', config.badgeBgClass, config.badgeClass), children: [data.state === 'running' ? (_jsx(CometSpinner, { size: "sm", className: "shrink-0" })) : (_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0" })), _jsx("span", { className: "truncate", children: getBadgeText(data) })] })] })) })] }), data.onAction ? (_jsx(Handle, { type: "source", position: Position.Right, className: "h-0! w-0! border-0! bg-transparent!", children: _jsx("button", { type: "button", "aria-label": "Add", "data-testid": "feature-node-action-button", onClick: (e) => {
33
+ }, className: "nodrag text-muted-foreground hover:text-foreground -mt-1 -mr-1 p-1", children: _jsx(Settings, { className: "h-3.5 w-3.5" }) })) : null] }), _jsx("h3", { className: "mt-1 truncate text-sm font-bold", children: data.name }), data.description ? (_jsx("p", { "data-testid": "feature-node-description", className: "text-muted-foreground mt-0.5 truncate text-xs", children: data.description })) : null, _jsx("div", { className: "mt-auto pt-2", children: data.state === 'running' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(AgentIcon, { agentType: data.agentType, className: "h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground flex items-center justify-end text-[10px]", children: _jsxs("span", { children: [data.progress, "%"] }) }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground text-[10px]", children: _jsx("span", { children: data.featureId }) }), _jsxs("div", { "data-testid": "feature-node-badge", className: cn('mt-1.5 flex items-center justify-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium', config.badgeBgClass, config.badgeClass), children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "truncate", children: getBadgeText(data) })] })] })) })] }), data.onAction ? (_jsx(Handle, { type: "source", position: Position.Right, className: "h-0! w-0! border-0! bg-transparent!", children: _jsx("button", { type: "button", "aria-label": "Add", "data-testid": "feature-node-action-button", onClick: (e) => {
32
34
  e.stopPropagation();
33
35
  data.onAction?.();
34
36
  }, className: "nodrag absolute top-1/2 left-1/2 flex h-6 w-6 -translate-x-1/2 -translate-y-1/2 cursor-pointer items-center justify-center rounded-full bg-blue-500 text-white opacity-0 shadow-md transition-opacity group-hover:opacity-100 hover:bg-blue-600", children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) })) : data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: false, className: "opacity-0!" })) : null] }));
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAiCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAe/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAiDF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAWF,eAAO,MAAM,aAAa,EAAE,KAoB3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAuEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC"}
1
+ {"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAIvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAiCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAe/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AA2DF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAWF,eAAO,MAAM,aAAa,EAAE,KAsB3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AA6EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC"}
@@ -38,6 +38,8 @@ const allStatesData = [
38
38
  state: 'running',
39
39
  progress: 45,
40
40
  agentName: 'Planner',
41
+ repositoryPath: '/home/user/my-repo',
42
+ branch: 'feat/auth-module',
41
43
  },
42
44
  {
43
45
  name: 'API Rate Limiting',
@@ -46,6 +48,8 @@ const allStatesData = [
46
48
  lifecycle: 'requirements',
47
49
  state: 'action-required',
48
50
  progress: 22,
51
+ repositoryPath: '/home/user/my-repo',
52
+ branch: 'feat/api-rate-limiting',
49
53
  },
50
54
  {
51
55
  name: 'Payment Gateway',
@@ -55,6 +59,8 @@ const allStatesData = [
55
59
  state: 'done',
56
60
  progress: 100,
57
61
  runtime: '1h 42m',
62
+ repositoryPath: '/home/user/my-repo',
63
+ branch: 'feat/payment-gateway',
58
64
  },
59
65
  {
60
66
  name: 'Search Index',
@@ -64,6 +70,8 @@ const allStatesData = [
64
70
  state: 'blocked',
65
71
  progress: 20,
66
72
  blockedBy: 'Auth Module',
73
+ repositoryPath: '/home/user/my-repo',
74
+ branch: 'feat/search-index',
67
75
  },
68
76
  {
69
77
  name: 'Email Service',
@@ -73,6 +81,8 @@ const allStatesData = [
73
81
  state: 'error',
74
82
  progress: 30,
75
83
  errorMessage: 'Build failed: type mismatch',
84
+ repositoryPath: '/home/user/my-repo',
85
+ branch: 'feat/email-service',
76
86
  },
77
87
  ];
78
88
  export const AllStates = {
@@ -95,6 +105,8 @@ export const AllLifecycles = {
95
105
  state: 'running',
96
106
  progress: [10, 25, 50, 70, 90, 100][i],
97
107
  agentName: 'Researcher',
108
+ repositoryPath: '/home/user/my-repo',
109
+ branch: 'feat/feature-name',
98
110
  } }, lifecycle))) })),
99
111
  };
100
112
  export const WithAction = {
@@ -161,6 +173,8 @@ const interactiveInitialNodes = [
161
173
  state: 'running',
162
174
  progress: 45,
163
175
  agentName: 'Planner',
176
+ repositoryPath: '/home/user/my-repo',
177
+ branch: 'feat/auth-module',
164
178
  },
165
179
  },
166
180
  {
@@ -176,6 +190,8 @@ const interactiveInitialNodes = [
176
190
  state: 'done',
177
191
  progress: 100,
178
192
  runtime: '1h 42m',
193
+ repositoryPath: '/home/user/my-repo',
194
+ branch: 'feat/payment-gateway',
179
195
  },
180
196
  },
181
197
  {
@@ -191,6 +207,8 @@ const interactiveInitialNodes = [
191
207
  state: 'error',
192
208
  progress: 30,
193
209
  errorMessage: 'Build failed: type mismatch',
210
+ repositoryPath: '/home/user/my-repo',
211
+ branch: 'feat/email-service',
194
212
  },
195
213
  },
196
214
  ];
@@ -4,6 +4,7 @@ export { EmptyState, type EmptyStateProps } from './empty-state/index.js';
4
4
  export { FeatureCreateDrawer, type FeatureCreateDrawerProps, type CreateFeatureFormData, } from './feature-create-drawer/index.js';
5
5
  export { FeatureDrawer, type FeatureDrawerProps } from './feature-drawer/index.js';
6
6
  export { FeatureListItem, type FeatureListItemProps } from './feature-list-item/index.js';
7
+ export { useFeatureActions, type FeatureActionsInput, type FeatureActionsState, } from './feature-drawer/use-feature-actions.js';
7
8
  export { FeatureNode, featureNodeStateConfig, type FeatureNodeState, type FeatureLifecyclePhase, type FeatureNodeData, type FeatureNodeType, type FeatureNodeStateConfig, } from './feature-node/index.js';
8
9
  export { FeatureStatusBadges, type FeatureStatusBadgesProps } from './feature-status-badges/index.js';
9
10
  export { FeatureStatusGroup, type FeatureStatusGroupProps } from './feature-status-group/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,GAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,GAC3B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,qBAAqB,GAC3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EACL,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -4,6 +4,7 @@ export { EmptyState } from './empty-state/index.js';
4
4
  export { FeatureCreateDrawer, } from './feature-create-drawer/index.js';
5
5
  export { FeatureDrawer } from './feature-drawer/index.js';
6
6
  export { FeatureListItem } from './feature-list-item/index.js';
7
+ export { useFeatureActions, } from './feature-drawer/use-feature-actions.js';
7
8
  export { FeatureNode, featureNodeStateConfig, } from './feature-node/index.js';
8
9
  export { FeatureStatusBadges } from './feature-status-badges/index.js';
9
10
  export { FeatureStatusGroup } from './feature-status-group/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"control-center.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOjD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAcpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA4DnC,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAQ1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAS7B,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,EAAE,KAYzB,CAAC;AA8HF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC"}
1
+ {"version":3,"file":"control-center.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOjD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAcpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAkEnC,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAQ1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAS7B,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,EAAE,KAYzB,CAAC;AAwIF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC"}
@@ -25,6 +25,8 @@ const featureNodes = [
25
25
  lifecycle: 'implementation',
26
26
  state: 'running',
27
27
  progress: 65,
28
+ repositoryPath: '/home/user/my-repo',
29
+ branch: 'feat/auth-module',
28
30
  },
29
31
  },
30
32
  {
@@ -38,6 +40,8 @@ const featureNodes = [
38
40
  lifecycle: 'research',
39
41
  state: 'action-required',
40
42
  progress: 20,
43
+ repositoryPath: '/home/user/my-repo',
44
+ branch: 'feat/user-dashboard',
41
45
  },
42
46
  },
43
47
  {
@@ -51,6 +55,8 @@ const featureNodes = [
51
55
  lifecycle: 'deploy',
52
56
  state: 'done',
53
57
  progress: 100,
58
+ repositoryPath: '/home/user/my-repo',
59
+ branch: 'feat/api-gateway',
54
60
  },
55
61
  },
56
62
  ];
@@ -148,6 +154,8 @@ const dagreFeatureNodes = [
148
154
  lifecycle: 'implementation',
149
155
  state: 'running',
150
156
  progress: 65,
157
+ repositoryPath: '/home/user/my-repo',
158
+ branch: 'feat/auth-module',
151
159
  },
152
160
  },
153
161
  {
@@ -161,6 +169,8 @@ const dagreFeatureNodes = [
161
169
  lifecycle: 'research',
162
170
  state: 'action-required',
163
171
  progress: 20,
172
+ repositoryPath: '/home/user/my-repo',
173
+ branch: 'feat/sso-integration',
164
174
  },
165
175
  },
166
176
  {
@@ -174,6 +184,8 @@ const dagreFeatureNodes = [
174
184
  lifecycle: 'requirements',
175
185
  state: 'running',
176
186
  progress: 10,
187
+ repositoryPath: '/home/user/my-repo',
188
+ branch: 'feat/user-dashboard',
177
189
  },
178
190
  },
179
191
  {
@@ -187,6 +199,8 @@ const dagreFeatureNodes = [
187
199
  lifecycle: 'deploy',
188
200
  state: 'done',
189
201
  progress: 100,
202
+ repositoryPath: '/home/user/my-repo',
203
+ branch: 'feat/api-gateway',
190
204
  },
191
205
  },
192
206
  {
@@ -201,6 +215,8 @@ const dagreFeatureNodes = [
201
215
  state: 'blocked',
202
216
  progress: 40,
203
217
  blockedBy: 'API Gateway',
218
+ repositoryPath: '/home/user/my-repo',
219
+ branch: 'feat/admin-panel',
204
220
  },
205
221
  },
206
222
  ];
@@ -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,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
+ {"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,CAqTpB"}
@@ -72,6 +72,8 @@ export function useControlCenterState(initialNodes, initialEdges) {
72
72
  lifecycle: 'requirements',
73
73
  state: 'running',
74
74
  progress: 0,
75
+ repositoryPath: dataOverride?.repositoryPath ?? '',
76
+ branch: dataOverride?.branch ?? '',
75
77
  };
76
78
  setNodes((currentNodes) => {
77
79
  // Find siblings connected to the same parent
@@ -1 +1 @@
1
- {"version":3,"file":"features-canvas.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/features-canvas.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOnD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,cAAc,CAcrC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAoJnC,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAKxB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAK3B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAK5B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAWzB,CAAC;AAwDF,eAAO,MAAM,mCAAmC,EAAE,KAOjD,CAAC;AAgCF,eAAO,MAAM,gCAAgC,EAAE,KAS9C,CAAC;AA0DF,eAAO,MAAM,gCAAgC,EAAE,KAW9C,CAAC;AAmDF,eAAO,MAAM,oBAAoB,EAAE,KAUlC,CAAC;AAmGF,eAAO,MAAM,oCAAoC,EAAE,KAOlD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KASvC,CAAC"}
1
+ {"version":3,"file":"features-canvas.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/features-canvas/features-canvas.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAOnD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,cAAc,CAcrC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAwKnC,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAKxB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAK3B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAK5B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAWzB,CAAC;AA4DF,eAAO,MAAM,mCAAmC,EAAE,KAOjD,CAAC;AAkCF,eAAO,MAAM,gCAAgC,EAAE,KAS9C,CAAC;AAgEF,eAAO,MAAM,gCAAgC,EAAE,KAW9C,CAAC;AAuDF,eAAO,MAAM,oBAAoB,EAAE,KAUlC,CAAC;AA2GF,eAAO,MAAM,oCAAoC,EAAE,KAOlD,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KASvC,CAAC"}