@shepai/cli 1.66.3 → 1.67.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 (276) hide show
  1. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  2. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +26 -11
  3. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  4. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +16 -10
  5. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts.map +1 -1
  6. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +21 -1
  7. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts +15 -1
  8. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts.map +1 -1
  9. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.js +16 -2
  10. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.d.ts +12 -0
  11. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.d.ts.map +1 -0
  12. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.js +284 -0
  13. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.d.ts +33 -0
  14. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.d.ts.map +1 -0
  15. package/dist/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.js +210 -0
  16. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +56 -0
  17. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -0
  18. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +32 -0
  19. package/dist/src/presentation/web/components/common/control-center-drawer/index.d.ts +3 -0
  20. package/dist/src/presentation/web/components/common/control-center-drawer/index.d.ts.map +1 -0
  21. package/dist/src/presentation/web/components/common/control-center-drawer/index.js +2 -0
  22. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.d.ts +0 -4
  23. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts +1 -1
  25. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts.map +1 -1
  26. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +18 -12
  27. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts +4 -6
  28. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.d.ts.map +1 -1
  29. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.js +5 -13
  30. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  31. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +2 -13
  32. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +2 -10
  33. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  34. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +21 -1
  35. package/dist/src/presentation/web/components/common/feature-create-drawer/index.d.ts +1 -1
  36. package/dist/src/presentation/web/components/common/feature-create-drawer/index.d.ts.map +1 -1
  37. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  38. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +14 -20
  39. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts +7 -1
  40. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts.map +1 -1
  41. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +37 -2
  42. package/dist/src/presentation/web/components/common/index.d.ts +1 -0
  43. package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
  44. package/dist/src/presentation/web/components/common/index.js +1 -0
  45. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
  46. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +2 -2
  47. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
  48. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +1 -2
  49. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +1 -1
  50. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
  51. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +1 -2
  52. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
  53. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +5 -1
  54. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts +2 -0
  55. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -1
  56. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +13 -2
  57. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +1 -1
  58. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +5 -2
  59. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.js +1 -1
  60. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -1
  61. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +1 -1
  62. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -1
  63. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +1 -2
  64. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  65. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +20 -215
  66. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  67. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +2 -1
  68. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  69. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +1 -1
  70. package/dist/tsconfig.build.tsbuildinfo +1 -1
  71. package/package.json +1 -1
  72. package/web/.next/BUILD_ID +1 -1
  73. package/web/.next/build-manifest.json +5 -5
  74. package/web/.next/cache/.previewinfo +1 -1
  75. package/web/.next/cache/.rscinfo +1 -1
  76. package/web/.next/cache/.tsbuildinfo +1 -1
  77. package/web/.next/cache/config.json +3 -3
  78. package/web/.next/fallback-build-manifest.json +2 -2
  79. package/web/.next/prerender-manifest.json +3 -3
  80. package/web/.next/required-server-files.js +1 -1
  81. package/web/.next/required-server-files.json +1 -1
  82. package/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
  83. package/web/.next/server/app/_global-error.html +2 -2
  84. package/web/.next/server/app/_global-error.rsc +1 -1
  85. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  86. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  87. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  88. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  89. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  90. package/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
  91. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  92. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  93. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/page/build-manifest.json +3 -3
  95. package/web/.next/server/app/page/server-reference-manifest.json +88 -88
  96. package/web/.next/server/app/page.js +1 -1
  97. package/web/.next/server/app/page.js.nft.json +1 -1
  98. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  99. package/web/.next/server/app/skills/page/build-manifest.json +3 -3
  100. package/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
  101. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  102. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  103. package/web/.next/server/app/tools/page/build-manifest.json +3 -3
  104. package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  105. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  106. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  107. package/web/.next/server/app/version/page/build-manifest.json +3 -3
  108. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  109. package/web/.next/server/app/version/page.js.nft.json +1 -1
  110. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  111. package/web/.next/server/chunks/ssr/403f9_next_dist_a53cb908._.js +3 -0
  112. package/web/.next/server/chunks/ssr/403f9_next_dist_a53cb908._.js.map +1 -0
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  116. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f5830fa9._.js → [root-of-the-server]__2ffb27f1._.js} +2 -2
  117. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f5830fa9._.js.map → [root-of-the-server]__2ffb27f1._.js.map} +1 -1
  118. package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
  119. package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__7f4180a1._.js +3 -0
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__7f4180a1._.js.map +1 -0
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +9 -0
  129. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f648005b._.js.map → [root-of-the-server]__e41b5eec._.js.map} +1 -1
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__eaf6100f._.js +3 -0
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__eaf6100f._.js.map +1 -0
  132. package/web/.next/server/chunks/ssr/_23c92688._.js +6 -0
  133. package/web/.next/server/chunks/ssr/_23c92688._.js.map +1 -0
  134. package/web/.next/server/chunks/ssr/_28993370._.js +1 -1
  135. package/web/.next/server/chunks/ssr/_28993370._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/_49bf495c._.js +3 -0
  137. package/web/.next/server/chunks/ssr/_49bf495c._.js.map +1 -0
  138. package/web/.next/server/chunks/ssr/_690ea95f._.js +3 -0
  139. package/web/.next/server/chunks/ssr/{_2900ed94._.js.map → _690ea95f._.js.map} +1 -1
  140. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/_c52cace8._.js → server/chunks/ssr/_725584e5._.js} +2 -2
  141. package/web/.next/server/chunks/ssr/_725584e5._.js.map +1 -0
  142. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  143. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  144. package/web/.next/server/middleware-build-manifest.js +3 -3
  145. package/web/.next/server/pages/500.html +2 -2
  146. package/web/.next/server/server-reference-manifest.js +1 -1
  147. package/web/.next/server/server-reference-manifest.json +115 -115
  148. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  149. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +5 -5
  150. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  151. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  152. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +3 -3
  153. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  154. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  155. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  156. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  157. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  158. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  159. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  160. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +3 -3
  161. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  162. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  163. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  164. package/web/.next/standalone/src/presentation/web/.next/server/app/page/build-manifest.json +3 -3
  165. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +88 -88
  166. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +1 -1
  167. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  168. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  169. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/build-manifest.json +3 -3
  170. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +5 -5
  171. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  172. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  173. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/build-manifest.json +3 -3
  174. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  175. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  176. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  177. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +3 -3
  178. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  180. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  181. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/403f9_next_dist_a53cb908._.js +3 -0
  182. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  183. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  184. 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
  185. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +1 -1
  186. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  187. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__7f4180a1._.js +3 -0
  188. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  189. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  190. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e41b5eec._.js +9 -0
  191. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__eaf6100f._.js +3 -0
  192. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_23c92688._.js +6 -0
  193. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_28993370._.js +1 -1
  194. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_49bf495c._.js +3 -0
  195. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_690ea95f._.js +3 -0
  196. package/web/.next/{server/chunks/ssr/_c52cace8._.js → standalone/src/presentation/web/.next/server/chunks/ssr/_725584e5._.js} +2 -2
  197. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  198. package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +3 -3
  199. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  200. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  201. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +115 -115
  202. package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.stories.tsx +16 -2
  203. package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.tsx +35 -6
  204. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/control-center-drawer.stories.tsx +285 -0
  205. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/control-center-drawer.tsx +650 -0
  206. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/drawer-view.ts +82 -0
  207. package/web/.next/standalone/src/presentation/web/components/common/control-center-drawer/index.ts +2 -0
  208. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.ts +0 -4
  209. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.tsx +5 -14
  210. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx +58 -51
  211. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx +42 -1
  212. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +2 -16
  213. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/index.ts +1 -0
  214. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.tsx +55 -2
  215. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +97 -106
  216. package/web/.next/standalone/src/presentation/web/components/common/index.ts +6 -0
  217. package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.stories.tsx +1 -2
  218. package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.tsx +1 -2
  219. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +1 -2
  220. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +1 -1
  221. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-drawer.stories.tsx +28 -2
  222. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-drawer.tsx +7 -2
  223. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.tsx +1 -1
  224. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +7 -6
  225. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx +1 -2
  226. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +1 -2
  227. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +30 -348
  228. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +2 -1
  229. package/web/.next/standalone/src/presentation/web/components/features/features-canvas/features-canvas.tsx +5 -1
  230. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  231. package/web/.next/static/chunks/38ca82d1243738e3.js +1 -0
  232. package/web/.next/static/chunks/{35f41ba0a6d626d7.js → 491ae2bbae40857c.js} +1 -1
  233. package/web/.next/static/chunks/4b6cc9f65260f2bd.js +2 -0
  234. package/web/.next/static/chunks/67599679ca9ac863.js +1 -0
  235. package/web/.next/static/chunks/{ed887cce7b31c91b.js → 6ece250c7d0ec203.js} +1 -1
  236. package/web/.next/static/chunks/a186bbb822ccb655.css +2 -0
  237. package/web/.next/static/chunks/a5c59952485e875e.js +1 -0
  238. package/web/.next/static/chunks/{8c60d1bd87239066.js → a9626385607910b3.js} +1 -1
  239. package/web/.next/static/chunks/c1c15470a7b058c8.js +1 -0
  240. package/web/.next/static/chunks/caa2e7e1618e2179.js +1 -0
  241. package/web/.next/static/chunks/ed799a306922f03e.js +10 -0
  242. package/web/.next/static/chunks/fb703cf73aba2eb8.js +1 -0
  243. package/web/.next/static/chunks/{turbopack-b6b5b4f015327a9a.js → turbopack-958ac34b879d0dce.js} +1 -1
  244. package/web/.next/trace +1 -1
  245. package/web/.next/trace-build +1 -1
  246. package/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js +0 -3
  247. package/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js.map +0 -1
  248. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js +0 -3
  249. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js.map +0 -1
  250. package/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js +0 -3
  251. package/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js.map +0 -1
  252. package/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js +0 -9
  253. package/web/.next/server/chunks/ssr/_2900ed94._.js +0 -3
  254. package/web/.next/server/chunks/ssr/_6978d868._.js +0 -3
  255. package/web/.next/server/chunks/ssr/_6978d868._.js.map +0 -1
  256. package/web/.next/server/chunks/ssr/_85965278._.js +0 -6
  257. package/web/.next/server/chunks/ssr/_85965278._.js.map +0 -1
  258. package/web/.next/server/chunks/ssr/_c52cace8._.js.map +0 -1
  259. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js +0 -3
  260. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js +0 -3
  261. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js +0 -3
  262. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js +0 -9
  263. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_2900ed94._.js +0 -3
  264. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_6978d868._.js +0 -3
  265. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_85965278._.js +0 -6
  266. package/web/.next/static/chunks/41a2adc09edfffaf.js +0 -1
  267. package/web/.next/static/chunks/5054c72b1c8f5912.js +0 -1
  268. package/web/.next/static/chunks/7bcbfc56e5733034.js +0 -1
  269. package/web/.next/static/chunks/86c0cc1097427f74.js +0 -10
  270. package/web/.next/static/chunks/96f49affaceab206.css +0 -2
  271. package/web/.next/static/chunks/a6d1d774260fc927.js +0 -2
  272. package/web/.next/static/chunks/c0f7284a71378f26.js +0 -1
  273. package/web/.next/static/chunks/f5fb2f182ae9b015.js +0 -1
  274. /package/web/.next/static/{Cp8hg2DFpA4DyEezlBYOw → GdqfiIUVMj2wj_3lbrUqd}/_buildManifest.js +0 -0
  275. /package/web/.next/static/{Cp8hg2DFpA4DyEezlBYOw → GdqfiIUVMj2wj_3lbrUqd}/_clientMiddlewareManifest.json +0 -0
  276. /package/web/.next/static/{Cp8hg2DFpA4DyEezlBYOw → GdqfiIUVMj2wj_3lbrUqd}/_ssgManifest.js +0 -0
@@ -0,0 +1,210 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
4
+ import { Button } from '../../ui/button.js';
5
+ import { ControlCenterDrawer } from './control-center-drawer.js';
6
+ const meta = {
7
+ title: 'Drawers/ControlCenterDrawer',
8
+ component: ControlCenterDrawer,
9
+ tags: ['autodocs'],
10
+ parameters: {
11
+ layout: 'fullscreen',
12
+ },
13
+ };
14
+ export default meta;
15
+ /* ---------------------------------------------------------------------------
16
+ * Fixtures
17
+ * ------------------------------------------------------------------------- */
18
+ const featureView = {
19
+ type: 'feature',
20
+ node: {
21
+ name: 'Auth Module',
22
+ description: 'Implement OAuth2 authentication flow',
23
+ featureId: '#f1',
24
+ lifecycle: 'implementation',
25
+ state: 'running',
26
+ progress: 45,
27
+ agentType: 'claude-code',
28
+ repositoryPath: '/home/user/my-repo',
29
+ branch: 'feat/auth-module',
30
+ specPath: '/home/user/my-repo/specs/001-auth-module',
31
+ },
32
+ };
33
+ const featureDoneView = {
34
+ type: 'feature',
35
+ node: {
36
+ name: 'Payment Gateway',
37
+ description: 'Stripe integration for subscriptions',
38
+ featureId: '#f3',
39
+ lifecycle: 'maintain',
40
+ state: 'done',
41
+ progress: 100,
42
+ runtime: '1h 42m',
43
+ repositoryPath: '/home/user/my-repo',
44
+ branch: 'feat/payment-gateway',
45
+ pr: {
46
+ url: 'https://github.com/org/repo/pull/42',
47
+ number: 42,
48
+ status: PrStatus.Merged,
49
+ ciStatus: CiStatus.Success,
50
+ commitHash: 'abc1234567890',
51
+ },
52
+ },
53
+ };
54
+ const featureErrorView = {
55
+ type: 'feature',
56
+ node: {
57
+ name: 'Email Service',
58
+ description: 'Transactional email with SendGrid',
59
+ featureId: '#f5',
60
+ lifecycle: 'review',
61
+ state: 'error',
62
+ progress: 30,
63
+ errorMessage: 'Build failed: type mismatch in auth middleware',
64
+ repositoryPath: '/home/user/my-repo',
65
+ branch: 'feat/email-service',
66
+ },
67
+ };
68
+ const prdReviewView = {
69
+ type: 'prd-review',
70
+ node: {
71
+ name: 'API Rate Limiting',
72
+ description: 'Sliding window rate limiting for public endpoints',
73
+ featureId: 'feat-abc123',
74
+ lifecycle: 'requirements',
75
+ state: 'action-required',
76
+ progress: 0,
77
+ repositoryPath: '/home/user/my-repo',
78
+ branch: 'feat/api-rate-limiting',
79
+ specPath: '/home/user/my-repo/specs/002-rate-limiting',
80
+ },
81
+ };
82
+ const techReviewView = {
83
+ type: 'tech-review',
84
+ node: {
85
+ name: 'Search Index',
86
+ description: 'Elasticsearch full-text search integration',
87
+ featureId: 'feat-def456',
88
+ lifecycle: 'implementation',
89
+ state: 'action-required',
90
+ progress: 0,
91
+ repositoryPath: '/home/user/my-repo',
92
+ branch: 'feat/search-index',
93
+ specPath: '/home/user/my-repo/specs/003-search',
94
+ },
95
+ };
96
+ const mergeReviewView = {
97
+ type: 'merge-review',
98
+ node: {
99
+ name: 'Auth Module',
100
+ description: 'OAuth2 authentication flow',
101
+ featureId: 'feat-ghi789',
102
+ lifecycle: 'review',
103
+ state: 'action-required',
104
+ progress: 100,
105
+ repositoryPath: '/home/user/my-repo',
106
+ branch: 'feat/auth-module',
107
+ specPath: '/home/user/my-repo/specs/001-auth-module',
108
+ pr: {
109
+ url: 'https://github.com/org/repo/pull/17',
110
+ number: 17,
111
+ status: PrStatus.Open,
112
+ ciStatus: CiStatus.Success,
113
+ },
114
+ },
115
+ };
116
+ const createView = {
117
+ type: 'feature-create',
118
+ repositoryPath: '/home/user/my-repo',
119
+ features: [
120
+ { id: 'feat-abc123', name: 'API Rate Limiting' },
121
+ { id: 'feat-def456', name: 'Search Index' },
122
+ ],
123
+ workflowDefaults: {
124
+ approvalGates: { allowPrd: true, allowPlan: false, allowMerge: false },
125
+ push: true,
126
+ openPr: false,
127
+ },
128
+ };
129
+ const repositoryView = {
130
+ type: 'repository',
131
+ data: {
132
+ id: 'repo-1',
133
+ name: 'my-awesome-app',
134
+ repositoryPath: '/home/user/my-awesome-app',
135
+ },
136
+ };
137
+ /* ---------------------------------------------------------------------------
138
+ * Trigger wrapper
139
+ * ------------------------------------------------------------------------- */
140
+ function Trigger({ view, label }) {
141
+ const [activeView, setActiveView] = useState(null);
142
+ return (_jsxs("div", { className: "flex h-screen items-start p-4", children: [_jsx(Button, { variant: "outline", onClick: () => setActiveView(view), children: label }), _jsx(ControlCenterDrawer, { view: activeView, onClose: () => setActiveView(null), onDelete: (_id) => undefined, onCreateSubmit: () => setActiveView(null) })] }));
143
+ }
144
+ /* ---------------------------------------------------------------------------
145
+ * Stories — one per view type
146
+ * ------------------------------------------------------------------------- */
147
+ /** Feature info view — running state with progress. Default story. */
148
+ export const Default = {
149
+ render: () => _jsx(Trigger, { view: featureView, label: "Open Feature (Running)" }),
150
+ };
151
+ /** Feature info view — completed (maintain lifecycle, done state, merged PR). */
152
+ export const FeatureDone = {
153
+ render: () => _jsx(Trigger, { view: featureDoneView, label: "Open Feature (Done + PR)" }),
154
+ };
155
+ /** Feature info view — error state. */
156
+ export const FeatureError = {
157
+ render: () => _jsx(Trigger, { view: featureErrorView, label: "Open Feature (Error)" }),
158
+ };
159
+ /**
160
+ * PRD review view — loads questionnaire data via server action.
161
+ * Shows spinner in Storybook (no real API available).
162
+ */
163
+ export const PrdReview = {
164
+ render: () => _jsx(Trigger, { view: prdReviewView, label: "Open PRD Review" }),
165
+ };
166
+ /**
167
+ * Tech decisions review view — loads research artifact via server action.
168
+ * Shows spinner in Storybook.
169
+ */
170
+ export const TechReview = {
171
+ render: () => _jsx(Trigger, { view: techReviewView, label: "Open Tech Review" }),
172
+ };
173
+ /**
174
+ * Merge review view — loads merge review data via server action.
175
+ * Shows spinner in Storybook.
176
+ */
177
+ export const MergeReview = {
178
+ render: () => _jsx(Trigger, { view: mergeReviewView, label: "Open Merge Review" }),
179
+ };
180
+ /** Feature create form. */
181
+ export const FeatureCreate = {
182
+ render: () => _jsx(Trigger, { view: createView, label: "Open Create Feature" }),
183
+ };
184
+ /** Repository actions view. */
185
+ export const Repository = {
186
+ render: () => _jsx(Trigger, { view: repositoryView, label: "Open Repository" }),
187
+ };
188
+ /* ---------------------------------------------------------------------------
189
+ * Interactive switcher — cycle through all views
190
+ * ------------------------------------------------------------------------- */
191
+ const allViews = [
192
+ { label: 'Feature (Running)', view: featureView },
193
+ { label: 'Feature (Done)', view: featureDoneView },
194
+ { label: 'Feature (Error)', view: featureErrorView },
195
+ { label: 'PRD Review', view: prdReviewView },
196
+ { label: 'Tech Review', view: techReviewView },
197
+ { label: 'Merge Review', view: mergeReviewView },
198
+ { label: 'Create Feature', view: createView },
199
+ { label: 'Repository', view: repositoryView },
200
+ ];
201
+ function AllViewsSwitcher() {
202
+ const [activeView, setActiveView] = useState(null);
203
+ return (_jsxs("div", { className: "flex h-screen", children: [_jsxs("div", { className: "flex flex-col gap-2 p-4", children: [_jsx("span", { className: "text-muted-foreground mb-2 text-xs font-semibold tracking-wider uppercase", children: "Select view" }), allViews.map(({ label, view }) => (_jsx("button", { type: "button", onClick: () => setActiveView(view), className: `rounded-md px-3 py-1.5 text-left text-sm ${activeView?.type === view.type
204
+ ? 'bg-primary text-primary-foreground'
205
+ : 'bg-muted hover:bg-muted/80'}`, children: label }, label))), _jsx("button", { type: "button", onClick: () => setActiveView(null), className: "bg-destructive/10 text-destructive hover:bg-destructive/20 mt-2 rounded-md px-3 py-1.5 text-left text-sm", children: "Close drawer" })] }), _jsx(ControlCenterDrawer, { view: activeView, onClose: () => setActiveView(null), onDelete: (_id) => undefined, onCreateSubmit: () => setActiveView(null) })] }));
206
+ }
207
+ /** Interactive — click any view type to open that drawer panel. */
208
+ export const AllViews = {
209
+ render: () => _jsx(AllViewsSwitcher, {}),
210
+ };
@@ -0,0 +1,56 @@
1
+ import type { FeatureNodeData } from '../../common/feature-node/index.js';
2
+ import type { RepositoryNodeData } from '../../common/repository-node/index.js';
3
+ import type { ParentFeatureOption } from '../../common/feature-create-drawer/feature-create-drawer.js';
4
+ import type { WorkflowDefaults } from '../../../app/actions/get-workflow-defaults.js';
5
+ /**
6
+ * Discriminated union representing every possible drawer state in the control center.
7
+ * Only one view can be active at a time.
8
+ */
9
+ export type DrawerView =
10
+ /** Generic feature info (running, done, blocked, error, or unhandled action-required phases) */
11
+ {
12
+ type: 'feature';
13
+ node: FeatureNodeData;
14
+ }
15
+ /** requirements lifecycle + action-required → PRD questionnaire */
16
+ | {
17
+ type: 'prd-review';
18
+ node: FeatureNodeData;
19
+ }
20
+ /** implementation lifecycle + action-required → tech decisions review */
21
+ | {
22
+ type: 'tech-review';
23
+ node: FeatureNodeData;
24
+ }
25
+ /** review lifecycle + action-required|error → merge review */
26
+ | {
27
+ type: 'merge-review';
28
+ node: FeatureNodeData;
29
+ }
30
+ /** Feature creation form */
31
+ | {
32
+ type: 'feature-create';
33
+ repositoryPath: string;
34
+ initialParentId?: string;
35
+ features: ParentFeatureOption[];
36
+ workflowDefaults?: WorkflowDefaults;
37
+ }
38
+ /** Repository node actions */
39
+ | {
40
+ type: 'repository';
41
+ data: RepositoryNodeData;
42
+ };
43
+ /**
44
+ * Derives the active DrawerView from control-center state.
45
+ * Priority: feature-create > selected-node (prd/tech/merge/feature) > repository
46
+ */
47
+ export declare function computeDrawerView({ selectedNode, isCreateDrawerOpen, pendingRepositoryPath, pendingParentFeatureId, selectedRepoNode, features, workflowDefaults, }: {
48
+ selectedNode: FeatureNodeData | null;
49
+ isCreateDrawerOpen: boolean;
50
+ pendingRepositoryPath: string;
51
+ pendingParentFeatureId: string | undefined;
52
+ selectedRepoNode: RepositoryNodeData | null;
53
+ features: ParentFeatureOption[];
54
+ workflowDefaults: WorkflowDefaults | undefined;
55
+ }): DrawerView | null;
56
+ //# sourceMappingURL=drawer-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/drawer-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E;;;GAGG;AACH,MAAM,MAAM,UAAU;AACpB,gGAAgG;AAC9F;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE;AAC5C,mEAAmE;GACjE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE;AAC/C,yEAAyE;GACvE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE;AAChD,8DAA8D;GAC5D;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE;AACjD,4BAA4B;GAC1B;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AACH,8BAA8B;GAC5B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAErD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,GACjB,EAAE;IACD,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,gBAAgB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC5C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD,GAAG,UAAU,GAAG,IAAI,CAgCpB"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Derives the active DrawerView from control-center state.
3
+ * Priority: feature-create > selected-node (prd/tech/merge/feature) > repository
4
+ */
5
+ export function computeDrawerView({ selectedNode, isCreateDrawerOpen, pendingRepositoryPath, pendingParentFeatureId, selectedRepoNode, features, workflowDefaults, }) {
6
+ if (isCreateDrawerOpen) {
7
+ return {
8
+ type: 'feature-create',
9
+ repositoryPath: pendingRepositoryPath,
10
+ initialParentId: pendingParentFeatureId,
11
+ features,
12
+ workflowDefaults,
13
+ };
14
+ }
15
+ if (selectedNode) {
16
+ if (selectedNode.lifecycle === 'requirements' && selectedNode.state === 'action-required') {
17
+ return { type: 'prd-review', node: selectedNode };
18
+ }
19
+ if (selectedNode.lifecycle === 'implementation' && selectedNode.state === 'action-required') {
20
+ return { type: 'tech-review', node: selectedNode };
21
+ }
22
+ if (selectedNode.lifecycle === 'review' &&
23
+ (selectedNode.state === 'action-required' || selectedNode.state === 'error')) {
24
+ return { type: 'merge-review', node: selectedNode };
25
+ }
26
+ return { type: 'feature', node: selectedNode };
27
+ }
28
+ if (selectedRepoNode) {
29
+ return { type: 'repository', data: selectedRepoNode };
30
+ }
31
+ return null;
32
+ }
@@ -0,0 +1,3 @@
1
+ export { ControlCenterDrawer, type ControlCenterDrawerProps } from './control-center-drawer.js';
2
+ export { computeDrawerView, type DrawerView } from './drawer-view.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { ControlCenterDrawer } from './control-center-drawer.js';
2
+ export { computeDrawerView } from './drawer-view.js';
@@ -10,14 +10,10 @@ export interface DrawerActionBarProps {
10
10
  approveIcon?: ReactNode;
11
11
  /** Placeholder for the inline revision input */
12
12
  revisionPlaceholder?: string;
13
- /** Title for the reject feedback dialog */
14
- rejectDialogTitle?: string;
15
13
  /** Whether an approval/processing operation is in flight */
16
14
  isProcessing?: boolean;
17
15
  /** Whether a reject operation is in flight */
18
16
  isRejecting?: boolean;
19
- /** Whether to show the reject button (defaults to true when onReject is provided) */
20
- showRejectButton?: boolean;
21
17
  /** Content rendered between revision input and action buttons (e.g. progress bar) */
22
18
  children?: ReactNode;
23
19
  }
@@ -1 +1 @@
1
- {"version":3,"file":"drawer-action-bar-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,kCAAkC;IAClC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,gDAAgD;IAChD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,qFAAqF;IACrF,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB"}
1
+ {"version":3,"file":"drawer-action-bar-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,kCAAkC;IAClC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,gDAAgD;IAChD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB"}
@@ -1,3 +1,3 @@
1
1
  import type { DrawerActionBarProps } from './drawer-action-bar-config.js';
2
- export declare function DrawerActionBar({ onReject, onApprove, approveLabel, approveIcon, revisionPlaceholder, rejectDialogTitle, isProcessing, isRejecting, showRejectButton, children, }: DrawerActionBarProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function DrawerActionBar({ onReject, onApprove, approveLabel, approveIcon, revisionPlaceholder, isProcessing, isRejecting, children, }: DrawerActionBarProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=drawer-action-bar.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"drawer-action-bar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,YAAoB,EACpB,WAAmB,EACnB,gBAAuB,EACvB,QAAQ,GACT,EAAE,oBAAoB,2CAwDtB"}
1
+ {"version":3,"file":"drawer-action-bar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,YAAoB,EACpB,WAAmB,EACnB,QAAQ,GACT,EAAE,oBAAoB,2CAkEtB"}
@@ -1,21 +1,27 @@
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 { useState } from 'react';
4
- import { X } from 'lucide-react';
4
+ import { Send } from 'lucide-react';
5
5
  import { Button } from '../../ui/button.js';
6
- import { RejectFeedbackDialog } from '../../common/reject-feedback-dialog/index.js';
7
- import { DrawerRevisionInput } from '../../common/drawer-revision-input/index.js';
6
+ import { Input } from '../../ui/input.js';
8
7
  import { useSoundAction } from '../../../hooks/use-sound-action.js';
9
- export function DrawerActionBar({ onReject, onApprove, approveLabel, approveIcon, revisionPlaceholder, rejectDialogTitle, isProcessing = false, isRejecting = false, showRejectButton = true, children, }) {
10
- const [rejectDialogOpen, setRejectDialogOpen] = useState(false);
8
+ export function DrawerActionBar({ onReject, onApprove, approveLabel, approveIcon, revisionPlaceholder, isProcessing = false, isRejecting = false, children, }) {
9
+ const [chatInput, setChatInput] = useState('');
11
10
  const approveSound = useSoundAction('approve');
12
- const rejectSound = useSoundAction('reject');
13
11
  const disabled = isProcessing || isRejecting;
14
- return (_jsxs("div", { className: "border-border shrink-0 border-t", children: [children, onReject ? (_jsx(DrawerRevisionInput, { onSubmit: onReject, placeholder: revisionPlaceholder, disabled: disabled || !onReject })) : null, _jsxs("div", { className: "flex items-center gap-2 px-4 pb-4", children: [onReject && showRejectButton ? (_jsxs(_Fragment, { children: [_jsxs(Button, { type: "button", variant: "outline", className: "text-destructive hover:text-destructive", disabled: disabled, onClick: () => {
15
- rejectSound.play();
16
- setRejectDialogOpen(true);
17
- }, children: [_jsx(X, { className: "mr-1.5 h-4 w-4" }), "Reject"] }), _jsx(RejectFeedbackDialog, { open: rejectDialogOpen, onOpenChange: setRejectDialogOpen, onConfirm: onReject, isSubmitting: isRejecting, title: rejectDialogTitle })] })) : null, _jsxs(Button, { type: "button", className: "flex-1", disabled: disabled, onClick: () => {
12
+ function handleRevisionSubmit(e) {
13
+ e.preventDefault();
14
+ const text = chatInput.trim();
15
+ if (!text || !onReject)
16
+ return;
17
+ onReject(text);
18
+ setChatInput('');
19
+ }
20
+ return (_jsxs("div", { className: "border-border shrink-0 border-t", children: [children, onReject ? (_jsxs("form", { onSubmit: handleRevisionSubmit, className: "flex items-center gap-2 p-4", children: [_jsx(Input, { type: "text", placeholder: revisionPlaceholder ?? 'Ask AI to revise...', "aria-label": revisionPlaceholder ?? 'Ask AI to revise...', disabled: disabled, value: chatInput, onChange: (e) => setChatInput(e.target.value), className: "flex-1" }), _jsx(Button, { type: "submit", variant: "secondary", size: "icon", "aria-label": "Send", disabled: disabled, children: _jsx(Send, {}) }), _jsxs(Button, { type: "button", disabled: disabled, onClick: () => {
18
21
  approveSound.play();
19
22
  onApprove();
20
- }, children: [approveIcon, approveLabel] })] })] }));
23
+ }, children: [approveIcon, approveLabel] })] })) : (_jsx("div", { className: "flex items-center gap-2 px-4 pb-4", children: _jsxs(Button, { type: "button", className: "flex-1", disabled: disabled, onClick: () => {
24
+ approveSound.play();
25
+ onApprove();
26
+ }, children: [approveIcon, approveLabel] }) }))] }));
21
27
  }
@@ -7,14 +7,12 @@ type Story = StoryObj<typeof DrawerActionBar>;
7
7
  export declare const Default: Story;
8
8
  /** With approve icon. */
9
9
  export declare const WithIcon: Story;
10
- /** With reject button. Plays "reject" sound on reject click, "approve" on approve. */
10
+ /** With revision input single line: chat input, send, approve. */
11
11
  export declare const WithReject: Story;
12
- /** Processing state — buttons disabled, no sounds play. */
12
+ /** Processing state — all controls disabled. */
13
13
  export declare const Processing: Story;
14
- /** Rejecting state — buttons disabled. */
14
+ /** Rejecting state — all controls disabled. */
15
15
  export declare const Rejecting: Story;
16
- /** With revision input and reject button. */
16
+ /** Custom revision placeholder. */
17
17
  export declare const WithRevisionInput: Story;
18
- /** Custom reject dialog title. */
19
- export declare const CustomRejectTitle: Story;
20
18
  //# sourceMappingURL=drawer-action-bar.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"drawer-action-bar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,eAAe,CAkBtC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9C,qEAAqE;AACrE,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,yBAAyB;AACzB,eAAO,MAAM,QAAQ,EAAE,KAKtB,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,UAAU,EAAE,KAKxB,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,6CAA6C;AAC7C,eAAO,MAAM,iBAAiB,EAAE,KAM/B,CAAC;AAEF,kCAAkC;AAClC,eAAO,MAAM,iBAAiB,EAAE,KAM/B,CAAC"}
1
+ {"version":3,"file":"drawer-action-bar.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,eAAe,CAkBtC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9C,qEAAqE;AACrE,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,yBAAyB;AACzB,eAAO,MAAM,QAAQ,EAAE,KAKtB,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,UAAU,EAAE,KAKxB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,+CAA+C;AAC/C,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAEF,mCAAmC;AACnC,eAAO,MAAM,iBAAiB,EAAE,KAM/B,CAAC"}
@@ -3,7 +3,7 @@ import { fn } from '@storybook/test';
3
3
  import { Check } from 'lucide-react';
4
4
  import { DrawerActionBar } from './drawer-action-bar.js';
5
5
  const meta = {
6
- title: 'Composed/DrawerActionBar',
6
+ title: 'Drawers/Base/DrawerActionBar',
7
7
  component: DrawerActionBar,
8
8
  tags: ['autodocs'],
9
9
  parameters: {
@@ -27,14 +27,14 @@ export const WithIcon = {
27
27
  approveIcon: _jsx(Check, { className: "mr-1.5 h-4 w-4" }),
28
28
  },
29
29
  };
30
- /** With reject button. Plays "reject" sound on reject click, "approve" on approve. */
30
+ /** With revision input single line: chat input, send, approve. */
31
31
  export const WithReject = {
32
32
  args: {
33
33
  onReject: fn().mockName('onReject'),
34
34
  approveLabel: 'Approve',
35
35
  },
36
36
  };
37
- /** Processing state — buttons disabled, no sounds play. */
37
+ /** Processing state — all controls disabled. */
38
38
  export const Processing = {
39
39
  args: {
40
40
  onReject: fn().mockName('onReject'),
@@ -42,7 +42,7 @@ export const Processing = {
42
42
  isProcessing: true,
43
43
  },
44
44
  };
45
- /** Rejecting state — buttons disabled. */
45
+ /** Rejecting state — all controls disabled. */
46
46
  export const Rejecting = {
47
47
  args: {
48
48
  onReject: fn().mockName('onReject'),
@@ -50,7 +50,7 @@ export const Rejecting = {
50
50
  isRejecting: true,
51
51
  },
52
52
  };
53
- /** With revision input and reject button. */
53
+ /** Custom revision placeholder. */
54
54
  export const WithRevisionInput = {
55
55
  args: {
56
56
  onReject: fn().mockName('onReject'),
@@ -58,11 +58,3 @@ export const WithRevisionInput = {
58
58
  revisionPlaceholder: 'Ask AI to revise the plan...',
59
59
  },
60
60
  };
61
- /** Custom reject dialog title. */
62
- export const CustomRejectTitle = {
63
- args: {
64
- onReject: fn().mockName('onReject'),
65
- approveLabel: 'Approve Plan',
66
- rejectDialogTitle: 'Reject Plan',
67
- },
68
- };
@@ -1 +1 @@
1
- {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,GAChB,EAAE,wBAAwB,2CAuR1B"}
1
+ {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAcD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,GAChB,EAAE,wBAAwB,2CA0Q1B"}
@@ -12,7 +12,6 @@ import { Textarea } from '../../ui/textarea.js';
12
12
  import { Label } from '../../ui/label.js';
13
13
  import { CheckboxGroup } from '../../ui/checkbox-group.js';
14
14
  import { CheckboxGroupItem } from '../../ui/checkbox-group-item.js';
15
- import { Separator } from '../../ui/separator.js';
16
15
  import { Badge } from '../../ui/badge.js';
17
16
  import { Popover, PopoverContent, PopoverTrigger } from '../../ui/popover.js';
18
17
  import { pickFiles } from './pick-files.js';
@@ -27,8 +26,6 @@ const EMPTY_GATES = {
27
26
  allowMerge: false,
28
27
  };
29
28
  export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, isSubmitting = false, workflowDefaults, features, initialParentId, }) {
30
- const drawerOpenSound = useSoundAction('drawer-open');
31
- const drawerCloseSound = useSoundAction('drawer-close');
32
29
  const createSound = useSoundAction('create');
33
30
  const defaultGates = workflowDefaults?.approvalGates ?? EMPTY_GATES;
34
31
  const defaultPush = workflowDefaults?.push ?? false;
@@ -40,13 +37,6 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
40
37
  const [push, setPush] = useState(defaultPush);
41
38
  const [openPr, setOpenPr] = useState(defaultOpenPr);
42
39
  const [parentId, setParentId] = useState(undefined);
43
- // Play drawer-open sound when the drawer opens
44
- const playDrawerOpen = drawerOpenSound.play;
45
- useEffect(() => {
46
- if (open) {
47
- playDrawerOpen();
48
- }
49
- }, [open, playDrawerOpen]);
50
40
  // Sync state when workflowDefaults load asynchronously
51
41
  useEffect(() => {
52
42
  if (workflowDefaults) {
@@ -71,10 +61,9 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
71
61
  setParentId(undefined);
72
62
  }, [defaultGates, defaultPush, defaultOpenPr]);
73
63
  const handleClose = useCallback(() => {
74
- drawerCloseSound.play();
75
64
  resetForm();
76
65
  onClose();
77
- }, [onClose, resetForm, drawerCloseSound]);
66
+ }, [onClose, resetForm]);
78
67
  const handleSubmit = useCallback((e) => {
79
68
  e.preventDefault();
80
69
  if (!name.trim())
@@ -124,7 +113,7 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
124
113
  setAttachments((prev) => prev.filter((f) => f.path !== path));
125
114
  }, []);
126
115
  const hasFeatures = features && features.length > 0;
127
- return (_jsxs(BaseDrawer, { open: open, onClose: handleClose, size: "md", modal: false, "data-testid": "feature-create-drawer", header: _jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500" }), _jsx(DrawerTitle, { children: "NEW FEATURE" })] }), _jsx(DrawerDescription, { asChild: true, children: _jsx("div", { children: _jsx(Badge, { variant: "secondary", children: "Creating..." }) }) })] }), footer: _jsxs("div", { className: "flex flex-row justify-end gap-2", children: [_jsx(Button, { variant: "outline", onClick: handleClose, disabled: isSubmitting, children: "Cancel" }), _jsx(Button, { type: "submit", form: "create-feature-form", disabled: !name.trim() || isSubmitting, children: isSubmitting ? 'Creating...' : '+ Create Feature' })] }), children: [_jsx(Separator, {}), _jsx("div", { className: "p-4", children: _jsxs("form", { id: "create-feature-form", onSubmit: handleSubmit, className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "feature-name", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "FEATURE NAME" }), _jsx(Input, { id: "feature-name", placeholder: "e.g. GitHub OAuth Login", value: name, onChange: (e) => setName(e.target.value), required: true, disabled: isSubmitting })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "feature-description", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "DESCRIPTION" }), _jsx(Textarea, { id: "feature-description", placeholder: "Describe what this feature does...", value: description, onChange: (e) => setDescription(e.target.value), rows: 4, disabled: isSubmitting })] }), hasFeatures ? (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "parent-feature", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "PARENT FEATURE" }), _jsx(ParentFeatureCombobox, { features: features, value: parentId, onChange: setParentId, disabled: isSubmitting })] })) : null, _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "APPROVE" }), _jsx(CheckboxGroup, { label: "Autonomous Mode", description: "YOLO!", parentAriaLabel: "Auto approve all", options: AUTO_APPROVE_OPTIONS, value: approvalGates, onValueChange: setApprovalGates, disabled: isSubmitting })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(CheckboxGroupItem, { id: "push", label: "Push", description: "Push branch to remote after implementation.", checked: push || openPr, onCheckedChange: setPush, disabled: openPr || isSubmitting }), _jsx(CheckboxGroupItem, { id: "open-pr", label: "Create PR", description: "Open a pull request after pushing.", checked: openPr, onCheckedChange: setOpenPr, disabled: isSubmitting })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: ["ATTACHMENTS", attachments.length > 0 && (_jsxs("span", { className: "text-muted-foreground/60 ml-1.5", children: ["(", attachments.length, ")"] }))] }), _jsxs(Button, { type: "button", variant: "outline", size: "xs", onClick: handleAddFiles, disabled: isSubmitting, children: [_jsx(PlusIcon, { className: "size-3" }), "Add Files"] })] }), attachments.length > 0 && (_jsx("div", { className: "flex flex-col gap-2", children: attachments.map((file) => (_jsx(AttachmentCard, { file: file, onRemove: () => handleRemoveFile(file.path), disabled: isSubmitting }, file.path))) }))] })] }) })] }));
116
+ return (_jsx(BaseDrawer, { open: open, onClose: handleClose, size: "md", modal: false, "data-testid": "feature-create-drawer", header: _jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500" }), _jsx(DrawerTitle, { children: "NEW FEATURE" })] }), _jsx(DrawerDescription, { asChild: true, children: _jsx("div", { children: _jsx(Badge, { variant: "secondary", children: "Creating..." }) }) })] }), footer: _jsxs("div", { className: "flex flex-row justify-end gap-2", children: [_jsx(Button, { variant: "outline", onClick: handleClose, disabled: isSubmitting, children: "Cancel" }), _jsx(Button, { type: "submit", form: "create-feature-form", disabled: !name.trim() || isSubmitting, children: isSubmitting ? 'Creating...' : '+ Create Feature' })] }), children: _jsx("div", { className: "overflow-y-auto p-4", children: _jsxs("form", { id: "create-feature-form", onSubmit: handleSubmit, className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "feature-name", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "FEATURE NAME" }), _jsx(Input, { id: "feature-name", placeholder: "e.g. GitHub OAuth Login", value: name, onChange: (e) => setName(e.target.value), required: true, disabled: isSubmitting })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "feature-description", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "DESCRIPTION" }), _jsx(Textarea, { id: "feature-description", placeholder: "Describe what this feature does...", value: description, onChange: (e) => setDescription(e.target.value), rows: 4, disabled: isSubmitting })] }), hasFeatures ? (_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "parent-feature", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "PARENT FEATURE" }), _jsx(ParentFeatureCombobox, { features: features, value: parentId, onChange: setParentId, disabled: isSubmitting })] })) : null, _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "APPROVE" }), _jsx(CheckboxGroup, { label: "Autonomous Mode", description: "YOLO!", parentAriaLabel: "Auto approve all", options: AUTO_APPROVE_OPTIONS, value: approvalGates, onValueChange: setApprovalGates, disabled: isSubmitting })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(CheckboxGroupItem, { id: "push", label: "Push", description: "Push branch to remote after implementation.", checked: push || openPr, onCheckedChange: setPush, disabled: openPr || isSubmitting }), _jsx(CheckboxGroupItem, { id: "open-pr", label: "Create PR", description: "Open a pull request after pushing.", checked: openPr, onCheckedChange: setOpenPr, disabled: isSubmitting })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: ["ATTACHMENTS", attachments.length > 0 && (_jsxs("span", { className: "text-muted-foreground/60 ml-1.5", children: ["(", attachments.length, ")"] }))] }), _jsxs(Button, { type: "button", variant: "outline", size: "xs", onClick: handleAddFiles, disabled: isSubmitting, children: [_jsx(PlusIcon, { className: "size-3" }), "Add Files"] })] }), attachments.length > 0 && (_jsx("div", { className: "flex flex-col gap-2", children: attachments.map((file) => (_jsx(AttachmentCard, { file: file, onRemove: () => handleRemoveFile(file.path), disabled: isSubmitting }, file.path))) }))] })] }) }) }));
128
117
  }
129
118
  function ParentFeatureCombobox({ features, value, onChange, disabled, }) {
130
119
  const [open, setOpen] = useState(false);
@@ -84,15 +84,7 @@ export declare const PrChecked: Story;
84
84
  * `shep settings workflow` and are read at mount time via `getWorkflowDefaults()`.
85
85
  */
86
86
  export declare const WithWorkflowDefaults: Story;
87
- /**
88
- * Fully interactive story — open the drawer, fill the form, toggle checkboxes,
89
- * and click "Add Files" to attach files via the native OS file picker.
90
- *
91
- * **Submitted data** is displayed in a styled panel showing `FeatureCreatePayload`
92
- * with `{ name, description, attachments, repositoryPath, approvalGates }`.
93
- *
94
- * In Storybook, the native picker won't work (no backend), but submitted data
95
- * would show the paths if files were attached programmatically.
96
- */
87
+ /** Feature create drawer rendered inside a full-page context — starts open. */
88
+ export declare const InDrawer: Story;
97
89
  export declare const Interactive: Story;
98
90
  //# sourceMappingURL=feature-create-drawer.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-create-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAS9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,mBAAmB,CAyB1C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAiDlD,uFAAuF;AACvF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAiBvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,KAUxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAYF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAWlC,CAAC;AAMF;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,EAAE,KAsCzB,CAAC"}
1
+ {"version":3,"file":"feature-create-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAS9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,mBAAmB,CAyB1C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAiDlD,uFAAuF;AACvF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAiBvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,KAUxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAYF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAWlC,CAAC;AAgDF,+EAA+E;AAC/E,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF,eAAO,MAAM,WAAW,EAAE,KAsCzB,CAAC"}
@@ -37,7 +37,7 @@ import { Button } from '../../ui/button.js';
37
37
  * with full absolute paths, filenames, and sizes
38
38
  */
39
39
  const meta = {
40
- title: 'Composed/FeatureCreateDrawer',
40
+ title: 'Drawers/Feature/FeatureCreateDrawer',
41
41
  component: FeatureCreateDrawer,
42
42
  tags: ['autodocs'],
43
43
  parameters: {
@@ -244,6 +244,26 @@ export const WithWorkflowDefaults = {
244
244
  * In Storybook, the native picker won't work (no backend), but submitted data
245
245
  * would show the paths if files were attached programmatically.
246
246
  */
247
+ /* ---------------------------------------------------------------------------
248
+ * In-drawer story — full page context, starts open
249
+ * ------------------------------------------------------------------------- */
250
+ function CreateDrawerShellTemplate() {
251
+ const [open, setOpen] = useState(true);
252
+ return (_jsxs("div", { style: { height: '100vh', background: '#f8fafc', padding: '2rem' }, children: [_jsx("button", { type: "button", onClick: () => setOpen(true), style: { padding: '8px 16px', border: '1px solid #ccc', borderRadius: '6px' }, children: "Open Drawer" }), _jsx(FeatureCreateDrawer, { open: open, onClose: () => {
253
+ setOpen(false);
254
+ logClose();
255
+ }, onSubmit: (data) => {
256
+ logSubmit(data);
257
+ setOpen(false);
258
+ }, repositoryPath: "/Users/dev/my-repo" })] }));
259
+ }
260
+ /** Feature create drawer rendered inside a full-page context — starts open. */
261
+ export const InDrawer = {
262
+ render: () => _jsx(CreateDrawerShellTemplate, {}),
263
+ };
264
+ /* ---------------------------------------------------------------------------
265
+ * Interactive story — full paths shown in submitted data panel
266
+ * ------------------------------------------------------------------------- */
247
267
  export const Interactive = {
248
268
  render: function InteractiveRender() {
249
269
  const [open, setOpen] = useState(false);
@@ -1,2 +1,2 @@
1
- export { FeatureCreateDrawer, type FeatureCreateDrawerProps, type FeatureCreatePayload, type FileAttachment, } from './feature-create-drawer.js';
1
+ export { FeatureCreateDrawer, type FeatureCreateDrawerProps, type FeatureCreatePayload, type FileAttachment, type ParentFeatureOption, } from './feature-create-drawer.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,yBAAyB,CAAC"}