@shepai/cli 1.123.0 → 1.124.0-pr394.98d0323

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 (288) 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 +25 -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 +49 -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 +188 -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 +2 -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 +39 -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 +46 -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 +26 -0
  27. package/dist/src/presentation/web/app/actions/adopt-branch.d.ts +11 -0
  28. package/dist/src/presentation/web/app/actions/adopt-branch.d.ts.map +1 -0
  29. package/dist/src/presentation/web/app/actions/adopt-branch.js +20 -0
  30. package/dist/src/presentation/web/app/actions/list-branches.d.ts +6 -0
  31. package/dist/src/presentation/web/app/actions/list-branches.d.ts.map +1 -0
  32. package/dist/src/presentation/web/app/actions/list-branches.js +18 -0
  33. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.d.ts +20 -0
  34. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.d.ts.map +1 -0
  35. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.js +105 -0
  36. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.stories.d.ts +38 -0
  37. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.stories.d.ts.map +1 -0
  38. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-branch-drawer.stories.js +161 -0
  39. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-drawer-client.d.ts +7 -0
  40. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-drawer-client.d.ts.map +1 -0
  41. package/dist/src/presentation/web/components/common/control-center-drawer/adopt-drawer-client.js +78 -0
  42. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  43. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +4 -0
  44. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  45. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +14 -6
  46. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +1 -0
  47. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +16 -0
  49. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  50. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +12 -3
  51. package/dist/tsconfig.build.tsbuildinfo +1 -1
  52. package/package.json +1 -1
  53. package/web/.next/BUILD_ID +1 -1
  54. package/web/.next/app-path-routes-manifest.json +1 -0
  55. package/web/.next/build-manifest.json +4 -4
  56. package/web/.next/fallback-build-manifest.json +2 -2
  57. package/web/.next/prerender-manifest.json +3 -3
  58. package/web/.next/required-server-files.js +3 -3
  59. package/web/.next/required-server-files.json +3 -3
  60. package/web/.next/routes-manifest.json +6 -0
  61. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/app-paths-manifest.json +3 -0
  62. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/build-manifest.json +18 -0
  63. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/next-font-manifest.json +6 -0
  64. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/react-loadable-manifest.json +1 -0
  65. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +335 -0
  66. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +20 -0
  67. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.map +5 -0
  68. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -0
  69. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +2 -0
  70. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +2 -2
  71. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +22 -22
  72. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  73. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +2 -2
  75. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  76. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  77. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +2 -2
  79. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +28 -28
  80. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  81. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +2 -2
  83. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  84. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  85. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +2 -2
  87. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +22 -22
  88. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  89. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +2 -2
  91. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  92. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  93. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +2 -2
  95. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +28 -28
  96. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  97. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/(dashboard)/page/build-manifest.json +2 -2
  99. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +20 -20
  100. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  101. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +2 -2
  103. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  104. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  105. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  106. package/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
  107. package/web/.next/server/app/_global-error.html +2 -2
  108. package/web/.next/server/app/_global-error.rsc +1 -1
  109. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  110. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  111. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  112. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  113. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  114. package/web/.next/server/app/_not-found/page/build-manifest.json +2 -2
  115. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  116. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  117. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  118. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  119. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  120. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  121. package/web/.next/server/app/settings/page/build-manifest.json +2 -2
  122. package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
  123. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  124. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/app/skills/page/build-manifest.json +2 -2
  126. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  127. package/web/.next/server/app/skills/page.js +4 -4
  128. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  129. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  130. package/web/.next/server/app/tools/page/build-manifest.json +2 -2
  131. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  132. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  133. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  134. package/web/.next/server/app/version/page/build-manifest.json +2 -2
  135. package/web/.next/server/app/version/page/server-reference-manifest.json +2 -2
  136. package/web/.next/server/app/version/page.js.nft.json +1 -1
  137. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  138. package/web/.next/server/app-paths-manifest.json +1 -0
  139. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  140. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  141. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  142. package/web/.next/server/chunks/ssr/403f9_next_dist_client_components_94d75bc3._.js +3 -0
  143. package/web/.next/server/chunks/ssr/403f9_next_dist_client_components_94d75bc3._.js.map +1 -0
  144. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_cfc9281c.js +3 -0
  145. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_cfc9281c.js.map +1 -0
  146. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  147. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  148. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js +1 -1
  149. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js +1 -1
  151. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__02c84e6b._.js +3 -0
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__02c84e6b._.js.map +1 -0
  154. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__14664e9b._.js +2 -2
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__6677a82c._.js +1 -1
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__6677a82c._.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  159. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__7cbda1ea._.js +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__7cbda1ea._.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +2 -2
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__9e8b25ad._.js +1 -1
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__9e8b25ad._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +2 -2
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__aed1d6f8._.js +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__aed1d6f8._.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__ce6057f6._.js +1 -1
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__ce6057f6._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__e2227c0f._.js +3 -0
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__e2227c0f._.js.map +1 -0
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__f0589cc3._.js +3 -0
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__f0589cc3._.js.map +1 -0
  178. package/web/.next/server/chunks/ssr/_037585d1._.js +3 -0
  179. package/web/.next/server/chunks/ssr/_037585d1._.js.map +1 -0
  180. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  181. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/_19a2fb35._.js +3 -0
  183. package/web/.next/server/chunks/ssr/_19a2fb35._.js.map +1 -0
  184. package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
  185. package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/_4093a637._.js +5 -0
  187. package/web/.next/server/chunks/ssr/_4093a637._.js.map +1 -0
  188. package/web/.next/server/chunks/ssr/_51007db7._.js +3 -0
  189. package/web/.next/server/chunks/ssr/_51007db7._.js.map +1 -0
  190. package/web/.next/server/chunks/ssr/_583a83fb._.js +3 -0
  191. package/web/.next/server/chunks/ssr/_583a83fb._.js.map +1 -0
  192. package/web/.next/server/chunks/ssr/_9f56cf8f._.js +3 -0
  193. package/web/.next/server/chunks/ssr/_9f56cf8f._.js.map +1 -0
  194. package/web/.next/server/chunks/ssr/_a187fd7e._.js +3 -0
  195. package/web/.next/server/chunks/ssr/_a187fd7e._.js.map +1 -0
  196. package/web/.next/server/chunks/ssr/_a5aa6371._.js +9 -0
  197. package/web/.next/server/chunks/ssr/_a5aa6371._.js.map +1 -0
  198. package/web/.next/server/chunks/ssr/_a9f57758._.js +3 -0
  199. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +1 -0
  200. package/web/.next/server/chunks/ssr/{_960ceb5d._.js → _bbe4231d._.js} +2 -2
  201. package/web/.next/server/chunks/ssr/{_960ceb5d._.js.map → _bbe4231d._.js.map} +1 -1
  202. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  203. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  204. package/web/.next/server/chunks/ssr/_d5206f22._.js +4 -0
  205. package/web/.next/server/chunks/ssr/_d5206f22._.js.map +1 -0
  206. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  207. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  208. package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js +3 -0
  209. package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js.map +1 -0
  210. package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js +3 -0
  211. package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js.map +1 -0
  212. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js +2 -2
  213. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js.map +1 -1
  214. package/web/.next/server/chunks/ssr/src_presentation_web_76e3fa97._.js +3 -0
  215. package/web/.next/server/chunks/ssr/src_presentation_web_76e3fa97._.js.map +1 -0
  216. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js +1 -1
  217. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  219. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  221. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  222. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js +2 -2
  223. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  225. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  227. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  228. package/web/.next/server/middleware-build-manifest.js +2 -2
  229. package/web/.next/server/pages/500.html +2 -2
  230. package/web/.next/server/server-reference-manifest.js +1 -1
  231. package/web/.next/server/server-reference-manifest.json +205 -35
  232. package/web/.next/static/chunks/098114af56643bd9.js +1 -0
  233. package/web/.next/static/chunks/1b599871854f8337.js +1 -0
  234. package/web/.next/static/chunks/{373e10090c6410c4.js → 1e75e27e2a8f16aa.js} +3 -3
  235. package/web/.next/static/chunks/3e3e9c6552a6574f.css +1 -0
  236. package/web/.next/static/chunks/{64d063449c3be0ec.js → 41743a4b042afc52.js} +1 -1
  237. package/web/.next/static/chunks/6295f27fe47da052.js +1 -0
  238. package/web/.next/static/chunks/{310be54600c8ce20.js → 63b6810d66452765.js} +2 -2
  239. package/web/.next/static/chunks/{878643f90bc6360f.js → 65edab397a9ea90a.js} +2 -2
  240. package/web/.next/static/chunks/8080c842b0358904.js +1 -0
  241. package/web/.next/static/chunks/{3f6c44cbad751310.js → 872ae77227847df4.js} +1 -1
  242. package/web/.next/static/chunks/{ed3a602003bcb31b.js → 89aac43287d73b02.js} +1 -1
  243. package/web/.next/static/chunks/a4e2b613aebfb60f.js +1 -0
  244. package/web/.next/static/chunks/a8ba3f3e2b0f87aa.js +1 -0
  245. package/web/.next/static/chunks/{f0dfeedb263eb906.js → affe1b865566ff48.js} +1 -1
  246. package/web/.next/static/chunks/{9821072252ddb89a.js → c75433ee5350240c.js} +1 -1
  247. package/web/.next/static/chunks/d04de4be30ab78ca.js +3 -0
  248. package/web/.next/static/chunks/f29ebb567e9486cb.js +1 -0
  249. package/web/.next/static/chunks/{turbopack-426d9bc2450816ba.js → turbopack-080e470ea902d0ba.js} +1 -1
  250. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_d0119342._.js +0 -3
  251. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_d0119342._.js.map +0 -1
  252. package/web/.next/server/chunks/ssr/[root-of-the-server]__52485955._.js +0 -3
  253. package/web/.next/server/chunks/ssr/[root-of-the-server]__52485955._.js.map +0 -1
  254. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +0 -3
  255. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +0 -1
  256. package/web/.next/server/chunks/ssr/_3a4c94e3._.js +0 -3
  257. package/web/.next/server/chunks/ssr/_3a4c94e3._.js.map +0 -1
  258. package/web/.next/server/chunks/ssr/_6d26a08f._.js +0 -3
  259. package/web/.next/server/chunks/ssr/_6d26a08f._.js.map +0 -1
  260. package/web/.next/server/chunks/ssr/_9ac70f88._.js +0 -5
  261. package/web/.next/server/chunks/ssr/_9ac70f88._.js.map +0 -1
  262. package/web/.next/server/chunks/ssr/_b56e7571._.js +0 -3
  263. package/web/.next/server/chunks/ssr/_b56e7571._.js.map +0 -1
  264. package/web/.next/server/chunks/ssr/_e9703421._.js +0 -3
  265. package/web/.next/server/chunks/ssr/_e9703421._.js.map +0 -1
  266. package/web/.next/server/chunks/ssr/_f1a649e3._.js +0 -9
  267. package/web/.next/server/chunks/ssr/_f1a649e3._.js.map +0 -1
  268. package/web/.next/server/chunks/ssr/_fd4c574b._.js +0 -3
  269. package/web/.next/server/chunks/ssr/_fd4c574b._.js.map +0 -1
  270. package/web/.next/server/chunks/ssr/node_modules__pnpm_bc66dcc6._.js +0 -3
  271. package/web/.next/server/chunks/ssr/node_modules__pnpm_bc66dcc6._.js.map +0 -1
  272. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +0 -3
  273. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +0 -1
  274. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +0 -3
  275. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +0 -1
  276. package/web/.next/server/chunks/ssr/src_presentation_web_db779ef4._.js +0 -3
  277. package/web/.next/server/chunks/ssr/src_presentation_web_db779ef4._.js.map +0 -1
  278. package/web/.next/static/chunks/303a1217006489b9.js +0 -1
  279. package/web/.next/static/chunks/3925626b99dcd57a.css +0 -1
  280. package/web/.next/static/chunks/4443ee9c7733399b.js +0 -1
  281. package/web/.next/static/chunks/52b56677c842e45f.js +0 -3
  282. package/web/.next/static/chunks/694718e5449b3150.js +0 -1
  283. package/web/.next/static/chunks/94af5be1ccf8842e.js +0 -1
  284. package/web/.next/static/chunks/dbbb446493f21874.js +0 -1
  285. package/web/.next/static/chunks/e418898e8e02f50a.js +0 -1
  286. /package/web/.next/static/{gBTe97SiNDA2hbG9dbfpb → Axg9qWCPuwbc3fahoDfel}/_buildManifest.js +0 -0
  287. /package/web/.next/static/{gBTe97SiNDA2hbG9dbfpb → Axg9qWCPuwbc3fahoDfel}/_clientMiddlewareManifest.json +0 -0
  288. /package/web/.next/static/{gBTe97SiNDA2hbG9dbfpb → Axg9qWCPuwbc3fahoDfel}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAa3C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAc3C"}
@@ -20,6 +20,7 @@ import { createReviewCommand } from './review.command.js';
20
20
  import { createApproveCommand } from './approve.command.js';
21
21
  import { createRejectCommand } from './reject.command.js';
22
22
  import { createLogsCommand } from './logs.command.js';
23
+ import { createAdoptCommand } from './adopt.command.js';
23
24
  /**
24
25
  * Create the feat command group
25
26
  */
@@ -35,5 +36,6 @@ export function createFeatCommand() {
35
36
  .addCommand(createReviewCommand())
36
37
  .addCommand(createApproveCommand())
37
38
  .addCommand(createRejectCommand())
38
- .addCommand(createLogsCommand());
39
+ .addCommand(createLogsCommand())
40
+ .addCommand(createAdoptCommand());
39
41
  }
@@ -0,0 +1,10 @@
1
+ /** Skip static pre-rendering since we need runtime DI container. */
2
+ export declare const dynamic = "force-dynamic";
3
+ interface AdoptDrawerPageProps {
4
+ searchParams: Promise<{
5
+ repo?: string;
6
+ }>;
7
+ }
8
+ export default function AdoptDrawerPage({ searchParams }: AdoptDrawerPageProps): Promise<import("react/jsx-runtime").JSX.Element>;
9
+ export {};
10
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/adopt/page.tsx"],"names":[],"mappings":"AAIA,oEAAoE;AACpE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,UAAU,oBAAoB;IAC5B,YAAY,EAAE,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC1C;AAED,wBAA8B,eAAe,CAAC,EAAE,YAAY,EAAE,EAAE,oBAAoB,oDAuBnF"}
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { resolve } from '../../../../lib/server-container.js';
3
+ import { AdoptDrawerClient } from '../../../../components/common/control-center-drawer/adopt-drawer-client.js';
4
+ /** Skip static pre-rendering since we need runtime DI container. */
5
+ export const dynamic = 'force-dynamic';
6
+ export default async function AdoptDrawerPage({ searchParams }) {
7
+ const { repo } = await searchParams;
8
+ let repositoryPath = repo ?? '';
9
+ let repositoryOptions = [];
10
+ try {
11
+ const listRepos = resolve('ListRepositoriesUseCase');
12
+ const repositories = await listRepos.execute();
13
+ repositoryOptions = repositories.map((r) => ({
14
+ id: r.id,
15
+ name: r.name,
16
+ path: r.path,
17
+ }));
18
+ if (!repositoryPath && repositories.length > 0) {
19
+ repositoryPath = repositories[0].path;
20
+ }
21
+ }
22
+ catch {
23
+ // Fall through with empty path — server action will validate
24
+ }
25
+ return _jsx(AdoptDrawerClient, { repositoryPath: repositoryPath, repositories: repositoryOptions });
26
+ }
@@ -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
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Server action that returns all branch names (local + remote) for a repository.
3
+ * Used by the adopt branch drawer to populate the branch combobox.
4
+ */
5
+ export declare function listBranches(repositoryPath: string): Promise<string[]>;
6
+ //# sourceMappingURL=list-branches.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-branches.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/list-branches.ts"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAsB,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAW5E"}
@@ -0,0 +1,18 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ /**
4
+ * Server action that returns all branch names (local + remote) for a repository.
5
+ * Used by the adopt branch drawer to populate the branch combobox.
6
+ */
7
+ export async function listBranches(repositoryPath) {
8
+ if (!repositoryPath?.trim()) {
9
+ return [];
10
+ }
11
+ try {
12
+ const worktreeService = resolve('IWorktreeService');
13
+ return await worktreeService.listBranches(repositoryPath);
14
+ }
15
+ catch {
16
+ return [];
17
+ }
18
+ }
@@ -0,0 +1,20 @@
1
+ import type { RepositoryOption } from '../../common/feature-create-drawer/feature-create-drawer.js';
2
+ export interface AdoptBranchDrawerProps {
3
+ open: boolean;
4
+ onClose: () => void;
5
+ onSubmit: (branchName: string, repositoryPath: string) => void;
6
+ isSubmitting?: boolean;
7
+ error?: string;
8
+ /** Available repositories for the repository selector */
9
+ repositories?: RepositoryOption[];
10
+ /** Currently selected repository path */
11
+ selectedRepositoryPath?: string;
12
+ /** Callback when user selects a different repository */
13
+ onRepositoryChange?: (repositoryPath: string) => void;
14
+ /** Available branch names for the combobox dropdown */
15
+ branches?: string[];
16
+ /** Whether branches are still loading */
17
+ branchesLoading?: boolean;
18
+ }
19
+ export declare function AdoptBranchDrawer({ open, onClose, onSubmit, isSubmitting, error, repositories, selectedRepositoryPath, onRepositoryChange, branches, branchesLoading, }: AdoptBranchDrawerProps): import("react/jsx-runtime").JSX.Element;
20
+ //# 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":"AAmBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iEAAiE,CAAC;AAExG,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAClC,yCAAyC;IACzC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,wDAAwD;IACxD,kBAAkB,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IACtD,uDAAuD;IACvD,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,yCAAyC;IACzC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,YAAoB,EACpB,KAAK,EACL,YAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,QAAa,EACb,eAAuB,GACxB,EAAE,sBAAsB,2CAmVxB"}
@@ -0,0 +1,105 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState, useCallback, useEffect, useRef } from 'react';
4
+ import { Check, CheckIcon, ChevronsUpDown, 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
+ import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, } from '../../ui/command.js';
11
+ import { Popover, PopoverContent, PopoverTrigger } from '../../ui/popover.js';
12
+ import { cn } from '../../../lib/utils.js';
13
+ export function AdoptBranchDrawer({ open, onClose, onSubmit, isSubmitting = false, error, repositories = [], selectedRepositoryPath, onRepositoryChange, branches = [], branchesLoading = false, }) {
14
+ const [branchName, setBranchName] = useState('');
15
+ const [comboboxOpen, setComboboxOpen] = useState(false);
16
+ const [inputValue, setInputValue] = useState('');
17
+ const inputRef = useRef(null);
18
+ const [repoOpen, setRepoOpen] = useState(false);
19
+ const [repoQuery, setRepoQuery] = useState('');
20
+ const repoInputRef = useRef(null);
21
+ const selectedRepo = repositories.find((r) => r.path === selectedRepositoryPath);
22
+ const hasRepo = !!selectedRepositoryPath;
23
+ // Reset state when drawer closes
24
+ useEffect(() => {
25
+ if (!open) {
26
+ setBranchName('');
27
+ setInputValue('');
28
+ setComboboxOpen(false);
29
+ setRepoOpen(false);
30
+ setRepoQuery('');
31
+ }
32
+ }, [open]);
33
+ // Reset branch selection when repository changes
34
+ useEffect(() => {
35
+ setBranchName('');
36
+ setInputValue('');
37
+ }, [selectedRepositoryPath]);
38
+ const handleSubmit = useCallback((e) => {
39
+ e.preventDefault();
40
+ const trimmed = branchName.trim();
41
+ if (!trimmed || !selectedRepositoryPath || isSubmitting)
42
+ return;
43
+ onSubmit(trimmed, selectedRepositoryPath);
44
+ }, [branchName, selectedRepositoryPath, isSubmitting, onSubmit]);
45
+ const handleClose = useCallback(() => {
46
+ setBranchName('');
47
+ setInputValue('');
48
+ onClose();
49
+ }, [onClose]);
50
+ const handleSelect = useCallback((branch) => {
51
+ setBranchName(branch);
52
+ setInputValue(branch);
53
+ setComboboxOpen(false);
54
+ }, []);
55
+ const handleInputChange = useCallback((e) => {
56
+ setInputValue(e.target.value);
57
+ if (!comboboxOpen)
58
+ setComboboxOpen(true);
59
+ }, [comboboxOpen]);
60
+ const handleInputKeyDown = useCallback((e) => {
61
+ if (e.key === 'Enter') {
62
+ e.preventDefault();
63
+ const trimmed = inputValue.trim();
64
+ if (trimmed) {
65
+ setBranchName(trimmed);
66
+ setComboboxOpen(false);
67
+ }
68
+ }
69
+ if (e.key === 'Escape') {
70
+ setComboboxOpen(false);
71
+ setInputValue(branchName);
72
+ }
73
+ }, [inputValue, branchName]);
74
+ const handleRepoSelect = useCallback((path) => {
75
+ onRepositoryChange?.(path);
76
+ setRepoOpen(false);
77
+ setRepoQuery('');
78
+ }, [onRepositoryChange]);
79
+ const filteredBranches = branches.filter((b) => b.toLowerCase().includes(inputValue.toLowerCase()));
80
+ const filteredRepos = repoQuery.trim()
81
+ ? repositories.filter((r) => r.name.toLowerCase().includes(repoQuery.toLowerCase()) ||
82
+ r.path.toLowerCase().includes(repoQuery.toLowerCase()))
83
+ : repositories;
84
+ useEffect(() => {
85
+ if (repoOpen) {
86
+ setTimeout(() => repoInputRef.current?.focus(), 0);
87
+ }
88
+ else {
89
+ setRepoQuery('');
90
+ }
91
+ }, [repoOpen]);
92
+ const isDisabled = !branchName.trim() || !selectedRepositoryPath || isSubmitting;
93
+ 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" })] }));
94
+ 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, { children: "Repository" }), _jsxs(Popover, { open: repoOpen, onOpenChange: setRepoOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", role: "combobox", "aria-expanded": repoOpen, "aria-label": "Repository", disabled: isSubmitting, "data-testid": "adopt-repo-combobox", className: cn('border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50', !selectedRepo && 'text-muted-foreground'), children: [_jsx("span", { className: "truncate", children: selectedRepo ? selectedRepo.name : 'Select repository...' }), _jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-80 p-0", align: "start", "data-testid": "adopt-repo-combobox-content", children: _jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: "border-b p-2", children: _jsx(Input, { ref: repoInputRef, placeholder: "Search repositories...", value: repoQuery, onChange: (e) => setRepoQuery(e.target.value), className: "h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0", "data-testid": "adopt-repo-search" }) }), _jsx("div", { className: "max-h-48 overflow-y-auto py-1", role: "listbox", "aria-label": "Repositories", children: filteredRepos.length === 0 ? (_jsx("p", { className: "text-muted-foreground px-3 py-2 text-sm", children: "No repositories found." })) : (filteredRepos.map((r) => (_jsxs("button", { type: "button", role: "option", "aria-selected": selectedRepositoryPath === r.path, onClick: () => handleRepoSelect(r.path), className: cn('hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm', selectedRepositoryPath === r.path && 'bg-accent/50'), "data-testid": `adopt-repo-option-${r.id}`, children: [_jsx(CheckIcon, { className: cn('h-4 w-4 shrink-0', selectedRepositoryPath !== r.path && 'invisible') }), _jsxs("span", { className: "flex flex-col items-start truncate", children: [_jsx("span", { className: "truncate", children: r.name }), _jsx("span", { className: "text-muted-foreground truncate text-xs", children: r.path })] })] }, r.id)))) })] }) })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: "Select the repository that contains the branch you want to adopt." })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Label, { htmlFor: "branch-name", children: "Branch name" }), _jsxs(Popover, { open: comboboxOpen, onOpenChange: setComboboxOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs(Button, { variant: "outline", role: "combobox", "aria-expanded": comboboxOpen, disabled: isSubmitting || !hasRepo, className: "w-full justify-between font-normal", "data-testid": "adopt-branch-input", children: [_jsx("span", { className: "truncate", children: !hasRepo
95
+ ? 'Select a repository first...'
96
+ : branchesLoading
97
+ ? 'Loading branches...'
98
+ : branchName || 'Select a branch...' }), _jsx(ChevronsUpDown, { className: "ml-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-[var(--radix-popover-trigger-width)] p-0", align: "start", children: _jsxs(Command, { children: [_jsx(CommandInput, { ref: inputRef, placeholder: "Search branches...", value: inputValue, onChange: handleInputChange, onKeyDown: handleInputKeyDown, "data-testid": "adopt-branch-search" }), _jsxs(CommandList, { children: [!branchesLoading && filteredBranches.length === 0 && (_jsx(CommandEmpty, { children: branches.length === 0
99
+ ? 'No branches found.'
100
+ : inputValue
101
+ ? 'No match — press Enter to use this value.'
102
+ : 'No branches available.' })), branchesLoading ? (_jsx(CommandEmpty, { children: _jsx(Loader2, { className: "mx-auto h-4 w-4 animate-spin" }) })) : null, filteredBranches.length > 0 && (_jsx(CommandGroup, { children: filteredBranches.map((branch) => (_jsxs(CommandItem, { selected: branch === branchName, onClick: () => handleSelect(branch), children: [_jsx(Check, { className: cn('mr-2 h-4 w-4', branch === branchName ? 'opacity-100' : 'opacity-0') }), _jsx(GitBranch, { className: "mr-2 h-3 w-3 opacity-50" }), branch] }, branch))) }))] })] }) })] }), _jsx("p", { className: "text-muted-foreground text-xs", children: hasRepo
103
+ ? 'Select a branch from the dropdown or type to search. Local and remote branches are shown.'
104
+ : 'Please select a repository above to see available branches.' })] }), 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') })] }) })] }) }));
105
+ }
@@ -0,0 +1,38 @@
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
+ * - **Repository** (required) — combobox for selecting which repository to adopt from
9
+ * - **Branch name** (required) — combobox with search for selecting a branch (scoped to selected repo)
10
+ * - **Adopt Branch** button — disabled when no repo/branch is selected or submitting
11
+ * - **Cancel** button — closes the drawer
12
+ *
13
+ * ### States
14
+ * - Default: no repo or branch selected, submit disabled
15
+ * - Loading branches: combobox shows loading spinner
16
+ * - Loading submit: button shows spinner
17
+ * - Error: error message shown below combobox
18
+ */
19
+ declare const meta: Meta<typeof AdoptBranchDrawer>;
20
+ export default meta;
21
+ type Story = StoryObj<typeof AdoptBranchDrawer>;
22
+ /** Default — click the trigger button to open the adopt branch drawer with repo and branch selectors. */
23
+ export declare const Default: Story;
24
+ /** Pre-opened drawer with repository and branch comboboxes for quick visual inspection. */
25
+ export declare const PreOpened: Story;
26
+ /** No repository selected — branch selector shows "Select a repository first..." */
27
+ export declare const NoRepoSelected: Story;
28
+ /** Branches loading state — combobox shows "Loading branches..." */
29
+ export declare const BranchesLoading: Story;
30
+ /** Loading state — submit in progress, button shows spinner. */
31
+ export declare const Loading: Story;
32
+ /** Error state — error message visible below combobox. */
33
+ export declare const WithError: Story;
34
+ /** No branches available — empty state in the combobox dropdown. */
35
+ export declare const NoBranches: Story;
36
+ /** Adopt branch drawer rendered inside a full-page context — starts open. */
37
+ export declare const InDrawer: Story;
38
+ //# 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;;;;;;;;;;;;;;;GAeG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,iBAAiB,CAmBxC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAuFhD,yGAAyG;AACzG,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,cAAc,EAAE,KAM5B,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,eAAe,EAAE,KAM7B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,SAAS,EAAE,KAWvB,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAyCF,6EAA6E;AAC7E,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC"}
@@ -0,0 +1,161 @@
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
+ * - **Repository** (required) — combobox for selecting which repository to adopt from
15
+ * - **Branch name** (required) — combobox with search for selecting a branch (scoped to selected repo)
16
+ * - **Adopt Branch** button — disabled when no repo/branch is selected or submitting
17
+ * - **Cancel** button — closes the drawer
18
+ *
19
+ * ### States
20
+ * - Default: no repo or branch selected, submit disabled
21
+ * - Loading branches: combobox shows loading spinner
22
+ * - Loading submit: button shows spinner
23
+ * - Error: error message shown below combobox
24
+ */
25
+ const meta = {
26
+ title: 'Drawers/Feature/AdoptBranchDrawer',
27
+ component: AdoptBranchDrawer,
28
+ tags: ['autodocs'],
29
+ parameters: {
30
+ layout: 'fullscreen',
31
+ },
32
+ argTypes: {
33
+ open: { control: 'boolean', description: 'Controls drawer visibility' },
34
+ onClose: { description: 'Called when the drawer is dismissed' },
35
+ onSubmit: { description: 'Called with branch name and repo path when submitted' },
36
+ isSubmitting: { control: 'boolean', description: 'Shows loading state' },
37
+ error: { control: 'text', description: 'Error message to display' },
38
+ repositories: { description: 'Available repositories for selection' },
39
+ selectedRepositoryPath: { description: 'Currently selected repository path' },
40
+ onRepositoryChange: { description: 'Called when user selects a different repository' },
41
+ branches: { description: 'Available branch names for the combobox dropdown' },
42
+ branchesLoading: { control: 'boolean', description: 'Whether branches are loading' },
43
+ },
44
+ };
45
+ export default meta;
46
+ /* ---------------------------------------------------------------------------
47
+ * Shared data
48
+ * ------------------------------------------------------------------------- */
49
+ const logSubmit = fn().mockName('onSubmit');
50
+ const logClose = fn().mockName('onClose');
51
+ const logRepoChange = fn().mockName('onRepositoryChange');
52
+ const sampleRepositories = [
53
+ { id: 'repo-1', name: 'my-app', path: '/Users/dev/projects/my-app' },
54
+ { id: 'repo-2', name: 'api-server', path: '/Users/dev/projects/api-server' },
55
+ { id: 'repo-3', name: 'shared-lib', path: '/Users/dev/projects/shared-lib' },
56
+ ];
57
+ const sampleBranches = [
58
+ 'feat/user-auth',
59
+ 'feat/dashboard-redesign',
60
+ 'fix/login-bug',
61
+ 'fix/memory-leak',
62
+ 'chore/update-deps',
63
+ 'refactor/api-layer',
64
+ 'docs/readme-update',
65
+ 'release/v2.0',
66
+ 'hotfix/critical-fix',
67
+ 'develop',
68
+ ];
69
+ /* ---------------------------------------------------------------------------
70
+ * Trigger wrapper
71
+ * ------------------------------------------------------------------------- */
72
+ function AdoptDrawerTrigger({ label = 'Open Adopt Branch', isSubmitting = false, error, repositories = sampleRepositories, selectedRepositoryPath = sampleRepositories[0].path, branches = sampleBranches, branchesLoading = false, }) {
73
+ const [open, setOpen] = useState(false);
74
+ const [selectedRepo, setSelectedRepo] = useState(selectedRepositoryPath);
75
+ 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: () => {
76
+ setOpen(false);
77
+ logClose();
78
+ }, onSubmit: (branchName, repoPath) => {
79
+ logSubmit(branchName, repoPath);
80
+ setOpen(false);
81
+ }, isSubmitting: isSubmitting, error: error, repositories: repositories, selectedRepositoryPath: selectedRepo, onRepositoryChange: (path) => {
82
+ setSelectedRepo(path);
83
+ logRepoChange(path);
84
+ }, branches: branches, branchesLoading: branchesLoading })] }));
85
+ }
86
+ /* ---------------------------------------------------------------------------
87
+ * Stories
88
+ * ------------------------------------------------------------------------- */
89
+ /** Default — click the trigger button to open the adopt branch drawer with repo and branch selectors. */
90
+ export const Default = {
91
+ render: () => _jsx(AdoptDrawerTrigger, {}),
92
+ };
93
+ /** Pre-opened drawer with repository and branch comboboxes for quick visual inspection. */
94
+ export const PreOpened = {
95
+ render: () => _jsx(AdoptDrawerTrigger, { label: "Open Drawer" }),
96
+ play: async ({ canvasElement }) => {
97
+ const canvas = within(canvasElement);
98
+ await userEvent.click(canvas.getByRole('button', { name: 'Open Drawer' }));
99
+ },
100
+ };
101
+ /** No repository selected — branch selector shows "Select a repository first..." */
102
+ export const NoRepoSelected = {
103
+ render: () => _jsx(AdoptDrawerTrigger, { label: "Open (No Repo)", selectedRepositoryPath: "" }),
104
+ play: async ({ canvasElement }) => {
105
+ const canvas = within(canvasElement);
106
+ await userEvent.click(canvas.getByRole('button', { name: 'Open (No Repo)' }));
107
+ },
108
+ };
109
+ /** Branches loading state — combobox shows "Loading branches..." */
110
+ export const BranchesLoading = {
111
+ render: () => _jsx(AdoptDrawerTrigger, { label: "Open (Loading Branches)", branchesLoading: true }),
112
+ play: async ({ canvasElement }) => {
113
+ const canvas = within(canvasElement);
114
+ await userEvent.click(canvas.getByRole('button', { name: 'Open (Loading Branches)' }));
115
+ },
116
+ };
117
+ /** Loading state — submit in progress, button shows spinner. */
118
+ export const Loading = {
119
+ render: () => _jsx(AdoptDrawerTrigger, { label: "Open (Loading)", isSubmitting: true }),
120
+ play: async ({ canvasElement }) => {
121
+ const canvas = within(canvasElement);
122
+ await userEvent.click(canvas.getByRole('button', { name: 'Open (Loading)' }));
123
+ },
124
+ };
125
+ /** Error state — error message visible below combobox. */
126
+ export const WithError = {
127
+ render: () => (_jsx(AdoptDrawerTrigger, { label: "Open (Error)", error: 'Branch "main" cannot be adopted. The main branch should not be tracked as a feature.' })),
128
+ play: async ({ canvasElement }) => {
129
+ const canvas = within(canvasElement);
130
+ await userEvent.click(canvas.getByRole('button', { name: 'Open (Error)' }));
131
+ },
132
+ };
133
+ /** No branches available — empty state in the combobox dropdown. */
134
+ export const NoBranches = {
135
+ render: () => _jsx(AdoptDrawerTrigger, { label: "Open (No Branches)", branches: [] }),
136
+ play: async ({ canvasElement }) => {
137
+ const canvas = within(canvasElement);
138
+ await userEvent.click(canvas.getByRole('button', { name: 'Open (No Branches)' }));
139
+ },
140
+ };
141
+ /* ---------------------------------------------------------------------------
142
+ * Shell template — starts open in full-page context
143
+ * ------------------------------------------------------------------------- */
144
+ function AdoptDrawerShellTemplate() {
145
+ const [open, setOpen] = useState(true);
146
+ const [selectedRepo, setSelectedRepo] = useState(sampleRepositories[0].path);
147
+ 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: () => {
148
+ setOpen(false);
149
+ logClose();
150
+ }, onSubmit: (branchName, repoPath) => {
151
+ logSubmit(branchName, repoPath);
152
+ setOpen(false);
153
+ }, repositories: sampleRepositories, selectedRepositoryPath: selectedRepo, onRepositoryChange: (path) => {
154
+ setSelectedRepo(path);
155
+ logRepoChange(path);
156
+ }, branches: sampleBranches })] }));
157
+ }
158
+ /** Adopt branch drawer rendered inside a full-page context — starts open. */
159
+ export const InDrawer = {
160
+ render: () => _jsx(AdoptDrawerShellTemplate, {}),
161
+ };
@@ -0,0 +1,7 @@
1
+ import type { RepositoryOption } from '../../common/feature-create-drawer/feature-create-drawer.js';
2
+ export interface AdoptDrawerClientProps {
3
+ repositoryPath: string;
4
+ repositories: RepositoryOption[];
5
+ }
6
+ export declare function AdoptDrawerClient({ repositoryPath, repositories }: AdoptDrawerClientProps): import("react/jsx-runtime").JSX.Element;
7
+ //# 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,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iEAAiE,CAAC;AAExG,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,gBAAgB,EAAE,CAAC;CAClC;AAED,wBAAgB,iBAAiB,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,EAAE,sBAAsB,2CA+FzF"}
@@ -0,0 +1,78 @@
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 { listBranches } from '../../../app/actions/list-branches.js';
8
+ import { AdoptBranchDrawer } from './adopt-branch-drawer.js';
9
+ export function AdoptDrawerClient({ repositoryPath, repositories }) {
10
+ const router = useRouter();
11
+ const pathname = usePathname();
12
+ const [isSubmitting, setIsSubmitting] = useState(false);
13
+ const [error, setError] = useState();
14
+ const [branches, setBranches] = useState([]);
15
+ const [branchesLoading, setBranchesLoading] = useState(false);
16
+ const [selectedRepoPath, setSelectedRepoPath] = useState(repositoryPath);
17
+ const isOnAdoptRoute = pathname.startsWith('/adopt');
18
+ const isOpen = !isSubmitting && isOnAdoptRoute;
19
+ // Reset isSubmitting once the route has actually changed away from /adopt
20
+ useEffect(() => {
21
+ if (!isOnAdoptRoute && isSubmitting) {
22
+ setIsSubmitting(false);
23
+ }
24
+ }, [isOnAdoptRoute, isSubmitting]);
25
+ // Clear error when drawer reopens and reset selected repo to default
26
+ useEffect(() => {
27
+ if (isOnAdoptRoute) {
28
+ setError(undefined);
29
+ setSelectedRepoPath(repositoryPath);
30
+ }
31
+ }, [isOnAdoptRoute, repositoryPath]);
32
+ // Fetch branches when drawer opens AND a repository is selected
33
+ useEffect(() => {
34
+ if (isOnAdoptRoute && selectedRepoPath) {
35
+ setBranchesLoading(true);
36
+ setBranches([]);
37
+ listBranches(selectedRepoPath)
38
+ .then(setBranches)
39
+ .catch(() => setBranches([]))
40
+ .finally(() => setBranchesLoading(false));
41
+ }
42
+ else {
43
+ setBranches([]);
44
+ }
45
+ }, [isOnAdoptRoute, selectedRepoPath]);
46
+ const onClose = useCallback(() => {
47
+ router.push('/');
48
+ }, [router]);
49
+ const handleRepositoryChange = useCallback((path) => {
50
+ setSelectedRepoPath(path);
51
+ }, []);
52
+ const onSubmit = useCallback((branchName, repoPath) => {
53
+ setError(undefined);
54
+ setIsSubmitting(true);
55
+ router.push('/');
56
+ adoptBranch({ branchName, repositoryPath: repoPath })
57
+ .then((result) => {
58
+ if (result.error) {
59
+ toast.error(result.error);
60
+ return;
61
+ }
62
+ window.dispatchEvent(new CustomEvent('shep:feature-created', {
63
+ detail: {
64
+ featureId: result.feature.id,
65
+ name: result.feature.name,
66
+ description: result.feature.description,
67
+ repositoryPath: result.feature.repositoryPath,
68
+ },
69
+ }));
70
+ toast.success(`Branch adopted as "${result.feature.name}"`);
71
+ })
72
+ .catch(() => {
73
+ toast.error('Failed to adopt branch');
74
+ setIsSubmitting(false);
75
+ });
76
+ }, [router]);
77
+ return (_jsx(AdoptBranchDrawer, { open: isOpen, onClose: onClose, onSubmit: onSubmit, isSubmitting: isSubmitting, error: error, repositories: repositories, selectedRepositoryPath: selectedRepoPath, onRepositoryChange: handleRepositoryChange, branches: branches, branchesLoading: branchesLoading }));
78
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"derive-feature-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/derive-feature-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE3F;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,gBAAgB,CAuDlB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAYvD;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,CAsBtF;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAQlE,CAAC;AAeF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,qBAAqB,CAQ7F;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpC,SAAS,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC7C,SAAS,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,qBAAqB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7F,cAAc,EAAE,CAmBlB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,qBAAqB,GAAG,SAAS,CAGnC"}
1
+ {"version":3,"file":"derive-feature-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/derive-feature-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE3F;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,gBAAgB,CA4DlB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAYvD;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,CAsBtF;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAQlE,CAAC;AAeF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,qBAAqB,CAQ7F;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpC,SAAS,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC7C,SAAS,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,qBAAqB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7F,cAAc,EAAE,CAmBlB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,qBAAqB,GAAG,SAAS,CAGnC"}
@@ -51,6 +51,10 @@ export function deriveNodeState(feature, agentRun, options) {
51
51
  if (feature.lifecycle === SdlcLifecycle.Maintain) {
52
52
  return 'done';
53
53
  }
54
+ // Adopted branch with an open PR — needs user review/merge action
55
+ if (feature.lifecycle === SdlcLifecycle.Review && !agentRun) {
56
+ return 'action-required';
57
+ }
54
58
  const tasks = feature.plan?.tasks;
55
59
  if (!tasks || tasks.length === 0) {
56
60
  return 'running';
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA6DnE,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,2CA8UA"}
1
+ {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA6DnE,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,2CAiWA"}