@shepai/cli 1.122.2-pr390.b1ef40f → 1.122.2-pr394.a603264

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 (296) hide show
  1. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts +11 -0
  2. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/services/worktree-service.interface.d.ts +15 -0
  4. package/dist/packages/core/src/application/ports/output/services/worktree-service.interface.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.d.ts +40 -0
  6. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.d.ts.map +1 -0
  7. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.js +146 -0
  8. package/dist/packages/core/src/application/use-cases/features/branch-name-utils.d.ts +33 -0
  9. package/dist/packages/core/src/application/use-cases/features/branch-name-utils.d.ts.map +1 -0
  10. package/dist/packages/core/src/application/use-cases/features/branch-name-utils.js +77 -0
  11. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/di/container.js +5 -0
  13. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts +1 -0
  14. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +8 -0
  16. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts +1 -0
  17. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +15 -0
  19. package/dist/src/presentation/cli/commands/feat/adopt.command.d.ts +14 -0
  20. package/dist/src/presentation/cli/commands/feat/adopt.command.d.ts.map +1 -0
  21. package/dist/src/presentation/cli/commands/feat/adopt.command.js +43 -0
  22. package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
  23. package/dist/src/presentation/cli/commands/feat/index.js +3 -1
  24. package/dist/src/presentation/web/app/(dashboard)/@drawer/adopt/page.d.ts +10 -0
  25. package/dist/src/presentation/web/app/(dashboard)/@drawer/adopt/page.d.ts.map +1 -0
  26. package/dist/src/presentation/web/app/(dashboard)/@drawer/adopt/page.js +22 -0
  27. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts +0 -6
  28. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  29. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +0 -60
  30. package/dist/src/presentation/web/app/actions/adopt-branch.d.ts +11 -0
  31. package/dist/src/presentation/web/app/actions/adopt-branch.d.ts.map +1 -0
  32. package/dist/src/presentation/web/app/actions/adopt-branch.js +20 -0
  33. package/dist/src/presentation/web/app/build-graph-nodes.d.ts +0 -7
  34. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  35. package/dist/src/presentation/web/app/build-graph-nodes.js +0 -7
  36. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.d.ts +9 -0
  37. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.d.ts.map +1 -0
  38. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.js +27 -0
  39. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.stories.d.ts +32 -0
  40. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.stories.d.ts.map +1 -0
  41. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.stories.js +115 -0
  42. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-drawer-client.d.ts +5 -0
  43. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-drawer-client.d.ts.map +1 -0
  44. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-drawer-client.js +56 -0
  45. package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts +0 -8
  46. package/dist/src/presentation/web/components/common/repository-node/repository-node-config.d.ts.map +1 -1
  47. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +6 -6
  49. package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.d.ts +0 -2
  50. package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.d.ts.map +1 -1
  51. package/dist/src/presentation/web/components/common/repository-node/repository-node.stories.js +17 -107
  52. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  53. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +12 -3
  54. package/dist/src/presentation/web/lib/layout-with-dagre.js +1 -1
  55. package/dist/tsconfig.build.tsbuildinfo +1 -1
  56. package/package.json +1 -1
  57. package/web/.next/BUILD_ID +1 -1
  58. package/web/.next/app-path-routes-manifest.json +1 -0
  59. package/web/.next/build-manifest.json +4 -4
  60. package/web/.next/fallback-build-manifest.json +2 -2
  61. package/web/.next/prerender-manifest.json +3 -3
  62. package/web/.next/required-server-files.js +1 -1
  63. package/web/.next/required-server-files.json +1 -1
  64. package/web/.next/routes-manifest.json +6 -0
  65. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/app-paths-manifest.json +3 -0
  66. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/build-manifest.json +18 -0
  67. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/next-font-manifest.json +6 -0
  68. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/react-loadable-manifest.json +1 -0
  69. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +320 -0
  70. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +20 -0
  71. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.map +5 -0
  72. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -0
  73. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +2 -0
  74. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +2 -2
  75. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +22 -22
  76. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  77. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  78. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +2 -2
  80. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  81. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
  82. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  83. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +2 -2
  85. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +28 -28
  86. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  87. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  88. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +2 -2
  90. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  91. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  92. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  93. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +2 -2
  95. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +22 -22
  96. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  97. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  98. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  99. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +2 -2
  100. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  101. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
  102. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  103. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +2 -2
  105. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +28 -28
  106. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  107. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  108. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  109. package/web/.next/server/app/(dashboard)/page/build-manifest.json +2 -2
  110. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +20 -20
  111. package/web/.next/server/app/(dashboard)/page.js +2 -2
  112. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  113. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  114. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +2 -2
  115. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  116. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  117. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  118. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
  120. package/web/.next/server/app/_global-error.html +2 -2
  121. package/web/.next/server/app/_global-error.rsc +1 -1
  122. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  123. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  124. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  125. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  126. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  127. package/web/.next/server/app/_not-found/page/build-manifest.json +2 -2
  128. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  129. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  130. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  131. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  132. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  133. package/web/.next/server/app/api/graph-data/route.js +1 -1
  134. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  135. package/web/.next/server/app/settings/page/build-manifest.json +2 -2
  136. package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
  137. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  138. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  139. package/web/.next/server/app/skills/page/build-manifest.json +2 -2
  140. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  141. package/web/.next/server/app/skills/page.js +4 -4
  142. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  143. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/app/tools/page/build-manifest.json +2 -2
  145. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  146. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  147. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  148. package/web/.next/server/app/version/page/build-manifest.json +2 -2
  149. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  150. package/web/.next/server/app/version/page.js.nft.json +1 -1
  151. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  152. package/web/.next/server/app-paths-manifest.json +1 -0
  153. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  154. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  155. package/web/.next/server/chunks/[root-of-the-server]__42b7ab55._.js +3 -0
  156. package/web/.next/server/chunks/{[root-of-the-server]__dcd4f847._.js.map → [root-of-the-server]__42b7ab55._.js.map} +1 -1
  157. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  158. package/web/.next/server/chunks/ssr/403f9_next_dist_31ea46d3._.js +1 -1
  159. package/web/.next/server/chunks/ssr/403f9_next_dist_c9d9b4d7._.js +1 -1
  160. package/web/.next/server/chunks/ssr/403f9_next_dist_client_components_94d75bc3._.js +3 -0
  161. package/web/.next/server/chunks/ssr/403f9_next_dist_client_components_94d75bc3._.js.map +1 -0
  162. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_0b3f4f0d.js +3 -0
  163. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_0b3f4f0d.js.map +1 -0
  164. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_adopt-drawer-client_tsx_6c5e4bbb._.js +3 -0
  165. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_adopt-drawer-client_tsx_6c5e4bbb._.js.map +1 -0
  166. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  167. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js +1 -1
  169. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js.map +1 -1
  170. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js +1 -1
  171. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +1 -1
  173. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9e8b25ad._.js → [root-of-the-server]__2698e9f4._.js} +2 -2
  174. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9e8b25ad._.js.map → [root-of-the-server]__2698e9f4._.js.map} +1 -1
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  180. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  181. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +2 -2
  182. package/web/.next/server/chunks/ssr/{[root-of-the-server]__7cbda1ea._.js → [root-of-the-server]__8e3bf5d7._.js} +2 -2
  183. package/web/.next/server/chunks/ssr/{[root-of-the-server]__7cbda1ea._.js.map → [root-of-the-server]__8e3bf5d7._.js.map} +1 -1
  184. package/web/.next/server/chunks/ssr/{[root-of-the-server]__14664e9b._.js → [root-of-the-server]__a022445f._.js} +3 -3
  185. package/web/.next/server/chunks/ssr/{[root-of-the-server]__14664e9b._.js.map → [root-of-the-server]__a022445f._.js.map} +1 -1
  186. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +2 -2
  187. package/web/.next/server/chunks/ssr/[root-of-the-server]__b724df9e._.js +3 -0
  188. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6677a82c._.js.map → [root-of-the-server]__b724df9e._.js.map} +1 -1
  189. package/web/.next/server/chunks/ssr/{[root-of-the-server]__aed1d6f8._.js → [root-of-the-server]__c07f9f79._.js} +2 -2
  190. package/web/.next/server/chunks/ssr/{[root-of-the-server]__aed1d6f8._.js.map → [root-of-the-server]__c07f9f79._.js.map} +1 -1
  191. package/web/.next/server/chunks/ssr/{[root-of-the-server]__ce6057f6._.js → [root-of-the-server]__c605a375._.js} +2 -2
  192. package/web/.next/server/chunks/ssr/{[root-of-the-server]__ce6057f6._.js.map → [root-of-the-server]__c605a375._.js.map} +1 -1
  193. package/web/.next/server/chunks/ssr/[root-of-the-server]__e2227c0f._.js +3 -0
  194. package/web/.next/server/chunks/ssr/[root-of-the-server]__e2227c0f._.js.map +1 -0
  195. package/web/.next/server/chunks/ssr/[root-of-the-server]__ec26e818._.js +3 -0
  196. package/web/.next/server/chunks/ssr/[root-of-the-server]__ec26e818._.js.map +1 -0
  197. package/web/.next/server/chunks/ssr/[root-of-the-server]__f0589cc3._.js +3 -0
  198. package/web/.next/server/chunks/ssr/[root-of-the-server]__f0589cc3._.js.map +1 -0
  199. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  200. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  201. package/web/.next/server/chunks/ssr/_14f96702._.js +3 -0
  202. package/web/.next/server/chunks/ssr/_14f96702._.js.map +1 -0
  203. package/web/.next/server/chunks/ssr/_19a2fb35._.js +3 -0
  204. package/web/.next/server/chunks/ssr/_19a2fb35._.js.map +1 -0
  205. package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
  206. package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
  207. package/web/.next/server/chunks/ssr/_4093a637._.js +5 -0
  208. package/web/.next/server/chunks/ssr/_4093a637._.js.map +1 -0
  209. package/web/.next/server/chunks/ssr/{_15fe9326._.js → _6847e12c._.js} +2 -2
  210. package/web/.next/server/chunks/ssr/_6847e12c._.js.map +1 -0
  211. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  212. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/_d5206f22._.js +4 -0
  214. package/web/.next/server/chunks/ssr/_d5206f22._.js.map +1 -0
  215. package/web/.next/server/chunks/ssr/_f7eda65f._.js +3 -0
  216. package/web/.next/server/chunks/ssr/_f7eda65f._.js.map +1 -0
  217. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  218. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  219. package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js +3 -0
  220. package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js.map +1 -0
  221. package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js +3 -0
  222. package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js.map +1 -0
  223. package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js +3 -0
  224. package/web/.next/server/chunks/ssr/node_modules__pnpm_b59e4b16._.js.map +1 -0
  225. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js +2 -2
  226. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js.map +1 -1
  227. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js +1 -1
  228. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js.map +1 -1
  229. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  230. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  231. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  232. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  233. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js +2 -2
  234. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js.map +1 -1
  235. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  236. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  237. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  238. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  239. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  240. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  241. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  242. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  243. package/web/.next/server/middleware-build-manifest.js +2 -2
  244. package/web/.next/server/pages/500.html +2 -2
  245. package/web/.next/server/server-reference-manifest.js +1 -1
  246. package/web/.next/server/server-reference-manifest.json +189 -34
  247. package/web/.next/static/chunks/0d2af96e64960ef5.css +1 -0
  248. package/web/.next/static/chunks/17029c5f1d00fc93.js +1 -0
  249. package/web/.next/static/chunks/{24a0b215d72d8f26.js → 2745f3ad9063085f.js} +1 -1
  250. package/web/.next/static/chunks/372ca551d638fa0f.js +1 -0
  251. package/web/.next/static/chunks/{2c0cf874cda01236.js → 493c993ee3ade96f.js} +1 -1
  252. package/web/.next/static/chunks/{cd2bb43fe9138791.js → 5750e62c32b225d4.js} +1 -1
  253. package/web/.next/static/chunks/5905a4f9588b11f7.js +1 -0
  254. package/web/.next/static/chunks/767cf20dbde41522.js +1 -0
  255. package/web/.next/static/chunks/78e2f79d08767e8d.js +9 -0
  256. package/web/.next/static/chunks/{9fba6bb38ff0cb38.js → 7a2e1c2cd9250da4.js} +2 -2
  257. package/web/.next/static/chunks/{ed3a602003bcb31b.js → 89aac43287d73b02.js} +1 -1
  258. package/web/.next/static/chunks/994703c532508731.js +2 -0
  259. package/web/.next/static/chunks/9f42f58eb93e94fa.js +1 -0
  260. package/web/.next/static/chunks/a8d65187623d628b.js +5 -0
  261. package/web/.next/static/chunks/ba4855da62a1199d.js +1 -0
  262. package/web/.next/static/chunks/bf108ed551e585e6.js +1 -0
  263. package/web/.next/static/chunks/ef92b64dbf5813d5.js +1 -0
  264. package/web/.next/static/chunks/{turbopack-426d9bc2450816ba.js → turbopack-080e470ea902d0ba.js} +1 -1
  265. package/web/.next/server/chunks/[root-of-the-server]__dcd4f847._.js +0 -3
  266. package/web/.next/server/chunks/ssr/[root-of-the-server]__52485955._.js +0 -3
  267. package/web/.next/server/chunks/ssr/[root-of-the-server]__52485955._.js.map +0 -1
  268. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +0 -3
  269. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +0 -1
  270. package/web/.next/server/chunks/ssr/[root-of-the-server]__6677a82c._.js +0 -3
  271. package/web/.next/server/chunks/ssr/_15fe9326._.js.map +0 -1
  272. package/web/.next/server/chunks/ssr/_3a4c94e3._.js +0 -3
  273. package/web/.next/server/chunks/ssr/_3a4c94e3._.js.map +0 -1
  274. package/web/.next/server/chunks/ssr/_90a34ae9._.js +0 -3
  275. package/web/.next/server/chunks/ssr/_90a34ae9._.js.map +0 -1
  276. package/web/.next/server/chunks/ssr/_9ac70f88._.js +0 -5
  277. package/web/.next/server/chunks/ssr/_9ac70f88._.js.map +0 -1
  278. package/web/.next/server/chunks/ssr/_e9703421._.js +0 -3
  279. package/web/.next/server/chunks/ssr/_e9703421._.js.map +0 -1
  280. package/web/.next/server/chunks/ssr/_f096ab6a._.js +0 -3
  281. package/web/.next/server/chunks/ssr/_f096ab6a._.js.map +0 -1
  282. package/web/.next/server/chunks/ssr/node_modules__pnpm_bc66dcc6._.js +0 -3
  283. package/web/.next/server/chunks/ssr/node_modules__pnpm_bc66dcc6._.js.map +0 -1
  284. package/web/.next/static/chunks/4232eb19944a519e.js +0 -1
  285. package/web/.next/static/chunks/4443ee9c7733399b.js +0 -1
  286. package/web/.next/static/chunks/52b56677c842e45f.js +0 -3
  287. package/web/.next/static/chunks/6b8c3e3d8d4ee08e.js +0 -1
  288. package/web/.next/static/chunks/96eeeb28e06de78c.js +0 -1
  289. package/web/.next/static/chunks/a58429fc5be52aad.js +0 -1
  290. package/web/.next/static/chunks/b200a40ffcc15eb7.css +0 -1
  291. package/web/.next/static/chunks/b67d183d3c074a4c.js +0 -2
  292. package/web/.next/static/chunks/d2bfdee31e1a7d8d.js +0 -1
  293. package/web/.next/static/chunks/fadc79bbbae100a7.js +0 -11
  294. /package/web/.next/static/{Fr059mDxLxW71ARoHnB8W → 1R6ULRWeIsY2xDw1tiEVQ}/_buildManifest.js +0 -0
  295. /package/web/.next/static/{Fr059mDxLxW71ARoHnB8W → 1R6ULRWeIsY2xDw1tiEVQ}/_clientMiddlewareManifest.json +0 -0
  296. /package/web/.next/static/{Fr059mDxLxW71ARoHnB8W → 1R6ULRWeIsY2xDw1tiEVQ}/_ssgManifest.js +0 -0
@@ -1,71 +1,12 @@
1
- import { execFile as execFileCb } from 'node:child_process';
2
- import { promisify } from 'node:util';
3
1
  import { resolve } from '../../lib/server-container.js';
4
2
  import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
5
3
  import { layoutWithDagre, CANVAS_LAYOUT_DEFAULTS } from '../../lib/layout-with-dagre.js';
6
4
  import { buildGraphNodes } from '../build-graph-nodes.js';
7
- const execFileAsync = promisify(execFileCb);
8
- async function gitCommand(cwd, args) {
9
- try {
10
- const { stdout } = await execFileAsync('git', args, { cwd });
11
- return stdout.trim();
12
- }
13
- catch {
14
- return null;
15
- }
16
- }
17
- async function fetchRepoGitInfo(repo) {
18
- try {
19
- const [currentBranch, commitMessage, committer] = await Promise.all([
20
- gitCommand(repo.path, ['symbolic-ref', '--short', 'HEAD']),
21
- gitCommand(repo.path, ['log', '-1', '--format=%s']),
22
- gitCommand(repo.path, ['log', '-1', '--format=%an']),
23
- ]);
24
- if (!currentBranch)
25
- return null;
26
- // Try to determine the default branch to compute behind count
27
- let behindCount = null;
28
- const defaultBranch = await gitCommand(repo.path, [
29
- 'symbolic-ref',
30
- '--short',
31
- 'refs/remotes/origin/HEAD',
32
- ]).then((ref) => ref?.replace('origin/', '') ?? null);
33
- if (defaultBranch && currentBranch !== defaultBranch) {
34
- const behind = await gitCommand(repo.path, [
35
- 'rev-list',
36
- '--count',
37
- `${currentBranch}..origin/${defaultBranch}`,
38
- ]);
39
- behindCount = behind !== null ? parseInt(behind, 10) : null;
40
- if (isNaN(behindCount))
41
- behindCount = null;
42
- }
43
- else if (!defaultBranch || currentBranch === defaultBranch) {
44
- behindCount = 0;
45
- }
46
- return {
47
- branch: currentBranch,
48
- commitMessage: commitMessage ?? 'unknown',
49
- committer: committer ?? 'unknown',
50
- behindCount,
51
- };
52
- }
53
- catch {
54
- return null;
55
- }
56
- }
57
5
  export async function getGraphData() {
58
6
  const listFeatures = resolve('ListFeaturesUseCase');
59
7
  const listRepos = resolve('ListRepositoriesUseCase');
60
8
  const agentRunRepo = resolve('IAgentRunRepository');
61
9
  const [features, repositories] = await Promise.all([listFeatures.execute(), listRepos.execute()]);
62
- // Fetch git info (branch, commit, behind count) for each repository
63
- const repoGitInfoMap = new Map();
64
- await Promise.all(repositories.map(async (repo) => {
65
- const info = await fetchRepoGitInfo(repo);
66
- if (info)
67
- repoGitInfoMap.set(repo.path, info);
68
- }));
69
10
  // PR/CI status is kept fresh by PrSyncWatcher (30s background poll).
70
11
  // No live GitHub calls here — use cached DB values for fast response.
71
12
  const featuresWithRuns = await Promise.all(features.map(async (feature) => {
@@ -77,7 +18,6 @@ export async function getGraphData() {
77
18
  enableEvidence: workflow.enableEvidence,
78
19
  commitEvidence: workflow.commitEvidence,
79
20
  ciWatchEnabled: workflow.ciWatchEnabled,
80
- repoGitInfo: repoGitInfoMap,
81
21
  });
82
22
  // Enrich feature nodes with deployment status
83
23
  let deploymentService = null;
@@ -0,0 +1,11 @@
1
+ import type { Feature } from '../../../../../packages/core/src/domain/generated/output.js';
2
+ interface AdoptBranchInput {
3
+ branchName: string;
4
+ repositoryPath: string;
5
+ }
6
+ export declare function adoptBranch(input: AdoptBranchInput): Promise<{
7
+ feature?: Feature;
8
+ error?: string;
9
+ }>;
10
+ export {};
11
+ //# sourceMappingURL=adopt-branch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adopt-branch.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/adopt-branch.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAEpE,UAAU,gBAAgB;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAkBhD"}
@@ -0,0 +1,20 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function adoptBranch(input) {
4
+ const { branchName, repositoryPath } = input;
5
+ if (!branchName?.trim()) {
6
+ return { error: 'Branch name is required' };
7
+ }
8
+ if (!repositoryPath?.trim()) {
9
+ return { error: 'Repository path is required' };
10
+ }
11
+ try {
12
+ const useCase = resolve('AdoptBranchUseCase');
13
+ const result = await useCase.execute({ branchName, repositoryPath });
14
+ return { feature: result.feature };
15
+ }
16
+ catch (error) {
17
+ const message = error instanceof Error ? error.message : 'Failed to adopt branch';
18
+ return { error: message };
19
+ }
20
+ }
@@ -20,13 +20,6 @@ export interface BuildGraphNodesOptions {
20
20
  commitEvidence?: boolean;
21
21
  /** Whether CI watch/fix loop is enabled (global workflow setting) */
22
22
  ciWatchEnabled?: boolean;
23
- /** Git info (branch, commit message, committer, behind count) keyed by repository path */
24
- repoGitInfo?: Map<string, {
25
- branch: string;
26
- commitMessage: string;
27
- committer: string;
28
- behindCount: number | null;
29
- }>;
30
23
  }
31
24
  export declare function buildGraphNodes(repositories: Repository[], featuresWithRuns: FeatureWithRun[], options?: BuildGraphNodesOptions): {
32
25
  nodes: CanvasNodeType[];
@@ -1 +1 @@
1
- {"version":3,"file":"build-graph-nodes.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-graph-nodes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAS1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAU1C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0FAA0F;IAC1F,WAAW,CAAC,EAAE,GAAG,CACf,MAAM,EACN;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CACzF,CAAC;CACH;AAED,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,EAClC,OAAO,CAAC,EAAE,sBAAsB,GAC/B;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAkG5C"}
1
+ {"version":3,"file":"build-graph-nodes.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-graph-nodes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAS1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAU1C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,EAClC,OAAO,CAAC,EAAE,sBAAsB,GAC/B;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CA2F5C"}
@@ -31,7 +31,6 @@ export function buildGraphNodes(repositories, featuresWithRuns, options) {
31
31
  const normalizedRepoPath = normalizePath(repo.path);
32
32
  coveredPaths.add(normalizedRepoPath);
33
33
  const repoNodeId = `repo-${repo.id}`;
34
- const gitInfo = options?.repoGitInfo?.get(repo.path);
35
34
  nodes.push({
36
35
  id: repoNodeId,
37
36
  type: 'repositoryNode',
@@ -41,12 +40,6 @@ export function buildGraphNodes(repositories, featuresWithRuns, options) {
41
40
  repositoryPath: normalizedRepoPath,
42
41
  id: repo.id,
43
42
  createdAt: repo.createdAt instanceof Date ? repo.createdAt.getTime() : Number(repo.createdAt),
44
- ...(gitInfo && {
45
- branch: gitInfo.branch,
46
- commitMessage: gitInfo.commitMessage,
47
- committer: gitInfo.committer,
48
- behindCount: gitInfo.behindCount,
49
- }),
50
43
  },
51
44
  });
52
45
  const repoFeatures = featuresByRepo[normalizedRepoPath] ?? [];
@@ -0,0 +1,9 @@
1
+ export interface AdoptBranchDrawerProps {
2
+ open: boolean;
3
+ onClose: () => void;
4
+ onSubmit: (branchName: string) => void;
5
+ isSubmitting?: boolean;
6
+ error?: string;
7
+ }
8
+ export declare function AdoptBranchDrawer({ open, onClose, onSubmit, isSubmitting, error, }: AdoptBranchDrawerProps): import("react/jsx-runtime").JSX.Element;
9
+ //# sourceMappingURL=adopt-branch-drawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adopt-branch-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.tsx"],"names":[],"mappings":"AAUA,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,YAAoB,EACpB,KAAK,GACN,EAAE,sBAAsB,2CAoGxB"}
@@ -0,0 +1,27 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState, useCallback } from 'react';
4
+ import { GitBranch, Loader2 } from 'lucide-react';
5
+ import { BaseDrawer } from '../../common/base-drawer/index.js';
6
+ import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
7
+ import { Button } from '../../ui/button.js';
8
+ import { Input } from '../../ui/input.js';
9
+ import { Label } from '../../ui/label.js';
10
+ export function AdoptBranchDrawer({ open, onClose, onSubmit, isSubmitting = false, error, }) {
11
+ const [branchName, setBranchName] = useState('');
12
+ const handleSubmit = useCallback((e) => {
13
+ e.preventDefault();
14
+ const trimmed = branchName.trim();
15
+ if (!trimmed || isSubmitting)
16
+ return;
17
+ onSubmit(trimmed);
18
+ }, [branchName, isSubmitting, onSubmit]);
19
+ const handleClose = useCallback(() => {
20
+ setBranchName('');
21
+ onClose();
22
+ }, [onClose]);
23
+ // Reset form when drawer closes
24
+ const isDisabled = !branchName.trim() || isSubmitting;
25
+ const header = (_jsxs("div", { children: [_jsxs(DrawerTitle, { className: "flex items-center gap-2", children: [_jsx(GitBranch, { className: "h-4 w-4" }), "Adopt Branch"] }), _jsx(DrawerDescription, { className: "text-muted-foreground text-sm", children: "Import an existing git branch into Shep's feature tracking" })] }));
26
+ return (_jsx(BaseDrawer, { open: open, onClose: handleClose, size: "sm", modal: false, header: header, "data-testid": "adopt-branch-drawer", children: _jsxs("form", { onSubmit: handleSubmit, className: "flex flex-1 flex-col", children: [_jsx("div", { className: "flex-1 overflow-y-auto p-4", children: _jsxs("div", { className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { htmlFor: "branch-name", children: "Branch name" }), _jsx(Input, { id: "branch-name", placeholder: "e.g. fix/login-bug or feat/user-auth", value: branchName, onChange: (e) => setBranchName(e.target.value), disabled: isSubmitting, autoFocus: true, "data-testid": "adopt-branch-input" }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Enter the name of a local or remote branch to adopt as a tracked feature." })] }), error ? (_jsx("p", { className: "text-destructive text-sm", "data-testid": "adopt-branch-error", children: error })) : null] }) }), _jsx("div", { className: "border-t p-4", children: _jsxs("div", { className: "flex gap-2", children: [_jsx(Button, { type: "button", variant: "outline", onClick: handleClose, disabled: isSubmitting, className: "flex-1", children: "Cancel" }), _jsx(Button, { type: "submit", disabled: isDisabled, className: "flex-1", "data-testid": "adopt-branch-submit", children: isSubmitting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Adopting..."] })) : ('Adopt Branch') })] }) })] }) }));
27
+ }
@@ -0,0 +1,32 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { AdoptBranchDrawer } from './adopt-branch-drawer.js';
3
+ /**
4
+ * **AdoptBranchDrawer** is a right-side sliding drawer for importing an
5
+ * existing git branch into Shep's feature tracking system.
6
+ *
7
+ * ### Form
8
+ * - **Branch name** (required) — text input for the branch name
9
+ * - **Adopt Branch** button — disabled when input is empty or submitting
10
+ * - **Cancel** button — closes the drawer
11
+ *
12
+ * ### States
13
+ * - Default: empty input, submit disabled
14
+ * - Loading: input disabled, button shows spinner
15
+ * - Error: error message shown below input
16
+ */
17
+ declare const meta: Meta<typeof AdoptBranchDrawer>;
18
+ export default meta;
19
+ type Story = StoryObj<typeof AdoptBranchDrawer>;
20
+ /** Default empty form — click the trigger button to open the adopt branch drawer. */
21
+ export declare const Default: Story;
22
+ /** Pre-opened drawer for quick visual inspection. */
23
+ export declare const PreOpened: Story;
24
+ /** Drawer with branch name typed in — ready to submit. */
25
+ export declare const WithBranchName: Story;
26
+ /** Loading state — input disabled, button shows spinner. */
27
+ export declare const Loading: Story;
28
+ /** Error state — error message visible below input. */
29
+ export declare const WithError: Story;
30
+ /** Adopt branch drawer rendered inside a full-page context — starts open. */
31
+ export declare const InDrawer: Story;
32
+ //# sourceMappingURL=adopt-branch-drawer.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adopt-branch-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAO1D;;;;;;;;;;;;;GAaG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,iBAAiB,CAcxC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAkDhD,qFAAqF;AACrF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,cAAc,EAAE,KAU5B,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,SAAS,EAAE,KAWvB,CAAC;AAiCF,6EAA6E;AAC7E,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC"}
@@ -0,0 +1,115 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { within, userEvent, fn } from '@storybook/test';
4
+ import { AdoptBranchDrawer } from './adopt-branch-drawer.js';
5
+ import { Button } from '../../ui/button.js';
6
+ /* ---------------------------------------------------------------------------
7
+ * Meta
8
+ * ------------------------------------------------------------------------- */
9
+ /**
10
+ * **AdoptBranchDrawer** is a right-side sliding drawer for importing an
11
+ * existing git branch into Shep's feature tracking system.
12
+ *
13
+ * ### Form
14
+ * - **Branch name** (required) — text input for the branch name
15
+ * - **Adopt Branch** button — disabled when input is empty or submitting
16
+ * - **Cancel** button — closes the drawer
17
+ *
18
+ * ### States
19
+ * - Default: empty input, submit disabled
20
+ * - Loading: input disabled, button shows spinner
21
+ * - Error: error message shown below input
22
+ */
23
+ const meta = {
24
+ title: 'Drawers/Feature/AdoptBranchDrawer',
25
+ component: AdoptBranchDrawer,
26
+ tags: ['autodocs'],
27
+ parameters: {
28
+ layout: 'fullscreen',
29
+ },
30
+ argTypes: {
31
+ open: { control: 'boolean', description: 'Controls drawer visibility' },
32
+ onClose: { description: 'Called when the drawer is dismissed' },
33
+ onSubmit: { description: 'Called with the branch name when the form is submitted' },
34
+ isSubmitting: { control: 'boolean', description: 'Shows loading state' },
35
+ error: { control: 'text', description: 'Error message to display' },
36
+ },
37
+ };
38
+ export default meta;
39
+ /* ---------------------------------------------------------------------------
40
+ * Shared action loggers
41
+ * ------------------------------------------------------------------------- */
42
+ const logSubmit = fn().mockName('onSubmit');
43
+ const logClose = fn().mockName('onClose');
44
+ /* ---------------------------------------------------------------------------
45
+ * Trigger wrapper
46
+ * ------------------------------------------------------------------------- */
47
+ function AdoptDrawerTrigger({ label = 'Open Adopt Branch', isSubmitting = false, error, }) {
48
+ const [open, setOpen] = useState(false);
49
+ return (_jsxs("div", { className: "flex h-screen items-start p-4", children: [_jsx(Button, { variant: "outline", onClick: () => setOpen(true), children: label }), _jsx(AdoptBranchDrawer, { open: open, onClose: () => {
50
+ setOpen(false);
51
+ logClose();
52
+ }, onSubmit: (branchName) => {
53
+ logSubmit(branchName);
54
+ setOpen(false);
55
+ }, isSubmitting: isSubmitting, error: error })] }));
56
+ }
57
+ /* ---------------------------------------------------------------------------
58
+ * Stories
59
+ * ------------------------------------------------------------------------- */
60
+ /** Default empty form — click the trigger button to open the adopt branch drawer. */
61
+ export const Default = {
62
+ render: () => _jsx(AdoptDrawerTrigger, {}),
63
+ };
64
+ /** Pre-opened drawer for quick visual inspection. */
65
+ export const PreOpened = {
66
+ render: () => _jsx(AdoptDrawerTrigger, { label: "Open Drawer" }),
67
+ play: async ({ canvasElement }) => {
68
+ const canvas = within(canvasElement);
69
+ await userEvent.click(canvas.getByRole('button', { name: 'Open Drawer' }));
70
+ },
71
+ };
72
+ /** Drawer with branch name typed in — ready to submit. */
73
+ export const WithBranchName = {
74
+ render: () => _jsx(AdoptDrawerTrigger, { label: "Open (With Branch)" }),
75
+ play: async ({ canvasElement }) => {
76
+ const canvas = within(canvasElement);
77
+ await userEvent.click(canvas.getByRole('button', { name: 'Open (With Branch)' }));
78
+ const body = within(canvasElement.ownerDocument.body);
79
+ const input = await body.findByPlaceholderText('e.g. fix/login-bug or feat/user-auth');
80
+ await userEvent.type(input, 'fix/login-bug');
81
+ },
82
+ };
83
+ /** Loading state — input disabled, button shows spinner. */
84
+ export const Loading = {
85
+ render: () => _jsx(AdoptDrawerTrigger, { label: "Open (Loading)", isSubmitting: true }),
86
+ play: async ({ canvasElement }) => {
87
+ const canvas = within(canvasElement);
88
+ await userEvent.click(canvas.getByRole('button', { name: 'Open (Loading)' }));
89
+ },
90
+ };
91
+ /** Error state — error message visible below input. */
92
+ export const WithError = {
93
+ render: () => (_jsx(AdoptDrawerTrigger, { label: "Open (Error)", error: 'Branch "main" cannot be adopted. The main branch should not be tracked as a feature.' })),
94
+ play: async ({ canvasElement }) => {
95
+ const canvas = within(canvasElement);
96
+ await userEvent.click(canvas.getByRole('button', { name: 'Open (Error)' }));
97
+ },
98
+ };
99
+ /* ---------------------------------------------------------------------------
100
+ * Shell template — starts open in full-page context
101
+ * ------------------------------------------------------------------------- */
102
+ function AdoptDrawerShellTemplate() {
103
+ const [open, setOpen] = useState(true);
104
+ return (_jsxs("div", { style: { height: '100vh', background: '#f8fafc', padding: '2rem' }, children: [_jsx("button", { type: "button", onClick: () => setOpen(true), style: { padding: '8px 16px', border: '1px solid #ccc', borderRadius: '6px' }, children: "Open Drawer" }), _jsx(AdoptBranchDrawer, { open: open, onClose: () => {
105
+ setOpen(false);
106
+ logClose();
107
+ }, onSubmit: (branchName) => {
108
+ logSubmit(branchName);
109
+ setOpen(false);
110
+ } })] }));
111
+ }
112
+ /** Adopt branch drawer rendered inside a full-page context — starts open. */
113
+ export const InDrawer = {
114
+ render: () => _jsx(AdoptDrawerShellTemplate, {}),
115
+ };
@@ -0,0 +1,5 @@
1
+ export interface AdoptDrawerClientProps {
2
+ repositoryPath: string;
3
+ }
4
+ export declare function AdoptDrawerClient({ repositoryPath }: AdoptDrawerClientProps): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=adopt-drawer-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adopt-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/adopt-drawer-client.tsx"],"names":[],"mappings":"AAQA,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,cAAc,EAAE,EAAE,sBAAsB,2CAoE3E"}
@@ -0,0 +1,56 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useState, useCallback, useEffect } from 'react';
4
+ import { useRouter, usePathname } from 'next/navigation';
5
+ import { toast } from 'sonner';
6
+ import { adoptBranch } from '../../../app/actions/adopt-branch.js';
7
+ import { AdoptBranchDrawer } from './adopt-branch-drawer.js';
8
+ export function AdoptDrawerClient({ repositoryPath }) {
9
+ const router = useRouter();
10
+ const pathname = usePathname();
11
+ const [isSubmitting, setIsSubmitting] = useState(false);
12
+ const [error, setError] = useState();
13
+ const isOnAdoptRoute = pathname.startsWith('/adopt');
14
+ const isOpen = !isSubmitting && isOnAdoptRoute;
15
+ // Reset isSubmitting once the route has actually changed away from /adopt
16
+ useEffect(() => {
17
+ if (!isOnAdoptRoute && isSubmitting) {
18
+ setIsSubmitting(false);
19
+ }
20
+ }, [isOnAdoptRoute, isSubmitting]);
21
+ // Clear error when drawer reopens
22
+ useEffect(() => {
23
+ if (isOnAdoptRoute) {
24
+ setError(undefined);
25
+ }
26
+ }, [isOnAdoptRoute]);
27
+ const onClose = useCallback(() => {
28
+ router.push('/');
29
+ }, [router]);
30
+ const onSubmit = useCallback((branchName) => {
31
+ setError(undefined);
32
+ setIsSubmitting(true);
33
+ router.push('/');
34
+ adoptBranch({ branchName, repositoryPath })
35
+ .then((result) => {
36
+ if (result.error) {
37
+ toast.error(result.error);
38
+ return;
39
+ }
40
+ window.dispatchEvent(new CustomEvent('shep:feature-created', {
41
+ detail: {
42
+ featureId: result.feature.id,
43
+ name: result.feature.name,
44
+ description: result.feature.description,
45
+ repositoryPath: result.feature.repositoryPath,
46
+ },
47
+ }));
48
+ toast.success(`Branch adopted as "${result.feature.name}"`);
49
+ })
50
+ .catch(() => {
51
+ toast.error('Failed to adopt branch');
52
+ setIsSubmitting(false);
53
+ });
54
+ }, [router, repositoryPath]);
55
+ return (_jsx(AdoptBranchDrawer, { open: isOpen, onClose: onClose, onSubmit: onSubmit, isSubmitting: isSubmitting, error: error }));
56
+ }
@@ -9,14 +9,6 @@ export interface RepositoryNodeData {
9
9
  repositoryPath?: string;
10
10
  /** Creation timestamp (epoch ms) — used for stable vertical ordering. */
11
11
  createdAt?: number;
12
- /** Current git branch name (e.g. "main", "feat/my-feature") */
13
- branch?: string;
14
- /** Commit message of the branch HEAD (first line only) */
15
- commitMessage?: string;
16
- /** Name of the person who made the latest commit */
17
- committer?: string;
18
- /** Number of commits the current branch is behind the default branch. null if on default branch or unknown. */
19
- behindCount?: number | null;
20
12
  onClick?: () => void;
21
13
  onAdd?: () => void;
22
14
  onDelete?: (repositoryId: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+GAA+G;IAC/G,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC"}
1
+ {"version":3,"file":"repository-node-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,WAAW,kBAAkB;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CA+U5F"}
1
+ {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CAyR5F"}
@@ -3,7 +3,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
3
3
  import { useState, useCallback } from 'react';
4
4
  import { Handle, Position } from '@xyflow/react';
5
5
  import { useRouter } from 'next/navigation';
6
- import { Github, Plus, Code2, Terminal, FolderOpen, Trash2, Play, Square, GitBranch, GitCommitHorizontal, ArrowDown, User, } from 'lucide-react';
6
+ import { Github, Plus, Code2, Terminal, FolderOpen, Trash2, Play, Square } from 'lucide-react';
7
7
  import { cn } from '../../../lib/utils.js';
8
8
  import { ActionButton } from '../../common/action-button/index.js';
9
9
  import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from '../../ui/dialog.js';
@@ -72,9 +72,9 @@ export function RepositoryNode({ data }) {
72
72
  e.stopPropagation();
73
73
  data.onClick?.();
74
74
  }
75
- }, className: "nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm", children: [_jsxs("div", { className: "flex items-center gap-3 px-4 py-3", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, onCreateFromSession: handleCreateFromSession }), featureFlags.envDeploy ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeploymentActive ? Square : Play, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeploymentActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: data.repositoryPath })) : null] })) : null] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
76
- e.stopPropagation();
77
- data.onAdd?.();
78
- }, className: cn('text-muted-foreground hover:bg-accent dark:hover:bg-accent/50 flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-full transition-colors hover:text-blue-500', data.pulseAdd &&
79
- 'animate-pulse-cta bg-blue-100 text-blue-500 dark:bg-blue-900/40'), children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Add feature" })] }) })) : null] })] }), data.branch ? (_jsx("div", { "data-testid": "repository-node-git-info", className: "text-muted-foreground border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-3 text-xs", children: [_jsxs("span", { className: "flex items-center gap-1 truncate", "data-testid": "repository-node-branch", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "truncate", children: data.branch })] }), data.behindCount != null && data.behindCount > 0 ? (_jsxs("span", { className: "flex shrink-0 items-center gap-1 whitespace-nowrap text-amber-500", "data-testid": "repository-node-behind", children: [_jsx(ArrowDown, { className: "h-3 w-3 shrink-0" }), data.behindCount, " behind"] })) : null] }) })) : null, data.commitMessage ? (_jsx("div", { "data-testid": "repository-node-commit-info", className: "text-muted-foreground border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(GitCommitHorizontal, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate", "data-testid": "repository-node-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("span", { className: "text-muted-foreground/70 ml-auto flex shrink-0 items-center gap-1", "data-testid": "repository-node-committer", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: data.committer })] })) : null] }) })) : null] }), data.onAdd || data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: !data.showHandles, className: "opacity-0!" })) : null] }));
75
+ }, className: "nodrag bg-card flex min-w-[18rem] cursor-pointer items-center gap-3 rounded-full border px-4 py-3 shadow-sm", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, onCreateFromSession: handleCreateFromSession }), featureFlags.envDeploy ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeploymentActive ? Square : Play, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeploymentActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: data.repositoryPath })) : null] })) : null] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
76
+ e.stopPropagation();
77
+ data.onAdd?.();
78
+ }, className: cn('text-muted-foreground hover:bg-accent dark:hover:bg-accent/50 flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-full transition-colors hover:text-blue-500', data.pulseAdd &&
79
+ 'animate-pulse-cta bg-blue-100 text-blue-500 dark:bg-blue-900/40'), children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Add feature" })] }) })) : null] })] }), data.onAdd || data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: !data.showHandles, className: "opacity-0!" })) : null] }));
80
80
  }
@@ -14,6 +14,4 @@ export declare const WithActions: Story;
14
14
  export declare const WithActionsAndAddButton: Story;
15
15
  export declare const WithDeleteButton: Story;
16
16
  export declare const MultipleWithActions: Story;
17
- export declare const WithGitInfo: Story;
18
- export declare const WithGitInfoBehind: Story;
19
17
  //# sourceMappingURL=repository-node.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,0BAA0B,CAAC;AAgCvF,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAYlC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAE1C,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAK3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAKtB,CAAC;AAiCF,eAAO,MAAM,QAAQ,EAAE,KAwBtB,CAAC;AAkCF,eAAO,MAAM,kBAAkB,EAAE,KAwBhC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAS1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,KAQrC,CAAC;AAIF,eAAO,MAAM,gBAAgB,EAAE,KAS9B,CAAC;AA+CF,eAAO,MAAM,mBAAmB,EAAE,KAwBjC,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KASzB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAS/B,CAAC"}
1
+ {"version":3,"file":"repository-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,KAAK,EAAE,kBAAkB,EAAsB,MAAM,0BAA0B,CAAC;AAgCvF,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,kBAAkB,CASlC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAE1C,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAK3B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAKtB,CAAC;AAWF,eAAO,MAAM,QAAQ,EAAE,KAwBtB,CAAC;AASF,eAAO,MAAM,kBAAkB,EAAE,KAwBhC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAS1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,KAQrC,CAAC;AAIF,eAAO,MAAM,gBAAgB,EAAE,KAS9B,CAAC;AA2BF,eAAO,MAAM,mBAAmB,EAAE,KAwBjC,CAAC"}