@shepai/cli 1.124.0-pr401.74b2155 → 1.124.0-pr405.148c2e4

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 (202) hide show
  1. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts +1 -0
  2. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.js +24 -9
  4. package/dist/src/presentation/cli/commands/feat/del.command.d.ts +2 -1
  5. package/dist/src/presentation/cli/commands/feat/del.command.d.ts.map +1 -1
  6. package/dist/src/presentation/cli/commands/feat/del.command.js +28 -2
  7. package/dist/src/presentation/web/app/actions/delete-feature.d.ts +1 -1
  8. package/dist/src/presentation/web/app/actions/delete-feature.d.ts.map +1 -1
  9. package/dist/src/presentation/web/app/actions/delete-feature.js +3 -1
  10. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  11. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +3 -3
  12. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
  13. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +3 -20
  14. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog-config.d.ts +2 -1
  15. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog-config.d.ts.map +1 -1
  16. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.d.ts +1 -1
  17. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.d.ts.map +1 -1
  18. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.js +12 -2
  19. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.d.ts +3 -0
  20. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.d.ts.map +1 -1
  21. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.js +17 -0
  22. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +1 -1
  23. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  25. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +3 -3
  26. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
  27. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +2 -19
  28. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts +0 -5
  29. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -1
  30. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +9 -38
  31. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  32. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
  33. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -1
  34. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  35. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +2 -2
  36. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  37. package/dist/src/presentation/web/hooks/use-graph-state.js +1 -1
  38. package/dist/src/presentation/web/lib/derive-graph.d.ts +1 -1
  39. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
  40. package/dist/tsconfig.build.tsbuildinfo +1 -1
  41. package/package.json +1 -1
  42. package/web/.next/BUILD_ID +1 -1
  43. package/web/.next/build-manifest.json +2 -2
  44. package/web/.next/fallback-build-manifest.json +2 -2
  45. package/web/.next/prerender-manifest.json +3 -3
  46. package/web/.next/required-server-files.js +1 -1
  47. package/web/.next/required-server-files.json +1 -1
  48. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +22 -22
  49. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  50. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  51. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  52. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  53. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  54. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +28 -28
  55. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  56. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  58. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  59. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +22 -22
  61. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  62. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +28 -28
  64. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  65. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +28 -28
  67. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  68. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +20 -20
  70. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  71. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +20 -20
  73. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  74. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/app/_global-error.html +2 -2
  76. package/web/.next/server/app/_global-error.rsc +1 -1
  77. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  78. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  79. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  80. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  81. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  82. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  83. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  84. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/settings/page/server-reference-manifest.json +6 -6
  86. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  87. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  88. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  89. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  90. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  91. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  92. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  93. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  95. package/web/.next/server/app/version/page.js.nft.json +1 -1
  96. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  97. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  98. package/web/.next/server/chunks/ssr/{node_modules__pnpm_f9ac7604._.js → 403f9_next_d6c8d28d._.js} +2 -2
  99. package/web/.next/server/chunks/ssr/403f9_next_d6c8d28d._.js.map +1 -0
  100. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  101. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  102. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js +1 -1
  103. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_f30d0343.js.map +1 -1
  104. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js +1 -1
  105. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_9f1775bb.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__14664e9b._.js +2 -2
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__14664e9b._.js.map +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +1 -1
  110. package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +1 -1
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__7cbda1ea._.js +1 -1
  116. package/web/.next/server/chunks/ssr/[root-of-the-server]__7cbda1ea._.js.map +1 -1
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +2 -2
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__9e8b25ad._.js +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__9e8b25ad._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +2 -2
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__aed1d6f8._.js +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__aed1d6f8._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__ce6057f6._.js +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__ce6057f6._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  128. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
  130. package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/_749d1454._.js +3 -0
  132. package/web/.next/server/chunks/ssr/_749d1454._.js.map +1 -0
  133. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  134. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/{_b86eec90._.js → _e67619dc._.js} +2 -2
  136. package/web/.next/server/chunks/ssr/_e67619dc._.js.map +1 -0
  137. package/web/.next/server/chunks/ssr/_e9703421._.js +3 -0
  138. package/web/.next/server/chunks/ssr/_e9703421._.js.map +1 -0
  139. package/web/.next/server/chunks/ssr/{_f605354c._.js → _f1a649e3._.js} +3 -3
  140. package/web/.next/server/chunks/ssr/_f1a649e3._.js.map +1 -0
  141. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  142. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  144. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/node_modules__pnpm_bc66dcc6._.js +3 -0
  146. package/web/.next/server/chunks/ssr/node_modules__pnpm_bc66dcc6._.js.map +1 -0
  147. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js +2 -2
  148. package/web/.next/server/chunks/ssr/src_presentation_web_5f039db1._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/src_presentation_web_6577afd6._.js +3 -0
  150. package/web/.next/server/chunks/ssr/src_presentation_web_6577afd6._.js.map +1 -0
  151. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js +1 -1
  152. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_2a52b697.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  154. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  156. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js +2 -2
  158. package/web/.next/server/chunks/ssr/src_presentation_web_c4337169._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  160. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  162. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  164. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  165. package/web/.next/server/pages/500.html +2 -2
  166. package/web/.next/server/server-reference-manifest.js +1 -1
  167. package/web/.next/server/server-reference-manifest.json +34 -34
  168. package/web/.next/static/chunks/{8f09849a5cb49bc8.js → 03bdf519f1320ab4.js} +1 -1
  169. package/web/.next/static/chunks/{683f1449a7acbe69.js → 07f180acd6a5407e.js} +2 -2
  170. package/web/.next/static/chunks/0b4a4039c5b75573.js +1 -0
  171. package/web/.next/static/chunks/{fb8b8be474a3e2b5.js → 28d2e153bbc26cb6.js} +1 -1
  172. package/web/.next/static/chunks/{94861aa7270facbd.js → 37f48b055e3b2f3c.js} +1 -1
  173. package/web/.next/static/chunks/3925626b99dcd57a.css +1 -0
  174. package/web/.next/static/chunks/3b795d3307cb41be.js +1 -0
  175. package/web/.next/static/chunks/{ffcc006639ba2fd8.js → 4443ee9c7733399b.js} +1 -1
  176. package/web/.next/static/chunks/{dbbb446493f21874.js → 6b55279f9ec02420.js} +1 -1
  177. package/web/.next/static/chunks/7a50831c86c4616e.js +2 -0
  178. package/web/.next/static/chunks/7dae93e8ebbdf56f.js +1 -0
  179. package/web/.next/static/chunks/{15e868c5ed24e68d.js → 8f2d02ccfef35ef3.js} +1 -1
  180. package/web/.next/static/chunks/ae06e95302eddf4d.js +11 -0
  181. package/web/.next/static/chunks/eb9841ec4d80af01.js +1 -0
  182. package/web/.next/server/chunks/ssr/_109ee019._.js +0 -3
  183. package/web/.next/server/chunks/ssr/_109ee019._.js.map +0 -1
  184. package/web/.next/server/chunks/ssr/_5d43c3db._.js +0 -3
  185. package/web/.next/server/chunks/ssr/_5d43c3db._.js.map +0 -1
  186. package/web/.next/server/chunks/ssr/_a161be0a._.js +0 -3
  187. package/web/.next/server/chunks/ssr/_a161be0a._.js.map +0 -1
  188. package/web/.next/server/chunks/ssr/_b86eec90._.js.map +0 -1
  189. package/web/.next/server/chunks/ssr/_f605354c._.js.map +0 -1
  190. package/web/.next/server/chunks/ssr/node_modules__pnpm_70f6d54e._.js +0 -3
  191. package/web/.next/server/chunks/ssr/node_modules__pnpm_70f6d54e._.js.map +0 -1
  192. package/web/.next/server/chunks/ssr/node_modules__pnpm_f9ac7604._.js.map +0 -1
  193. package/web/.next/static/chunks/1dd878b6feb55d2e.js +0 -1
  194. package/web/.next/static/chunks/44f74b62f897f41c.css +0 -1
  195. package/web/.next/static/chunks/a09c0c629f88ee12.js +0 -1
  196. package/web/.next/static/chunks/a7231c3b616020d8.js +0 -2
  197. package/web/.next/static/chunks/c4e46fbe479ebd88.js +0 -11
  198. package/web/.next/static/chunks/e39cee9f73d1fda2.js +0 -1
  199. package/web/.next/static/chunks/efb06f2eab920f11.js +0 -1
  200. /package/web/.next/static/{FEBom5Y7caLa2hXBqPiA- → o065qQkqhqsLutcjqMENe}/_buildManifest.js +0 -0
  201. /package/web/.next/static/{FEBom5Y7caLa2hXBqPiA- → o065qQkqhqsLutcjqMENe}/_clientMiddlewareManifest.json +0 -0
  202. /package/web/.next/static/{FEBom5Y7caLa2hXBqPiA- → o065qQkqhqsLutcjqMENe}/_ssgManifest.js +0 -0
@@ -21,6 +21,7 @@ import type { IGitPrService } from '../../ports/output/services/git-pr-service.i
21
21
  export interface DeleteFeatureOptions {
22
22
  cleanup?: boolean;
23
23
  cascadeDelete?: boolean;
24
+ closePr?: boolean;
24
25
  }
25
26
  export declare class DeleteFeatureUseCase {
26
27
  private readonly featureRepo;
@@ -1 +1 @@
1
- {"version":3,"file":"delete-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/delete-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBACa,oBAAoB;IAEC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAE5D,OAAO,CAAC,QAAQ,CAAC,cAAc;IACA,OAAO,CAAC,QAAQ,CAAC,OAAO;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBALP,WAAW,EAAE,kBAAkB,EACjC,eAAe,EAAE,gBAAgB,EAE7D,cAAc,EAAE,2BAA2B,EACZ,OAAO,EAAE,mBAAmB,EAClC,YAAY,EAAE,aAAa;IAGjE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IA8BlF,oGAAoG;YACtF,gBAAgB;IAW9B,0DAA0D;YAC5C,iBAAiB;IAQ/B,6DAA6D;YAC/C,yBAAyB;IAWvC,sDAAsD;YACxC,sBAAsB;IAYpC,6EAA6E;YAC/D,oBAAoB;CAsDnC"}
1
+ {"version":3,"file":"delete-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/delete-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBACa,oBAAoB;IAEC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAE5D,OAAO,CAAC,QAAQ,CAAC,cAAc;IACA,OAAO,CAAC,QAAQ,CAAC,OAAO;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBALP,WAAW,EAAE,kBAAkB,EACjC,eAAe,EAAE,gBAAgB,EAE7D,cAAc,EAAE,2BAA2B,EACZ,OAAO,EAAE,mBAAmB,EAClC,YAAY,EAAE,aAAa;IAGjE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IA8BlF,oGAAoG;YACtF,gBAAgB;IAW9B,0DAA0D;YAC5C,iBAAiB;IAQ/B,6DAA6D;YAC/C,yBAAyB;IAWvC,sDAAsD;YACxC,sBAAsB;IAYpC,6EAA6E;YAC/D,oBAAoB;CAqEnC"}
@@ -25,7 +25,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
25
25
  return function (target, key) { decorator(target, key, paramIndex); }
26
26
  };
27
27
  import { injectable, inject } from 'tsyringe';
28
- import { AgentRunStatus, SdlcLifecycle } from '../../../domain/generated/output.js';
28
+ import { AgentRunStatus, PrStatus, SdlcLifecycle } from '../../../domain/generated/output.js';
29
29
  let DeleteFeatureUseCase = class DeleteFeatureUseCase {
30
30
  featureRepo;
31
31
  worktreeService;
@@ -140,15 +140,30 @@ let DeleteFeatureUseCase = class DeleteFeatureUseCase {
140
140
  catch {
141
141
  // Branch might not exist
142
142
  }
143
- // Delete remote feature branch if it exists
144
- try {
145
- const remoteExists = await this.worktreeService.remoteBranchExists(feature.repositoryPath, feature.branch);
146
- if (remoteExists) {
147
- await this.gitPrService.deleteBranch(feature.repositoryPath, feature.branch, true);
143
+ // Delete remote feature branch if it exists (skip when closePr is false to preserve the PR)
144
+ if (options?.closePr !== false) {
145
+ try {
146
+ const remoteExists = await this.worktreeService.remoteBranchExists(feature.repositoryPath, feature.branch);
147
+ if (remoteExists) {
148
+ await this.gitPrService.deleteBranch(feature.repositoryPath, feature.branch, true);
149
+ // Update pr.status to Closed after remote branch deletion (GitHub auto-closes the PR)
150
+ if (feature.pr?.status === PrStatus.Open) {
151
+ try {
152
+ await this.featureRepo.update({
153
+ ...feature,
154
+ pr: { ...feature.pr, status: PrStatus.Closed },
155
+ updatedAt: new Date(),
156
+ });
157
+ }
158
+ catch {
159
+ // PR status update is best-effort
160
+ }
161
+ }
162
+ }
163
+ }
164
+ catch {
165
+ // Remote branch cleanup is best-effort
148
166
  }
149
- }
150
- catch {
151
- // Remote branch cleanup is best-effort
152
167
  }
153
168
  }
154
169
  }
@@ -4,12 +4,13 @@
4
4
  * Deletes a feature, its worktree, and cancels any running agent.
5
5
  * Optionally cleans up worktree and branches (local + remote).
6
6
  *
7
- * Usage: shep feat del <id> [--force] [--no-cleanup]
7
+ * Usage: shep feat del <id> [--force] [--no-cleanup] [--no-close-pr]
8
8
  *
9
9
  * @example
10
10
  * $ shep feat del feat-123
11
11
  * $ shep feat del feat-123 --force
12
12
  * $ shep feat del feat-123 --force --no-cleanup
13
+ * $ shep feat del feat-123 --force --no-close-pr
13
14
  */
14
15
  import { Command } from 'commander';
15
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"del.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/del.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAmD1C"}
1
+ {"version":3,"file":"del.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/del.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CA2E1C"}
@@ -4,12 +4,13 @@
4
4
  * Deletes a feature, its worktree, and cancels any running agent.
5
5
  * Optionally cleans up worktree and branches (local + remote).
6
6
  *
7
- * Usage: shep feat del <id> [--force] [--no-cleanup]
7
+ * Usage: shep feat del <id> [--force] [--no-cleanup] [--no-close-pr]
8
8
  *
9
9
  * @example
10
10
  * $ shep feat del feat-123
11
11
  * $ shep feat del feat-123 --force
12
12
  * $ shep feat del feat-123 --force --no-cleanup
13
+ * $ shep feat del feat-123 --force --no-close-pr
13
14
  */
14
15
  import { Command } from 'commander';
15
16
  import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
@@ -26,6 +27,7 @@ export function createDelCommand() {
26
27
  .argument('<id>', 'Feature ID or prefix')
27
28
  .option('-f, --force', 'Skip confirmation prompt')
28
29
  .option('--no-cleanup', 'Skip worktree and branch cleanup')
30
+ .option('--no-close-pr', 'Keep the pull request open')
29
31
  .action(async (featureId, options) => {
30
32
  try {
31
33
  // First show what we're about to delete
@@ -52,8 +54,29 @@ export function createDelCommand() {
52
54
  default: true,
53
55
  });
54
56
  }
57
+ // Determine close-PR preference
58
+ const hasOpenPr = feature.pr?.status === 'Open';
59
+ let closePr;
60
+ if (options.closePr === false) {
61
+ closePr = false;
62
+ }
63
+ else if (hasOpenPr && cleanup) {
64
+ if (options.force) {
65
+ closePr = true;
66
+ }
67
+ else {
68
+ closePr = await confirm({
69
+ message: `Also close the pull request? (PR #${feature.pr.number})`,
70
+ default: true,
71
+ });
72
+ }
73
+ }
55
74
  const deleteUseCase = container.resolve(DeleteFeatureUseCase);
56
- await deleteUseCase.execute(feature.id, { cleanup });
75
+ const executeOptions = { cleanup };
76
+ if (closePr !== undefined) {
77
+ executeOptions.closePr = closePr;
78
+ }
79
+ await deleteUseCase.execute(feature.id, executeOptions);
57
80
  messages.newline();
58
81
  messages.success('Feature deleted');
59
82
  console.log(` ${colors.muted('Name:')} ${feature.name}`);
@@ -61,6 +84,9 @@ export function createDelCommand() {
61
84
  if (cleanup) {
62
85
  console.log(` ${colors.muted('Cleanup:')} worktree, local branch, remote branch`);
63
86
  }
87
+ if (closePr && hasOpenPr) {
88
+ console.log(` ${colors.muted('PR:')} #${feature.pr.number} closed`);
89
+ }
64
90
  messages.newline();
65
91
  }
66
92
  catch (error) {
@@ -1,5 +1,5 @@
1
1
  import type { Feature } from '../../../../../packages/core/src/domain/generated/output.js';
2
- export declare function deleteFeature(featureId: string, cleanup?: boolean, cascadeDelete?: boolean): Promise<{
2
+ export declare function deleteFeature(featureId: string, cleanup?: boolean, cascadeDelete?: boolean, closePr?: boolean): Promise<{
3
3
  feature?: Feature;
4
4
  error?: string;
5
5
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"delete-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/delete-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAEpE,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,EACjB,aAAa,CAAC,EAAE,OAAO,GACtB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBhD"}
1
+ {"version":3,"file":"delete-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/delete-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAEpE,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,EACjB,aAAa,CAAC,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAoBhD"}
@@ -1,6 +1,6 @@
1
1
  'use server';
2
2
  import { resolve } from '../../lib/server-container.js';
3
- export async function deleteFeature(featureId, cleanup, cascadeDelete) {
3
+ export async function deleteFeature(featureId, cleanup, cascadeDelete, closePr) {
4
4
  if (!featureId?.trim()) {
5
5
  return { error: 'id is required' };
6
6
  }
@@ -11,6 +11,8 @@ export async function deleteFeature(featureId, cleanup, cascadeDelete) {
11
11
  options.cleanup = cleanup;
12
12
  if (cascadeDelete !== undefined)
13
13
  options.cascadeDelete = cascadeDelete;
14
+ if (closePr !== undefined)
15
+ options.closePr = closePr;
14
16
  const feature = Object.keys(options).length > 0
15
17
  ? await deleteFeatureUseCase.execute(featureId, options)
16
18
  : await deleteFeatureUseCase.execute(featureId);
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAqkB1F"}
1
+ {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAskB1F"}
@@ -256,7 +256,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
256
256
  }, [view, featureNode, prdData, prdSelections, onClose]);
257
257
  const handleTechApprove = useCallback(() => handleSimpleApprove('Plan'), [handleSimpleApprove]);
258
258
  const handleMergeApprove = useCallback(() => handleSimpleApprove('Merge'), [handleSimpleApprove]);
259
- const handleDelete = useCallback(async (featureId, cleanup, cascadeDelete) => {
259
+ const handleDelete = useCallback(async (featureId, cleanup, cascadeDelete, closePr) => {
260
260
  setIsDeleting(true);
261
261
  // Close the delete dialog and drawer before the server action so the
262
262
  // user sees immediate feedback. We dispatch a DOM event so the canvas
@@ -264,7 +264,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
264
264
  // mutation guard, node removal) in parallel.
265
265
  setDeleteDialogOpen(false);
266
266
  window.dispatchEvent(new CustomEvent('shep:feature-delete-requested', {
267
- detail: { featureId, cleanup, cascadeDelete },
267
+ detail: { featureId, cleanup, cascadeDelete, closePr },
268
268
  }));
269
269
  router.push('/');
270
270
  }, [router]);
@@ -336,7 +336,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
336
336
  const repoName = featureNode.repositoryName ??
337
337
  featureNode.repositoryPath.split('/').filter(Boolean).at(-1) ??
338
338
  '';
339
- header = (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-header", children: [_jsx(DrawerTitle, { children: featureNode.name }), repoName ? (_jsxs("div", { className: "flex items-center gap-1.5 pt-0.5", children: [_jsx(Code2, { className: "text-muted-foreground size-3.5 shrink-0" }), featureNode.remoteUrl ? (_jsxs("a", { href: featureNode.remoteUrl, target: "_blank", rel: "noopener noreferrer", className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs transition-colors", "data-testid": "feature-drawer-repo-link", children: [repoName, _jsx(ExternalLink, { className: "size-3" })] })) : (_jsx("span", { className: "text-muted-foreground text-xs", children: repoName }))] })) : null, _jsx(DrawerDescription, { className: "sr-only", children: featureNode.name })] }), featureActionsInput ? (_jsxs("div", { className: "flex items-center gap-2 pt-2", "data-testid": "feature-drawer-actions", children: [_jsx(OpenActionMenu, { actions: featureActions, repositoryPath: featureActionsInput.repositoryPath, showSpecs: !!featureActionsInput.specPath }), featureFlags.envDeploy && featureDeployTarget ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isFeatureDeployActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isFeatureDeployActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isFeatureDeployActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: featureDeployTarget?.targetId })) : null] })) : null, _jsxs("div", { className: "ml-auto flex items-center gap-1.5", children: [_jsx("code", { className: "bg-muted text-muted-foreground rounded px-1.5 py-0.5 font-mono text-xs", children: shortId }), _jsx("button", { type: "button", onClick: handleCopyId, className: "text-muted-foreground hover:text-foreground inline-flex items-center rounded p-0.5 transition-colors", "aria-label": "Copy feature ID", "data-testid": "feature-drawer-copy-id", children: idCopied ? (_jsx(Check, { className: "size-3.5 text-green-600" })) : (_jsx(Copy, { className: "size-3.5" })) })] }), featureNode.featureId ? (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Delete feature", disabled: isDeleting, className: "text-muted-foreground hover:text-destructive", "data-testid": "feature-drawer-delete", onClick: () => setDeleteDialogOpen(true), children: isDeleting ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(Trash2, { className: "size-4" })) }), _jsx(DeleteFeatureDialog, { open: deleteDialogOpen, onOpenChange: setDeleteDialogOpen, onConfirm: (cleanup, cascadeDelete) => handleDelete(featureNode.featureId, cleanup, cascadeDelete), isDeleting: isDeleting, featureName: featureNode.name, featureId: featureNode.featureId, hasChildren: featureNode.hasChildren })] })) : null] })) : null] }));
339
+ header = (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-header", children: [_jsx(DrawerTitle, { children: featureNode.name }), repoName ? (_jsxs("div", { className: "flex items-center gap-1.5 pt-0.5", children: [_jsx(Code2, { className: "text-muted-foreground size-3.5 shrink-0" }), featureNode.remoteUrl ? (_jsxs("a", { href: featureNode.remoteUrl, target: "_blank", rel: "noopener noreferrer", className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs transition-colors", "data-testid": "feature-drawer-repo-link", children: [repoName, _jsx(ExternalLink, { className: "size-3" })] })) : (_jsx("span", { className: "text-muted-foreground text-xs", children: repoName }))] })) : null, _jsx(DrawerDescription, { className: "sr-only", children: featureNode.name })] }), featureActionsInput ? (_jsxs("div", { className: "flex items-center gap-2 pt-2", "data-testid": "feature-drawer-actions", children: [_jsx(OpenActionMenu, { actions: featureActions, repositoryPath: featureActionsInput.repositoryPath, showSpecs: !!featureActionsInput.specPath }), featureFlags.envDeploy && featureDeployTarget ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isFeatureDeployActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isFeatureDeployActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isFeatureDeployActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: featureDeployTarget?.targetId })) : null] })) : null, _jsxs("div", { className: "ml-auto flex items-center gap-1.5", children: [_jsx("code", { className: "bg-muted text-muted-foreground rounded px-1.5 py-0.5 font-mono text-xs", children: shortId }), _jsx("button", { type: "button", onClick: handleCopyId, className: "text-muted-foreground hover:text-foreground inline-flex items-center rounded p-0.5 transition-colors", "aria-label": "Copy feature ID", "data-testid": "feature-drawer-copy-id", children: idCopied ? (_jsx(Check, { className: "size-3.5 text-green-600" })) : (_jsx(Copy, { className: "size-3.5" })) })] }), featureNode.featureId ? (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Delete feature", disabled: isDeleting, className: "text-muted-foreground hover:text-destructive", "data-testid": "feature-drawer-delete", onClick: () => setDeleteDialogOpen(true), children: isDeleting ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(Trash2, { className: "size-4" })) }), _jsx(DeleteFeatureDialog, { open: deleteDialogOpen, onOpenChange: setDeleteDialogOpen, onConfirm: (cleanup, cascadeDelete, closePr) => handleDelete(featureNode.featureId, cleanup, cascadeDelete, closePr), isDeleting: isDeleting, featureName: featureNode.name, featureId: featureNode.featureId, hasChildren: featureNode.hasChildren, hasOpenPr: !!featureNode.pr && featureNode.pr.status === 'Open' })] })) : null] })) : null] }));
340
340
  }
341
341
  // ── Body ──────────────────────────────────────────────────────────────
342
342
  let body = null;
@@ -1 +1 @@
1
- {"version":3,"file":"repository-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/repository-drawer-client.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAcD,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,2BAA2B,2CAoL3E"}
1
+ {"version":3,"file":"repository-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/repository-drawer-client.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,2BAA2B,2CAmF3E"}
@@ -1,30 +1,14 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useCallback } from 'react';
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
- import { Code2, Terminal, FolderOpen, GitBranch, GitCommitHorizontal, User, ArrowDown, Clock, } from 'lucide-react';
5
+ import { Code2, Terminal, FolderOpen } from 'lucide-react';
6
6
  import { BaseDrawer } from '../../common/base-drawer/index.js';
7
7
  import { ActionButton } from '../../common/action-button/index.js';
8
8
  import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
9
9
  import { Separator } from '../../ui/separator.js';
10
- import { Badge } from '../../ui/badge.js';
11
10
  import { useRepositoryActions } from '../../common/repository-node/use-repository-actions.js';
12
11
  import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
13
- function formatRelativeTime(epochMs) {
14
- const diff = Date.now() - epochMs;
15
- const days = Math.floor(diff / (1000 * 60 * 60 * 24));
16
- if (days === 0)
17
- return 'Today';
18
- if (days === 1)
19
- return 'Yesterday';
20
- if (days < 30)
21
- return `${days} days ago`;
22
- const months = Math.floor(days / 30);
23
- if (months < 12)
24
- return `${months} month${months > 1 ? 's' : ''} ago`;
25
- const years = Math.floor(months / 12);
26
- return `${years} year${years > 1 ? 's' : ''} ago`;
27
- }
28
12
  export function RepositoryDrawerClient({ data }) {
29
13
  const featureFlags = useFeatureFlags();
30
14
  const router = useRouter();
@@ -42,6 +26,5 @@ export function RepositoryDrawerClient({ data }) {
42
26
  }
43
27
  : undefined;
44
28
  const header = (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] }));
45
- const hasGitInfo = !!(data.branch ?? data.commitMessage);
46
- return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "md", modal: false, header: header, deployTarget: featureFlags.envDeploy ? repoDeployTarget : undefined, "data-testid": "repository-drawer", children: _jsxs("div", { className: "flex flex-1 flex-col overflow-y-auto", children: [hasGitInfo ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", "data-testid": "repository-drawer-git-section", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT STATUS" }), _jsxs("div", { className: "flex flex-col gap-2", children: [data.branch ? (_jsxs("div", { className: "flex items-center justify-between gap-2", "data-testid": "repository-drawer-branch-row", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(GitBranch, { className: "h-4 w-4 shrink-0" }), _jsx("span", { className: "text-foreground font-medium", children: "Branch" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "secondary", className: "font-mono text-xs", "data-testid": "repository-drawer-branch", children: data.branch }), data.behindCount != null && data.behindCount > 0 ? (_jsxs(Badge, { variant: "outline", className: "border-amber-500/40 bg-amber-50 text-xs text-amber-600 dark:bg-amber-900/20 dark:text-amber-400", "data-testid": "repository-drawer-behind", children: [_jsx(ArrowDown, { className: "mr-1 h-3 w-3" }), data.behindCount, " behind"] })) : null] })] })) : null, data.commitMessage ? (_jsx("div", { className: "bg-muted/50 rounded-lg p-3", "data-testid": "repository-drawer-commit-section", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground mt-0.5 h-4 w-4 shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-foreground text-sm leading-snug font-medium", "data-testid": "repository-drawer-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("div", { className: "text-muted-foreground mt-1 flex items-center gap-1 text-xs", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { "data-testid": "repository-drawer-committer", children: data.committer })] })) : null] })] }) })) : null] })] })] })) : null, data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null, data.createdAt ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", "data-testid": "repository-drawer-metadata", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "INFO" }), _jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx(Clock, { className: "h-4 w-4 shrink-0" }), _jsx("span", { children: "Added" })] }), _jsx("span", { className: "text-foreground text-xs", title: new Date(data.createdAt).toLocaleString(), "data-testid": "repository-drawer-created-at", children: formatRelativeTime(data.createdAt) })] })] })] })) : null] }) }));
29
+ return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "md", modal: false, header: header, deployTarget: featureFlags.envDeploy ? repoDeployTarget : undefined, "data-testid": "repository-drawer", children: data.repositoryPath ? (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null }));
47
30
  }
@@ -1,10 +1,11 @@
1
1
  export interface DeleteFeatureDialogProps {
2
2
  open: boolean;
3
3
  onOpenChange: (open: boolean) => void;
4
- onConfirm: (cleanup: boolean, cascadeDelete: boolean) => void;
4
+ onConfirm: (cleanup: boolean, cascadeDelete: boolean, closePr: boolean) => void;
5
5
  isDeleting: boolean;
6
6
  featureName: string;
7
7
  featureId: string;
8
8
  hasChildren?: boolean;
9
+ hasOpenPr?: boolean;
9
10
  }
10
11
  //# sourceMappingURL=delete-feature-dialog-config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete-feature-dialog-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog-config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9D,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB"}
1
+ {"version":3,"file":"delete-feature-dialog-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog-config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IAChF,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
@@ -1,3 +1,3 @@
1
1
  import type { DeleteFeatureDialogProps } from './delete-feature-dialog-config.js';
2
- export declare function DeleteFeatureDialog({ open, onOpenChange, onConfirm, isDeleting, featureName, featureId, hasChildren, }: DeleteFeatureDialogProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function DeleteFeatureDialog({ open, onOpenChange, onConfirm, isDeleting, featureName, featureId, hasChildren, hasOpenPr, }: DeleteFeatureDialogProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=delete-feature-dialog.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete-feature-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE/E,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,UAAU,EACV,WAAW,EACX,SAAS,EACT,WAAW,GACZ,EAAE,wBAAwB,2CAuE1B"}
1
+ {"version":3,"file":"delete-feature-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE/E,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,UAAU,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,GACV,EAAE,wBAAwB,2CA+F1B"}
@@ -5,14 +5,24 @@ import { Loader2 } from 'lucide-react';
5
5
  import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '../../ui/alert-dialog.js';
6
6
  import { Checkbox } from '../../ui/checkbox.js';
7
7
  import { Label } from '../../ui/label.js';
8
- export function DeleteFeatureDialog({ open, onOpenChange, onConfirm, isDeleting, featureName, featureId, hasChildren, }) {
8
+ export function DeleteFeatureDialog({ open, onOpenChange, onConfirm, isDeleting, featureName, featureId, hasChildren, hasOpenPr, }) {
9
9
  const [cleanup, setCleanup] = useState(true);
10
10
  const [cascadeDelete, setCascadeDelete] = useState(false);
11
+ const [closePr, setClosePr] = useState(true);
11
12
  useEffect(() => {
12
13
  if (open) {
13
14
  setCleanup(true);
14
15
  setCascadeDelete(false);
16
+ setClosePr(true);
15
17
  }
16
18
  }, [open]);
17
- return (_jsx(AlertDialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(AlertDialogContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Delete feature?" }), _jsxs(AlertDialogDescription, { children: ["This will permanently delete ", _jsx("strong", { children: featureName }), " (", featureId, "). This action cannot be undone."] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Checkbox, { id: "cleanup-checkbox", checked: cleanup, onCheckedChange: (checked) => setCleanup(checked === true), disabled: isDeleting, "aria-label": "Clean up worktree and branches" }), _jsx(Label, { htmlFor: "cleanup-checkbox", className: "cursor-pointer text-sm", children: "Clean up worktree and branches" })] }), hasChildren ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Checkbox, { id: "cascade-delete-checkbox", checked: cascadeDelete, onCheckedChange: (checked) => setCascadeDelete(checked === true), disabled: isDeleting, "aria-label": "Delete sub-features" }), _jsx(Label, { htmlFor: "cascade-delete-checkbox", className: "cursor-pointer text-sm", children: "Delete sub-features" })] })) : null] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: isDeleting, onClick: () => onOpenChange(false), children: "Cancel" }), _jsx(AlertDialogAction, { variant: "destructive", disabled: isDeleting, onClick: () => onConfirm(cleanup, cascadeDelete), children: isDeleting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Deleting\u2026"] })) : ('Delete') })] })] }) }));
19
+ useEffect(() => {
20
+ if (cleanup) {
21
+ setClosePr(true);
22
+ }
23
+ else {
24
+ setClosePr(false);
25
+ }
26
+ }, [cleanup]);
27
+ return (_jsx(AlertDialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(AlertDialogContent, { onCloseAutoFocus: (e) => e.preventDefault(), children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Delete feature?" }), _jsxs(AlertDialogDescription, { children: ["This will permanently delete ", _jsx("strong", { children: featureName }), " (", featureId, "). This action cannot be undone."] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Checkbox, { id: "cleanup-checkbox", checked: cleanup, onCheckedChange: (checked) => setCleanup(checked === true), disabled: isDeleting, "aria-label": "Clean up worktree and branches" }), _jsx(Label, { htmlFor: "cleanup-checkbox", className: "cursor-pointer text-sm", children: "Clean up worktree and branches" })] }), hasChildren ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Checkbox, { id: "cascade-delete-checkbox", checked: cascadeDelete, onCheckedChange: (checked) => setCascadeDelete(checked === true), disabled: isDeleting, "aria-label": "Delete sub-features" }), _jsx(Label, { htmlFor: "cascade-delete-checkbox", className: "cursor-pointer text-sm", children: "Delete sub-features" })] })) : null, hasOpenPr ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Checkbox, { id: "close-pr-checkbox", checked: closePr, onCheckedChange: (checked) => setClosePr(checked === true), disabled: isDeleting || !cleanup, "aria-label": "Close pull request" }), _jsx(Label, { htmlFor: "close-pr-checkbox", className: "cursor-pointer text-sm", children: "Close pull request" })] })) : null] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: isDeleting, onClick: () => onOpenChange(false), children: "Cancel" }), _jsx(AlertDialogAction, { variant: "destructive", disabled: isDeleting, onClick: () => onConfirm(cleanup, cascadeDelete, hasOpenPr ? closePr : false), children: isDeleting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Deleting\u2026"] })) : ('Delete') })] })] }) }));
18
28
  }
@@ -7,4 +7,7 @@ export declare const Default: Story;
7
7
  export declare const WithChildren: Story;
8
8
  export declare const Deleting: Story;
9
9
  export declare const DeletingWithChildren: Story;
10
+ export declare const WithOpenPr: Story;
11
+ export declare const WithOpenPrAndChildren: Story;
12
+ export declare const DeletingWithOpenPr: Story;
10
13
  //# sourceMappingURL=delete-feature-dialog.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"delete-feature-dialog.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,mBAAmB,CAe1C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAElD,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,YAAY,EAAE,KAI1B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAItB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAKlC,CAAC"}
1
+ {"version":3,"file":"delete-feature-dialog.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,mBAAmB,CAe1C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAElD,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,YAAY,EAAE,KAI1B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAItB,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAKlC,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,KAKnC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAKhC,CAAC"}
@@ -34,3 +34,20 @@ export const DeletingWithChildren = {
34
34
  hasChildren: true,
35
35
  },
36
36
  };
37
+ export const WithOpenPr = {
38
+ args: {
39
+ hasOpenPr: true,
40
+ },
41
+ };
42
+ export const WithOpenPrAndChildren = {
43
+ args: {
44
+ hasOpenPr: true,
45
+ hasChildren: true,
46
+ },
47
+ };
48
+ export const DeletingWithOpenPr = {
49
+ args: {
50
+ isDeleting: true,
51
+ hasOpenPr: true,
52
+ },
53
+ };
@@ -87,7 +87,7 @@ export interface FeatureNodeData {
87
87
  onAction?: () => void;
88
88
  onSettings?: () => void;
89
89
  hasChildren?: boolean;
90
- onDelete?: (featureId: string, cleanup?: boolean, cascadeDelete?: boolean) => void;
90
+ onDelete?: (featureId: string, cleanup?: boolean, cascadeDelete?: boolean, closePr?: boolean) => void;
91
91
  onRetry?: (featureId: string) => void;
92
92
  onStart?: (featureId: string) => void;
93
93
  onStop?: (featureId: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"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"}
@@ -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,2CAiWA"}
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,2CAkWA"}
@@ -73,10 +73,10 @@ export function FeatureNode({ data, selected, }) {
73
73
  return (_jsxs("div", { className: "animate-in fade-in group relative duration-300", children: [data.showHandles ? (_jsx(Handle, { type: "target", position: Position.Left, isConnectable: false, className: "opacity-0!" })) : null, data.onDelete && data.featureId && data.state !== 'deleting' ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "absolute top-1/2 -left-10 -translate-y-1/2 opacity-0 transition-opacity group-hover:opacity-100", onPointerDown: (e) => e.stopPropagation(), children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Delete feature", "data-testid": "feature-node-delete-button", onClick: (e) => {
74
74
  e.stopPropagation();
75
75
  setConfirmOpen(true);
76
- }, className: "bg-card text-muted-foreground hover:border-destructive hover:text-destructive flex h-7 w-7 cursor-pointer items-center justify-center rounded-full border shadow-sm transition-colors", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Delete feature" })] }) }) }), _jsx(DeleteFeatureDialog, { open: confirmOpen, onOpenChange: setConfirmOpen, onConfirm: (cleanup, cascadeDelete) => {
76
+ }, className: "bg-card text-muted-foreground hover:border-destructive hover:text-destructive flex h-7 w-7 cursor-pointer items-center justify-center rounded-full border shadow-sm transition-colors", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Delete feature" })] }) }) }), _jsx(DeleteFeatureDialog, { open: confirmOpen, onOpenChange: setConfirmOpen, onConfirm: (cleanup, cascadeDelete, closePr) => {
77
77
  setConfirmOpen(false);
78
- data.onDelete?.(data.featureId, cleanup, cascadeDelete);
79
- }, isDeleting: false, featureName: data.name ?? 'this feature', featureId: data.featureId, hasChildren: data.hasChildren })] })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' || data.state === 'deleting' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-72 cursor-pointer flex-col rounded-lg border p-3 shadow-sm', selected && 'ring-primary ring-2', data.state === 'deleting' && 'opacity-60'), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { "data-testid": "feature-node-lifecycle-label", className: cn('text-[10px] font-semibold tracking-wider'), children: data.state === 'blocked'
78
+ data.onDelete?.(data.featureId, cleanup, cascadeDelete, closePr);
79
+ }, isDeleting: false, featureName: data.name ?? 'this feature', featureId: data.featureId, hasChildren: data.hasChildren, hasOpenPr: !!data.pr && data.pr.status === 'Open' })] })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' || data.state === 'deleting' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-72 cursor-pointer flex-col rounded-lg border p-3 shadow-sm', selected && 'ring-primary ring-2', data.state === 'deleting' && 'opacity-60'), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { "data-testid": "feature-node-lifecycle-label", className: cn('text-[10px] font-semibold tracking-wider'), children: data.state === 'blocked'
80
80
  ? 'BLOCKED'
81
81
  : data.state === 'pending'
82
82
  ? 'PENDING'
@@ -1 +1 @@
1
- {"version":3,"file":"repository-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAcD,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,qBAAqB,2CAsLxE"}
1
+ {"version":3,"file":"repository-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAChC,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,qBAAqB,2CA+ExE"}
@@ -1,39 +1,22 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useCallback } from 'react';
4
- import { Code2, Terminal, FolderOpen, GitBranch, GitCommitHorizontal, User, ArrowDown, Clock, } from 'lucide-react';
4
+ import { Code2, Terminal, FolderOpen } from 'lucide-react';
5
5
  import { BaseDrawer } from '../../common/base-drawer/index.js';
6
6
  import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
7
7
  import { Separator } from '../../ui/separator.js';
8
- import { Badge } from '../../ui/badge.js';
9
8
  import { ActionButton } from '../../common/action-button/index.js';
10
9
  import { useRepositoryActions } from './use-repository-actions.js';
11
- function formatRelativeTime(epochMs) {
12
- const diff = Date.now() - epochMs;
13
- const days = Math.floor(diff / (1000 * 60 * 60 * 24));
14
- if (days === 0)
15
- return 'Today';
16
- if (days === 1)
17
- return 'Yesterday';
18
- if (days < 30)
19
- return `${days} days ago`;
20
- const months = Math.floor(days / 30);
21
- if (months < 12)
22
- return `${months} month${months > 1 ? 's' : ''} ago`;
23
- const years = Math.floor(months / 12);
24
- return `${years} year${years > 1 ? 's' : ''} ago`;
25
- }
26
10
  export function RepositoryDrawer({ data, onClose }) {
27
11
  const handleClose = useCallback(() => {
28
12
  onClose();
29
13
  }, [onClose]);
30
14
  const actions = useRepositoryActions(data?.repositoryPath ? { repositoryPath: data.repositoryPath } : null);
31
- const hasGitInfo = !!(data?.branch ?? data?.commitMessage);
32
15
  return (_jsx(BaseDrawer, { open: data !== null, onClose: handleClose, size: "md", modal: false, "data-testid": "repository-drawer", deployTarget: data?.repositoryPath
33
16
  ? {
34
17
  targetId: data.repositoryPath,
35
18
  targetType: 'repository',
36
19
  repositoryPath: data.repositoryPath,
37
20
  }
38
- : undefined, header: data ? (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] })) : undefined, children: data ? (_jsxs("div", { className: "flex flex-1 flex-col overflow-y-auto", children: [hasGitInfo ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", "data-testid": "repository-drawer-git-section", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT STATUS" }), _jsxs("div", { className: "flex flex-col gap-2", children: [data.branch ? (_jsxs("div", { className: "flex items-center justify-between gap-2", "data-testid": "repository-drawer-branch-row", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-sm", children: [_jsx(GitBranch, { className: "h-4 w-4 shrink-0" }), _jsx("span", { className: "text-foreground font-medium", children: "Branch" })] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "secondary", className: "font-mono text-xs", "data-testid": "repository-drawer-branch", children: data.branch }), data.behindCount != null && data.behindCount > 0 ? (_jsxs(Badge, { variant: "outline", className: "border-amber-500/40 bg-amber-50 text-xs text-amber-600 dark:bg-amber-900/20 dark:text-amber-400", "data-testid": "repository-drawer-behind", children: [_jsx(ArrowDown, { className: "mr-1 h-3 w-3" }), data.behindCount, " behind"] })) : null] })] })) : null, data.commitMessage ? (_jsx("div", { className: "bg-muted/50 rounded-lg p-3", "data-testid": "repository-drawer-commit-section", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground mt-0.5 h-4 w-4 shrink-0" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-foreground text-sm leading-snug font-medium", "data-testid": "repository-drawer-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("div", { className: "text-muted-foreground mt-1 flex items-center gap-1 text-xs", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { "data-testid": "repository-drawer-committer", children: data.committer })] })) : null] })] }) })) : null] })] })] })) : null, data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null, data.createdAt ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", "data-testid": "repository-drawer-metadata", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "INFO" }), _jsxs("div", { className: "flex items-center justify-between text-sm", children: [_jsxs("div", { className: "text-muted-foreground flex items-center gap-2", children: [_jsx(Clock, { className: "h-4 w-4 shrink-0" }), _jsx("span", { children: "Added" })] }), _jsx("span", { className: "text-foreground text-xs", title: new Date(data.createdAt).toLocaleString(), "data-testid": "repository-drawer-created-at", children: formatRelativeTime(data.createdAt) })] })] })] })) : null] })) : null }));
21
+ : undefined, header: data ? (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] })) : undefined, children: data?.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null }));
39
22
  }
@@ -3,12 +3,7 @@ import { RepositoryDrawer } from './repository-drawer.js';
3
3
  declare const meta: Meta<typeof RepositoryDrawer>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof RepositoryDrawer>;
6
- /** Basic drawer — no git info, just path and actions. */
7
6
  export declare const Default: Story;
8
- /** Full enriched drawer — branch, commit, committer, behind count, metadata. */
9
- export declare const WithGitInfo: Story;
10
- /** On default branch — no behind count shown. */
11
- export declare const OnDefaultBranch: Story;
12
7
  export declare const LongPath: Story;
13
8
  export declare const WithoutPath: Story;
14
9
  /** Repository drawer rendered inside a full-page context — starts open. */
@@ -1 +1 @@
1
- {"version":3,"file":"repository-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAOvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAgE/C,yDAAyD;AACzD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,eAAe,EAAE,KAE7B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC"}
1
+ {"version":3,"file":"repository-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAGvD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAOvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAqB/C,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAuBF,2EAA2E;AAC3E,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC"}