@shepai/cli 1.66.4 → 1.68.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts.map +1 -1
  2. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +21 -1
  3. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts +15 -1
  4. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts.map +1 -1
  5. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.js +16 -2
  6. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.d.ts +12 -0
  7. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.d.ts.map +1 -0
  8. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.js +284 -0
  9. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.d.ts +33 -0
  10. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.d.ts.map +1 -0
  11. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.js +210 -0
  12. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +56 -0
  13. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -0
  14. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +32 -0
  15. package/dist/src/presentation/web/components/common/control-center-drawer/index.d.ts +3 -0
  16. package/dist/src/presentation/web/components/common/control-center-drawer/index.d.ts.map +1 -0
  17. package/dist/src/presentation/web/components/common/control-center-drawer/index.js +2 -0
  18. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.d.ts +0 -4
  19. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.d.ts.map +1 -1
  20. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts +1 -1
  21. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts.map +1 -1
  22. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +18 -12
  23. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts +4 -6
  24. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts.map +1 -1
  25. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.js +5 -13
  26. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  27. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +2 -13
  28. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +2 -10
  29. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  30. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +21 -1
  31. package/dist/src/presentation/web/components/common/feature-create-drawer/index.d.ts +1 -1
  32. package/dist/src/presentation/web/components/common/feature-create-drawer/index.d.ts.map +1 -1
  33. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  34. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +14 -20
  35. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts +7 -1
  36. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts.map +1 -1
  37. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +37 -2
  38. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +1 -0
  39. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  40. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  41. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +9 -2
  42. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +1 -0
  43. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  44. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +13 -1
  45. package/dist/src/presentation/web/components/common/index.d.ts +1 -0
  46. package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
  47. package/dist/src/presentation/web/components/common/index.js +1 -0
  48. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
  49. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +2 -2
  50. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
  51. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +1 -2
  52. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +1 -1
  53. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
  54. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +1 -2
  55. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
  56. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +5 -1
  57. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts +2 -0
  58. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +13 -2
  60. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +1 -1
  61. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +5 -2
  62. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.js +1 -1
  63. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -1
  64. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +1 -1
  65. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -1
  66. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +1 -2
  67. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  68. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +20 -215
  69. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  70. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +2 -1
  71. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +2 -1
  72. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  73. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +4 -2
  74. package/dist/tsconfig.build.tsbuildinfo +1 -1
  75. package/package.json +2 -2
  76. package/web/.next/BUILD_ID +1 -1
  77. package/web/.next/build-manifest.json +5 -5
  78. package/web/.next/cache/.previewinfo +1 -1
  79. package/web/.next/cache/.rscinfo +1 -1
  80. package/web/.next/cache/.tsbuildinfo +1 -1
  81. package/web/.next/cache/config.json +3 -3
  82. package/web/.next/fallback-build-manifest.json +2 -2
  83. package/web/.next/prerender-manifest.json +3 -3
  84. package/web/.next/required-server-files.js +1 -1
  85. package/web/.next/required-server-files.json +1 -1
  86. package/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
  87. package/web/.next/server/app/_global-error.html +2 -2
  88. package/web/.next/server/app/_global-error.rsc +1 -1
  89. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  90. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  91. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  92. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  93. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  94. package/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
  95. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  96. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  97. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/page/build-manifest.json +3 -3
  99. package/web/.next/server/app/page/server-reference-manifest.json +88 -88
  100. package/web/.next/server/app/page.js +1 -1
  101. package/web/.next/server/app/page.js.nft.json +1 -1
  102. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  103. package/web/.next/server/app/skills/page/build-manifest.json +3 -3
  104. package/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
  105. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  106. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  107. package/web/.next/server/app/tools/page/build-manifest.json +3 -3
  108. package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  109. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  110. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  111. package/web/.next/server/app/version/page/build-manifest.json +3 -3
  112. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  113. package/web/.next/server/app/version/page.js.nft.json +1 -1
  114. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  115. package/web/.next/server/chunks/ssr/403f9_next_dist_a53cb908._.js +3 -0
  116. package/web/.next/server/chunks/ssr/403f9_next_dist_a53cb908._.js.map +1 -0
  117. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  120. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f5830fa9._.js → [root-of-the-server]__2ffb27f1._.js} +2 -2
  121. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f5830fa9._.js.map → [root-of-the-server]__2ffb27f1._.js.map} +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__7f4180a1._.js +3 -0
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__7f4180a1._.js.map +1 -0
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  129. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +9 -0
  133. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f648005b._.js.map → [root-of-the-server]__e41b5eec._.js.map} +1 -1
  134. package/web/.next/server/chunks/ssr/[root-of-the-server]__eaf6100f._.js +3 -0
  135. package/web/.next/server/chunks/ssr/[root-of-the-server]__eaf6100f._.js.map +1 -0
  136. package/web/.next/server/chunks/ssr/_23c92688._.js +6 -0
  137. package/web/.next/server/chunks/ssr/_23c92688._.js.map +1 -0
  138. package/web/.next/server/chunks/ssr/_28993370._.js +1 -1
  139. package/web/.next/server/chunks/ssr/_28993370._.js.map +1 -1
  140. package/web/.next/server/chunks/ssr/_49bf495c._.js +3 -0
  141. package/web/.next/server/chunks/ssr/_49bf495c._.js.map +1 -0
  142. package/web/.next/server/chunks/ssr/_690ea95f._.js +3 -0
  143. package/web/.next/server/chunks/ssr/{_2900ed94._.js.map → _690ea95f._.js.map} +1 -1
  144. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/_c52cace8._.js → server/chunks/ssr/_725584e5._.js} +2 -2
  145. package/web/.next/server/chunks/ssr/_725584e5._.js.map +1 -0
  146. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  147. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  148. package/web/.next/server/middleware-build-manifest.js +3 -3
  149. package/web/.next/server/pages/500.html +2 -2
  150. package/web/.next/server/server-reference-manifest.js +1 -1
  151. package/web/.next/server/server-reference-manifest.json +115 -115
  152. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  153. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +5 -5
  154. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  155. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  156. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
  157. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  158. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  159. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  160. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  161. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  162. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  163. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  164. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
  165. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  166. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  167. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  168. package/web/.next/standalone/src/presentation/web/.next/server/app/page/build-manifest.json +3 -3
  169. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +88 -88
  170. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +1 -1
  171. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  172. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  173. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/build-manifest.json +3 -3
  174. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
  175. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  176. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  177. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/build-manifest.json +3 -3
  178. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  180. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  181. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +3 -3
  182. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  183. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  184. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  185. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/403f9_next_dist_a53cb908._.js +3 -0
  186. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  187. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  188. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__f5830fa9._.js → [root-of-the-server]__2ffb27f1._.js} +2 -2
  189. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
  190. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  191. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__7f4180a1._.js +3 -0
  192. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  193. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  194. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +9 -0
  195. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__eaf6100f._.js +3 -0
  196. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_23c92688._.js +6 -0
  197. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_28993370._.js +1 -1
  198. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_49bf495c._.js +3 -0
  199. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_690ea95f._.js +3 -0
  200. package/web/.next/{server/chunks/ssr/_c52cace8._.js → standalone/src/presentation/web/.next/server/chunks/ssr/_725584e5._.js} +2 -2
  201. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  202. package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +3 -3
  203. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  204. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  205. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +115 -115
  206. package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.stories.tsx +16 -2
  207. package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.tsx +35 -6
  208. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.tsx +285 -0
  209. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/control-center-drawer.tsx +650 -0
  210. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/drawer-view.ts +82 -0
  211. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/index.ts +2 -0
  212. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.ts +0 -4
  213. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.tsx +5 -14
  214. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx +58 -51
  215. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx +42 -1
  216. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +2 -16
  217. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/index.ts +1 -0
  218. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.tsx +55 -2
  219. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +97 -106
  220. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node-state-config.ts +1 -0
  221. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.stories.tsx +14 -1
  222. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.tsx +61 -1
  223. package/web/.next/standalone/src/presentation/web/components/common/index.ts +6 -0
  224. package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.stories.tsx +1 -2
  225. package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.tsx +1 -2
  226. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +1 -2
  227. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +1 -1
  228. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-drawer.stories.tsx +28 -2
  229. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-drawer.tsx +7 -2
  230. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.tsx +1 -1
  231. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +7 -6
  232. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx +1 -2
  233. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +1 -2
  234. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +31 -348
  235. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +2 -1
  236. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +9 -1
  237. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  238. package/web/.next/static/chunks/0751efba75563e6a.js +1 -0
  239. package/web/.next/static/chunks/33b4e5444019ab64.js +1 -0
  240. package/web/.next/static/chunks/{35f41ba0a6d626d7.js → 491ae2bbae40857c.js} +1 -1
  241. package/web/.next/static/chunks/49feba0d1a871e2b.js +10 -0
  242. package/web/.next/static/chunks/4b6cc9f65260f2bd.js +2 -0
  243. package/web/.next/static/chunks/{e0073669b6bc24df.js → 7f6db87dc1fe9c3b.js} +1 -1
  244. package/web/.next/static/chunks/a186bbb822ccb655.css +2 -0
  245. package/web/.next/static/chunks/a5c59952485e875e.js +1 -0
  246. package/web/.next/static/chunks/{8c60d1bd87239066.js → a9626385607910b3.js} +1 -1
  247. package/web/.next/static/chunks/c1c15470a7b058c8.js +1 -0
  248. package/web/.next/static/chunks/caa2e7e1618e2179.js +1 -0
  249. package/web/.next/static/chunks/fb703cf73aba2eb8.js +1 -0
  250. package/web/.next/static/chunks/{turbopack-b6b5b4f015327a9a.js → turbopack-958ac34b879d0dce.js} +1 -1
  251. package/web/.next/trace +1 -1
  252. package/web/.next/trace-build +1 -1
  253. package/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js +0 -3
  254. package/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js.map +0 -1
  255. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js +0 -3
  256. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js.map +0 -1
  257. package/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js +0 -3
  258. package/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js.map +0 -1
  259. package/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js +0 -9
  260. package/web/.next/server/chunks/ssr/_2900ed94._.js +0 -3
  261. package/web/.next/server/chunks/ssr/_6978d868._.js +0 -3
  262. package/web/.next/server/chunks/ssr/_6978d868._.js.map +0 -1
  263. package/web/.next/server/chunks/ssr/_85965278._.js +0 -6
  264. package/web/.next/server/chunks/ssr/_85965278._.js.map +0 -1
  265. package/web/.next/server/chunks/ssr/_c52cace8._.js.map +0 -1
  266. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js +0 -3
  267. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js +0 -3
  268. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js +0 -3
  269. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js +0 -9
  270. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_2900ed94._.js +0 -3
  271. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_6978d868._.js +0 -3
  272. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_85965278._.js +0 -6
  273. package/web/.next/static/chunks/41a2adc09edfffaf.js +0 -1
  274. package/web/.next/static/chunks/5054c72b1c8f5912.js +0 -1
  275. package/web/.next/static/chunks/5f6d9f4647fc3093.js +0 -10
  276. package/web/.next/static/chunks/96f49affaceab206.css +0 -2
  277. package/web/.next/static/chunks/a6d1d774260fc927.js +0 -2
  278. package/web/.next/static/chunks/c0fdd832fc4ee8eb.js +0 -1
  279. package/web/.next/static/chunks/de70ba984363673f.js +0 -1
  280. package/web/.next/static/chunks/f5fb2f182ae9b015.js +0 -1
  281. /package/web/.next/static/{XGbKxw26cOCJQ-711YxBw → ntu60tngTU2e9MZgpdlz0}/_buildManifest.js +0 -0
  282. /package/web/.next/static/{XGbKxw26cOCJQ-711YxBw → ntu60tngTU2e9MZgpdlz0}/_clientMiddlewareManifest.json +0 -0
  283. /package/web/.next/static/{XGbKxw26cOCJQ-711YxBw → ntu60tngTU2e9MZgpdlz0}/_ssgManifest.js +0 -0
@@ -1,10 +1,9 @@
1
1
  'use client';
2
2
 
3
- import { useCallback, useEffect } from 'react';
3
+ import { useCallback } from 'react';
4
4
  import { Loader2, Trash2, ExternalLink, GitCommitHorizontal } from 'lucide-react';
5
5
  import { PrStatus } from '@shepai/core/domain/generated/output';
6
6
  import { cn } from '@/lib/utils';
7
- import { useSoundAction } from '@/hooks/use-sound-action';
8
7
  import { OpenActionMenu } from '@/components/common/open-action-menu';
9
8
  import { BaseDrawer } from '@/components/common/base-drawer';
10
9
  import { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';
@@ -41,33 +40,101 @@ export function FeatureDrawer({
41
40
  onDelete,
42
41
  isDeleting = false,
43
42
  }: FeatureDrawerProps) {
44
- const drawerOpenSound = useSoundAction('drawer-open');
45
- const drawerCloseSound = useSoundAction('drawer-close');
46
-
47
- const isOpen = selectedNode !== null;
48
- const playDrawerOpen = drawerOpenSound.play;
49
- useEffect(() => {
50
- if (isOpen) playDrawerOpen();
51
- }, [isOpen, playDrawerOpen]);
52
-
53
43
  const handleClose = useCallback(() => {
54
- drawerCloseSound.play();
55
44
  onClose();
56
- }, [onClose, drawerCloseSound]);
45
+ }, [onClose]);
46
+
47
+ const actionsInput =
48
+ selectedNode?.repositoryPath && selectedNode?.branch
49
+ ? {
50
+ repositoryPath: selectedNode.repositoryPath,
51
+ branch: selectedNode.branch,
52
+ specPath: selectedNode.specPath,
53
+ }
54
+ : null;
55
+ const actions = useFeatureActions(actionsInput);
57
56
 
58
57
  return (
59
58
  <BaseDrawer
60
59
  open={selectedNode !== null}
61
60
  onClose={handleClose}
62
- size="sm"
61
+ size="md"
63
62
  modal={false}
64
63
  data-testid="feature-drawer"
65
64
  header={
66
65
  selectedNode ? (
67
- <div data-testid="feature-drawer-header">
68
- <DrawerTitle>{selectedNode.name}</DrawerTitle>
69
- <DrawerDescription>{selectedNode.featureId}</DrawerDescription>
70
- </div>
66
+ <>
67
+ <div data-testid="feature-drawer-header">
68
+ <DrawerTitle>{selectedNode.name}</DrawerTitle>
69
+ {selectedNode.description ? (
70
+ <DrawerDescription>{selectedNode.description}</DrawerDescription>
71
+ ) : selectedNode.featureId ? (
72
+ <DrawerDescription className="sr-only">{selectedNode.featureId}</DrawerDescription>
73
+ ) : null}
74
+ </div>
75
+
76
+ {actionsInput ? (
77
+ <div className="flex items-center gap-2 pt-2">
78
+ <OpenActionMenu
79
+ actions={actions}
80
+ repositoryPath={actionsInput.repositoryPath}
81
+ showSpecs={!!actionsInput.specPath}
82
+ />
83
+ {onDelete && selectedNode.featureId ? (
84
+ <>
85
+ <div className="bg-border mx-1 h-4 w-px" />
86
+ <AlertDialog>
87
+ <AlertDialogTrigger asChild>
88
+ <Button
89
+ variant="ghost"
90
+ size="icon-sm"
91
+ aria-label="Delete feature"
92
+ disabled={isDeleting}
93
+ className="text-muted-foreground hover:text-destructive"
94
+ data-testid="feature-drawer-delete"
95
+ >
96
+ {isDeleting ? (
97
+ <Loader2 className="size-4 animate-spin" />
98
+ ) : (
99
+ <Trash2 className="size-4" />
100
+ )}
101
+ </Button>
102
+ </AlertDialogTrigger>
103
+ <AlertDialogContent>
104
+ <AlertDialogHeader>
105
+ <AlertDialogTitle>Delete feature?</AlertDialogTitle>
106
+ <AlertDialogDescription>
107
+ This will permanently delete <strong>{selectedNode.name}</strong> (
108
+ {selectedNode.featureId}). This action cannot be undone.
109
+ {selectedNode.state === 'running' ? (
110
+ <> This feature has a running agent that will be stopped.</>
111
+ ) : null}
112
+ </AlertDialogDescription>
113
+ </AlertDialogHeader>
114
+ <AlertDialogFooter>
115
+ <AlertDialogCancel disabled={isDeleting}>Cancel</AlertDialogCancel>
116
+ <AlertDialogAction
117
+ variant="destructive"
118
+ disabled={isDeleting}
119
+ onClick={() => onDelete(selectedNode.featureId)}
120
+ >
121
+ {isDeleting ? (
122
+ <>
123
+ <Loader2 className="mr-2 h-4 w-4 animate-spin" />
124
+ Deleting…
125
+ </>
126
+ ) : (
127
+ 'Delete'
128
+ )}
129
+ </AlertDialogAction>
130
+ </AlertDialogFooter>
131
+ </AlertDialogContent>
132
+ </AlertDialog>
133
+ </>
134
+ ) : null}
135
+ </div>
136
+ ) : null}
137
+ </>
71
138
  ) : undefined
72
139
  }
73
140
  deployTarget={
@@ -82,18 +149,7 @@ export function FeatureDrawer({
82
149
  }
83
150
  >
84
151
  {selectedNode ? (
85
- <>
86
- {/* Action buttons */}
87
- {selectedNode.repositoryPath && selectedNode.branch ? (
88
- <DrawerActions
89
- repositoryPath={selectedNode.repositoryPath}
90
- branch={selectedNode.branch}
91
- specPath={selectedNode.specPath}
92
- />
93
- ) : null}
94
-
95
- <Separator />
96
-
152
+ <div className="flex-1 overflow-y-auto">
97
153
  {/* Status */}
98
154
  <div data-testid="feature-drawer-status" className="flex flex-col gap-3 p-4">
99
155
  <div className="text-muted-foreground text-xs font-semibold tracking-wider">
@@ -129,57 +185,9 @@ export function FeatureDrawer({
129
185
  </>
130
186
  ) : null}
131
187
 
132
- <Separator />
133
-
134
188
  {/* Details */}
135
189
  <DetailsSection data={selectedNode} />
136
-
137
- {/* Delete action */}
138
- {onDelete ? (
139
- <>
140
- <Separator />
141
- <div data-testid="feature-drawer-delete" className="p-4">
142
- <AlertDialog>
143
- <AlertDialogTrigger asChild>
144
- <Button variant="destructive" className="w-full" disabled={isDeleting}>
145
- <Trash2 className="mr-2 h-4 w-4" />
146
- Delete feature
147
- </Button>
148
- </AlertDialogTrigger>
149
- <AlertDialogContent>
150
- <AlertDialogHeader>
151
- <AlertDialogTitle>Delete feature?</AlertDialogTitle>
152
- <AlertDialogDescription>
153
- This will permanently delete <strong>{selectedNode.name}</strong> (
154
- {selectedNode.featureId}). This action cannot be undone.
155
- {selectedNode.state === 'running' ? (
156
- <> This feature has a running agent that will be stopped.</>
157
- ) : null}
158
- </AlertDialogDescription>
159
- </AlertDialogHeader>
160
- <AlertDialogFooter>
161
- <AlertDialogCancel disabled={isDeleting}>Cancel</AlertDialogCancel>
162
- <AlertDialogAction
163
- variant="destructive"
164
- disabled={isDeleting}
165
- onClick={() => onDelete(selectedNode.featureId)}
166
- >
167
- {isDeleting ? (
168
- <>
169
- <Loader2 className="mr-2 h-4 w-4 animate-spin" />
170
- Deleting…
171
- </>
172
- ) : (
173
- 'Delete'
174
- )}
175
- </AlertDialogAction>
176
- </AlertDialogFooter>
177
- </AlertDialogContent>
178
- </AlertDialog>
179
- </div>
180
- </>
181
- ) : null}
182
- </>
190
+ </div>
183
191
  ) : null}
184
192
  </BaseDrawer>
185
193
  );
@@ -208,19 +216,20 @@ function StateBadge({ data }: { data: FeatureNodeData }) {
208
216
  }
209
217
 
210
218
  function DetailsSection({ data }: { data: FeatureNodeData }) {
211
- const hasAnyDetail =
212
- data.description ?? data.agentType ?? data.runtime ?? data.blockedBy ?? data.errorMessage;
219
+ const hasAnyDetail = data.agentType ?? data.runtime ?? data.blockedBy ?? data.errorMessage;
213
220
 
214
221
  if (!hasAnyDetail) return null;
215
222
 
216
223
  return (
217
- <div data-testid="feature-drawer-details" className="flex flex-col gap-3 p-4">
218
- {data.description ? <DetailRow label="Description" value={data.description} /> : null}
219
- {data.agentType ? <DetailRow label="Agent" value={data.agentType} /> : null}
220
- {data.runtime ? <DetailRow label="Runtime" value={data.runtime} /> : null}
221
- {data.blockedBy ? <DetailRow label="Blocked by" value={data.blockedBy} /> : null}
222
- {data.errorMessage ? <DetailRow label="Error" value={data.errorMessage} /> : null}
223
- </div>
224
+ <>
225
+ <Separator />
226
+ <div data-testid="feature-drawer-details" className="flex flex-col gap-3 p-4">
227
+ {data.agentType ? <DetailRow label="Agent" value={data.agentType} /> : null}
228
+ {data.runtime ? <DetailRow label="Runtime" value={data.runtime} /> : null}
229
+ {data.blockedBy ? <DetailRow label="Blocked by" value={data.blockedBy} /> : null}
230
+ {data.errorMessage ? <DetailRow label="Error" value={data.errorMessage} /> : null}
231
+ </div>
232
+ </>
224
233
  );
225
234
  }
226
235
 
@@ -281,21 +290,3 @@ function PrInfoSection({ pr }: { pr: NonNullable<FeatureNodeData['pr']> }) {
281
290
  </div>
282
291
  );
283
292
  }
284
-
285
- function DrawerActions({
286
- repositoryPath,
287
- branch,
288
- specPath,
289
- }: {
290
- repositoryPath: string;
291
- branch: string;
292
- specPath?: string;
293
- }) {
294
- const actions = useFeatureActions({ repositoryPath, branch, specPath });
295
-
296
- return (
297
- <div className="flex gap-2 px-4 pb-3">
298
- <OpenActionMenu actions={actions} repositoryPath={repositoryPath} showSpecs={!!specPath} />
299
- </div>
300
- );
301
- }
@@ -71,6 +71,7 @@ export interface FeatureNodeData {
71
71
  };
72
72
  onAction?: () => void;
73
73
  onSettings?: () => void;
74
+ onDelete?: (featureId: string) => void;
74
75
  showHandles?: boolean;
75
76
  }
76
77
 
@@ -1,6 +1,6 @@
1
1
  import { useMemo } from 'react';
2
2
  import type { Meta, StoryObj } from '@storybook/react';
3
- import { expect, waitFor } from '@storybook/test';
3
+ import { expect, fn, waitFor } from '@storybook/test';
4
4
  import { ReactFlowProvider, ReactFlow, useNodesState } from '@xyflow/react';
5
5
  import { FeatureNode } from './feature-node';
6
6
  import type { AgentTypeValue } from './agent-type-icons';
@@ -351,6 +351,19 @@ export const ErrorWithMessage: Story = {
351
351
  render: (args) => <FeatureNodeCanvas data={args} />,
352
352
  };
353
353
 
354
+ export const WithDeleteButton: Story = {
355
+ args: {
356
+ name: 'Auth Module',
357
+ description: 'Implement OAuth2 authentication flow',
358
+ featureId: '#f1',
359
+ lifecycle: 'implementation',
360
+ state: 'running',
361
+ progress: 45,
362
+ onDelete: fn(),
363
+ },
364
+ render: (args) => <FeatureNodeCanvas data={args} />,
365
+ };
366
+
354
367
  const interactiveInitialNodes: FeatureNodeType[] = [
355
368
  {
356
369
  id: 'node-1',
@@ -1,8 +1,20 @@
1
1
  'use client';
2
2
 
3
+ import { useState } from 'react';
3
4
  import { Handle, Position } from '@xyflow/react';
4
- import { Settings, Plus, FileText, Wrench, GitMerge, type LucideIcon } from 'lucide-react';
5
+ import { Settings, Plus, FileText, Wrench, GitMerge, Trash2, type LucideIcon } from 'lucide-react';
5
6
  import { cn } from '@/lib/utils';
7
+ import {
8
+ AlertDialog,
9
+ AlertDialogAction,
10
+ AlertDialogCancel,
11
+ AlertDialogContent,
12
+ AlertDialogDescription,
13
+ AlertDialogFooter,
14
+ AlertDialogHeader,
15
+ AlertDialogTitle,
16
+ } from '@/components/ui/alert-dialog';
17
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
6
18
  import {
7
19
  featureNodeStateConfig,
8
20
  lifecycleDisplayLabels,
@@ -74,6 +86,7 @@ export function FeatureNode({
74
86
  }) {
75
87
  const config = featureNodeStateConfig[data.state];
76
88
  const Icon = config.icon;
89
+ const [confirmOpen, setConfirmOpen] = useState(false);
77
90
 
78
91
  return (
79
92
  <div className="group relative">
@@ -86,6 +99,53 @@ export function FeatureNode({
86
99
  />
87
100
  ) : null}
88
101
 
102
+ {/* Delete button — visible on hover, positioned to the left */}
103
+ {data.onDelete && data.featureId ? (
104
+ <>
105
+ <div className="absolute top-1/2 -left-10 -translate-y-1/2 opacity-0 transition-opacity group-hover:opacity-100">
106
+ <TooltipProvider>
107
+ <Tooltip>
108
+ <TooltipTrigger asChild>
109
+ <button
110
+ aria-label="Delete feature"
111
+ data-testid="feature-node-delete-button"
112
+ onClick={(e) => {
113
+ e.stopPropagation();
114
+ setConfirmOpen(true);
115
+ }}
116
+ 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"
117
+ >
118
+ <Trash2 className="h-3.5 w-3.5" />
119
+ </button>
120
+ </TooltipTrigger>
121
+ <TooltipContent>Delete feature</TooltipContent>
122
+ </Tooltip>
123
+ </TooltipProvider>
124
+ </div>
125
+
126
+ <AlertDialog open={confirmOpen} onOpenChange={setConfirmOpen}>
127
+ <AlertDialogContent size="sm">
128
+ <AlertDialogHeader>
129
+ <AlertDialogTitle>Delete feature?</AlertDialogTitle>
130
+ <AlertDialogDescription>
131
+ This will permanently delete <strong>{data.name}</strong> and all associated data
132
+ including specs, branches, and progress.
133
+ </AlertDialogDescription>
134
+ </AlertDialogHeader>
135
+ <AlertDialogFooter>
136
+ <AlertDialogCancel>Cancel</AlertDialogCancel>
137
+ <AlertDialogAction
138
+ variant="destructive"
139
+ onClick={() => data.onDelete?.(data.featureId)}
140
+ >
141
+ Delete
142
+ </AlertDialogAction>
143
+ </AlertDialogFooter>
144
+ </AlertDialogContent>
145
+ </AlertDialog>
146
+ </>
147
+ ) : null}
148
+
89
149
  <div
90
150
  data-testid="feature-node-card"
91
151
  aria-busy={data.state === 'creating' ? 'true' : undefined}
@@ -1,3 +1,9 @@
1
+ export {
2
+ ControlCenterDrawer,
3
+ type ControlCenterDrawerProps,
4
+ computeDrawerView,
5
+ type DrawerView,
6
+ } from './control-center-drawer';
1
7
  export {
2
8
  AddRepositoryNode,
3
9
  type AddRepositoryNodeData,
@@ -42,7 +42,7 @@ const defaultActions = {
42
42
  /* ─── Standalone MergeReview ─── */
43
43
 
44
44
  const meta: Meta<typeof MergeReview> = {
45
- title: 'Common/MergeReview',
45
+ title: 'Drawers/Review/MergeReview',
46
46
  component: MergeReview,
47
47
  tags: ['autodocs'],
48
48
  parameters: {
@@ -161,7 +161,6 @@ export const WithPhases: Story = {
161
161
  type DrawerStory = StoryObj<typeof MergeReviewDrawer>;
162
162
 
163
163
  const drawerMeta = {
164
- title: 'Common/MergeReviewDrawer',
165
164
  component: MergeReviewDrawer,
166
165
  tags: ['autodocs'],
167
166
  parameters: {
@@ -56,7 +56,7 @@ export function MergeReview({
56
56
  const { pr, diffSummary, phases, branch, warning } = data;
57
57
 
58
58
  return (
59
- <div className="flex h-full flex-col">
59
+ <div className="flex flex-1 flex-col">
60
60
  <div className="flex-1 space-y-4 overflow-y-auto p-4">
61
61
  {/* Header */}
62
62
  <div className="flex items-start gap-3">
@@ -186,7 +186,6 @@ export function MergeReview({
186
186
  )
187
187
  }
188
188
  revisionPlaceholder="Ask AI to revise before merging..."
189
- rejectDialogTitle="Reject Merge"
190
189
  isProcessing={isProcessing}
191
190
  isRejecting={isRejecting}
192
191
  />
@@ -164,7 +164,7 @@ function InteractiveQuestionnaire({
164
164
  /* ─── Standalone PrdQuestionnaire ─── */
165
165
 
166
166
  const meta: Meta<typeof PrdQuestionnaire> = {
167
- title: 'Composed/PrdQuestionnaire',
167
+ title: 'Drawers/Review/PrdQuestionnaire',
168
168
  component: PrdQuestionnaire,
169
169
  tags: ['autodocs'],
170
170
  parameters: {
@@ -280,7 +280,6 @@ export const MinimalData: Story = {
280
280
  type DrawerStory = StoryObj<typeof PrdQuestionnaireDrawer>;
281
281
 
282
282
  const drawerMeta = {
283
- title: 'Composed/PrdQuestionnaireDrawer',
284
283
  component: PrdQuestionnaireDrawer,
285
284
  tags: ['autodocs'],
286
285
  parameters: {
@@ -46,7 +46,7 @@ export function PrdQuestionnaire({
46
46
  if (total === 0) return null;
47
47
 
48
48
  return (
49
- <div className="flex h-full flex-col">
49
+ <div className="flex flex-1 flex-col">
50
50
  <div className="flex-1 space-y-4 overflow-y-auto p-4">
51
51
  {/* Header */}
52
52
  {showHeader ? (
@@ -5,7 +5,7 @@ import { RepositoryDrawer } from './repository-drawer';
5
5
  import type { RepositoryNodeData } from './repository-node-config';
6
6
 
7
7
  const meta: Meta<typeof RepositoryDrawer> = {
8
- title: 'Composed/RepositoryDrawer',
8
+ title: 'Drawers/Feature/RepositoryDrawer',
9
9
  component: RepositoryDrawer,
10
10
  tags: ['autodocs'],
11
11
  parameters: {
@@ -36,7 +36,7 @@ function DrawerTrigger({ data, label }: { data: RepositoryNodeData; label: strin
36
36
  }
37
37
 
38
38
  export const Default: Story = {
39
- render: () => <DrawerTrigger data={repoData} label="Open Repository" />,
39
+ render: () => <RepositoryDrawerShellTemplate data={repoData} />,
40
40
  };
41
41
 
42
42
  export const LongPath: Story = {
@@ -56,3 +56,29 @@ export const WithoutPath: Story = {
56
56
  <DrawerTrigger data={{ ...repoData, repositoryPath: undefined }} label="Open Without Path" />
57
57
  ),
58
58
  };
59
+
60
+ /* ---------------------------------------------------------------------------
61
+ * Shell template — full page context, starts open (matches ReviewDrawerShell pattern)
62
+ * ------------------------------------------------------------------------- */
63
+
64
+ function RepositoryDrawerShellTemplate({ data }: { data: RepositoryNodeData }) {
65
+ const [selected, setSelected] = useState<RepositoryNodeData | null>(data);
66
+
67
+ return (
68
+ <div style={{ height: '100vh', background: '#f8fafc', padding: '2rem' }}>
69
+ <button
70
+ type="button"
71
+ onClick={() => setSelected(data)}
72
+ style={{ padding: '8px 16px', border: '1px solid #ccc', borderRadius: '6px' }}
73
+ >
74
+ Open Drawer
75
+ </button>
76
+ <RepositoryDrawer data={selected} onClose={() => setSelected(null)} />
77
+ </div>
78
+ );
79
+ }
80
+
81
+ /** Repository drawer rendered inside a full-page context — starts open. */
82
+ export const InDrawer: Story = {
83
+ render: () => <RepositoryDrawerShellTemplate data={repoData} />,
84
+ };
@@ -1,5 +1,6 @@
1
1
  'use client';
2
2
 
3
+ import { useCallback } from 'react';
3
4
  import { Code2, Terminal, FolderOpen } from 'lucide-react';
4
5
  import { BaseDrawer } from '@/components/common/base-drawer';
5
6
  import { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';
@@ -14,6 +15,10 @@ export interface RepositoryDrawerProps {
14
15
  }
15
16
 
16
17
  export function RepositoryDrawer({ data, onClose }: RepositoryDrawerProps) {
18
+ const handleClose = useCallback(() => {
19
+ onClose();
20
+ }, [onClose]);
21
+
17
22
  const actions = useRepositoryActions(
18
23
  data?.repositoryPath ? { repositoryPath: data.repositoryPath } : null
19
24
  );
@@ -21,8 +26,8 @@ export function RepositoryDrawer({ data, onClose }: RepositoryDrawerProps) {
21
26
  return (
22
27
  <BaseDrawer
23
28
  open={data !== null}
24
- onClose={onClose}
25
- size="sm"
29
+ onClose={handleClose}
30
+ size="md"
26
31
  modal={false}
27
32
  data-testid="repository-drawer"
28
33
  deployTarget={
@@ -4,7 +4,7 @@ import { fn } from '@storybook/test';
4
4
  import { ReviewDrawerShell } from './review-drawer-shell';
5
5
 
6
6
  const meta: Meta<typeof ReviewDrawerShell> = {
7
- title: 'Composed/ReviewDrawerShell',
7
+ title: 'Drawers/Review/ReviewDrawerShell',
8
8
  component: ReviewDrawerShell,
9
9
  tags: ['autodocs'],
10
10
  parameters: {
@@ -1,10 +1,10 @@
1
1
  'use client';
2
2
 
3
+ import { useCallback } from 'react';
3
4
  import { Loader2, Trash2, Play, Square } from 'lucide-react';
4
5
  import { BaseDrawer } from '@/components/common/base-drawer';
5
6
  import { DrawerTitle, DrawerDescription } from '@/components/ui/drawer';
6
7
  import { Button } from '@/components/ui/button';
7
- import { Separator } from '@/components/ui/separator';
8
8
  import {
9
9
  AlertDialog,
10
10
  AlertDialogAction,
@@ -38,6 +38,10 @@ export function ReviewDrawerShell({
38
38
  isDeleting,
39
39
  children,
40
40
  }: ReviewDrawerShellProps) {
41
+ const handleClose = useCallback(() => {
42
+ onClose();
43
+ }, [onClose]);
44
+
41
45
  const actionsInput = repositoryPath && branch ? { repositoryPath, branch, specPath } : null;
42
46
  const actions = useFeatureActions(actionsInput);
43
47
 
@@ -51,7 +55,7 @@ export function ReviewDrawerShell({
51
55
  return (
52
56
  <BaseDrawer
53
57
  open={open}
54
- onClose={onClose}
58
+ onClose={handleClose}
55
59
  size="md"
56
60
  modal={false}
57
61
  data-testid="review-drawer"
@@ -151,10 +155,7 @@ export function ReviewDrawerShell({
151
155
  </>
152
156
  }
153
157
  >
154
- <Separator />
155
-
156
- {/* Content slot */}
157
- <div className="flex min-h-0 flex-1 flex-col">{children}</div>
158
+ {children}
158
159
  </BaseDrawer>
159
160
  );
160
161
  }
@@ -45,7 +45,7 @@ const mockData: TechDecisionsReviewData = {
45
45
  /* ─── Standalone TechDecisionsReview ─── */
46
46
 
47
47
  const meta: Meta<typeof TechDecisionsReview> = {
48
- title: 'Composed/TechDecisionsReview',
48
+ title: 'Drawers/Review/TechDecisionsReview',
49
49
  component: TechDecisionsReview,
50
50
  tags: ['autodocs'],
51
51
  parameters: {
@@ -104,7 +104,6 @@ export const NoTechnologies: Story = {
104
104
  type DrawerStory = StoryObj<typeof TechDecisionsDrawer>;
105
105
 
106
106
  const drawerMeta = {
107
- title: 'Composed/TechDecisionsDrawer',
108
107
  component: TechDecisionsDrawer,
109
108
  tags: ['autodocs'],
110
109
  parameters: {
@@ -131,7 +131,7 @@ export function TechDecisionsReview({
131
131
  if (decisions.length === 0) return null;
132
132
 
133
133
  return (
134
- <div className="flex h-full flex-col">
134
+ <div className="flex flex-1 flex-col">
135
135
  <div className="flex-1 space-y-4 overflow-y-auto p-4">
136
136
  {/* Header */}
137
137
  <div className="flex items-start gap-3">
@@ -164,7 +164,6 @@ export function TechDecisionsReview({
164
164
  approveLabel="Approve Plan"
165
165
  approveIcon={<Check className="mr-1.5 h-4 w-4" />}
166
166
  revisionPlaceholder="Ask AI to revise the plan..."
167
- rejectDialogTitle="Reject Plan"
168
167
  isProcessing={isProcessing}
169
168
  isRejecting={isRejecting}
170
169
  />