@shepai/cli 1.37.2 → 1.38.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 (532) hide show
  1. package/README.md +1 -1
  2. package/dist/packages/core/src/application/use-cases/features/get-feature-artifact.use-case.d.ts +19 -0
  3. package/dist/packages/core/src/application/use-cases/features/get-feature-artifact.use-case.d.ts.map +1 -0
  4. package/dist/packages/core/src/application/use-cases/features/get-feature-artifact.use-case.js +52 -0
  5. package/dist/packages/core/src/application/use-cases/features/get-research-artifact.use-case.d.ts +19 -0
  6. package/dist/packages/core/src/application/use-cases/features/get-research-artifact.use-case.d.ts.map +1 -0
  7. package/dist/packages/core/src/application/use-cases/features/get-research-artifact.use-case.js +52 -0
  8. package/dist/packages/core/src/domain/factories/spec-yaml-parser.d.ts.map +1 -1
  9. package/dist/packages/core/src/domain/factories/spec-yaml-parser.js +3 -1
  10. package/dist/packages/core/src/domain/generated/output.d.ts +84 -0
  11. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/di/container.js +14 -2
  14. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.js +27 -3
  16. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.js +14 -1
  18. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts +2 -17
  19. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/services/notifications/notification-bus.js +3 -27
  21. package/dist/src/presentation/cli/commands/feat/show.command.js +2 -2
  22. package/dist/src/presentation/web/app/actions/approve-feature.d.ts +5 -0
  23. package/dist/src/presentation/web/app/actions/approve-feature.d.ts.map +1 -0
  24. package/dist/src/presentation/web/app/actions/approve-feature.js +27 -0
  25. package/dist/src/presentation/web/app/actions/create-feature.d.ts +22 -0
  26. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -0
  27. package/dist/src/presentation/web/app/actions/create-feature.js +41 -0
  28. package/dist/src/presentation/web/app/actions/delete-feature.d.ts +6 -0
  29. package/dist/src/presentation/web/app/actions/delete-feature.d.ts.map +1 -0
  30. package/dist/src/presentation/web/app/actions/delete-feature.js +16 -0
  31. package/dist/src/presentation/web/app/actions/get-feature-artifact.d.ts +10 -0
  32. package/dist/src/presentation/web/app/actions/get-feature-artifact.d.ts.map +1 -0
  33. package/dist/src/presentation/web/app/actions/get-feature-artifact.js +43 -0
  34. package/dist/src/presentation/web/app/actions/get-research-artifact.d.ts +14 -0
  35. package/dist/src/presentation/web/app/actions/get-research-artifact.d.ts.map +1 -0
  36. package/dist/src/presentation/web/app/actions/get-research-artifact.js +25 -0
  37. package/dist/src/presentation/web/app/actions/open-folder.d.ts +6 -0
  38. package/dist/src/presentation/web/app/actions/open-folder.d.ts.map +1 -0
  39. package/dist/src/presentation/web/app/actions/open-folder.js +39 -0
  40. package/dist/src/presentation/web/app/actions/open-ide.d.ts +12 -0
  41. package/dist/src/presentation/web/app/actions/open-ide.d.ts.map +1 -0
  42. package/dist/src/presentation/web/app/actions/open-ide.js +22 -0
  43. package/dist/src/presentation/web/app/actions/open-shell.d.ts +12 -0
  44. package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -0
  45. package/dist/src/presentation/web/app/actions/open-shell.js +45 -0
  46. package/dist/src/presentation/web/app/actions/pick-folder.d.ts +5 -0
  47. package/dist/src/presentation/web/app/actions/pick-folder.d.ts.map +1 -0
  48. package/dist/src/presentation/web/app/actions/pick-folder.js +13 -0
  49. package/dist/src/presentation/web/app/api/agent-events/route.d.ts +1 -1
  50. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  51. package/dist/src/presentation/web/app/api/agent-events/route.js +2 -9
  52. package/dist/src/presentation/web/app/api/dialog/pick-files/route.d.ts +1 -9
  53. package/dist/src/presentation/web/app/api/dialog/pick-files/route.d.ts.map +1 -1
  54. package/dist/src/presentation/web/app/api/dialog/pick-files/route.js +3 -6
  55. package/dist/src/presentation/web/app/page.d.ts.map +1 -1
  56. package/dist/src/presentation/web/app/page.js +1 -0
  57. package/dist/src/presentation/web/components/common/add-repository-node/pick-folder.d.ts +1 -1
  58. package/dist/src/presentation/web/components/common/add-repository-node/pick-folder.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/add-repository-node/pick-folder.js +6 -7
  60. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +1 -1
  61. package/dist/src/presentation/web/components/common/feature-create-drawer/pick-files.d.ts +1 -1
  62. package/dist/src/presentation/web/components/common/feature-create-drawer/pick-files.d.ts.map +1 -1
  63. package/dist/src/presentation/web/components/common/feature-create-drawer/pick-files.js +6 -7
  64. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  65. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +7 -7
  66. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts +4 -0
  67. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -1
  68. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.js +52 -14
  69. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.d.ts.map +1 -1
  70. package/dist/src/presentation/web/components/common/feature-node/agent-type-icons.js +2 -2
  71. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +2 -0
  72. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  73. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  74. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +33 -2
  75. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  76. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +10 -0
  77. package/dist/src/presentation/web/components/common/index.d.ts +3 -0
  78. package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
  79. package/dist/src/presentation/web/components/common/index.js +3 -0
  80. package/dist/src/presentation/web/components/common/notification-permission-banner/index.d.ts +2 -0
  81. package/dist/src/presentation/web/components/common/notification-permission-banner/index.d.ts.map +1 -0
  82. package/dist/src/presentation/web/components/common/notification-permission-banner/index.js +1 -0
  83. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.d.ts +2 -0
  84. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.d.ts.map +1 -0
  85. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.js +33 -0
  86. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.d.ts +6 -0
  87. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.d.ts.map +1 -0
  88. package/dist/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.js +24 -0
  89. package/dist/src/presentation/web/components/common/open-action-menu/config.d.ts +10 -0
  90. package/dist/src/presentation/web/components/common/open-action-menu/config.d.ts.map +1 -0
  91. package/dist/src/presentation/web/components/common/open-action-menu/config.js +1 -0
  92. package/dist/src/presentation/web/components/common/open-action-menu/index.d.ts +3 -0
  93. package/dist/src/presentation/web/components/common/open-action-menu/index.d.ts.map +1 -0
  94. package/dist/src/presentation/web/components/common/open-action-menu/index.js +1 -0
  95. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.d.ts +3 -0
  96. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.d.ts.map +1 -0
  97. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.js +18 -0
  98. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts +14 -0
  99. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts.map +1 -0
  100. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.js +54 -0
  101. package/dist/src/presentation/web/components/common/prd-questionnaire/index.d.ts +4 -0
  102. package/dist/src/presentation/web/components/common/prd-questionnaire/index.d.ts.map +1 -0
  103. package/dist/src/presentation/web/components/common/prd-questionnaire/index.js +2 -0
  104. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts +41 -0
  105. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts.map +1 -0
  106. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.js +1 -0
  107. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts +3 -0
  108. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts.map +1 -0
  109. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.js +7 -0
  110. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts +3 -0
  111. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts.map +1 -0
  112. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +42 -0
  113. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +26 -0
  114. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -0
  115. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +267 -0
  116. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  117. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +2 -2
  118. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts +3 -0
  119. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts.map +1 -1
  120. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.js +51 -14
  121. package/dist/src/presentation/web/components/common/review-drawer-shell/index.d.ts +3 -0
  122. package/dist/src/presentation/web/components/common/review-drawer-shell/index.d.ts.map +1 -0
  123. package/dist/src/presentation/web/components/common/review-drawer-shell/index.js +1 -0
  124. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts +24 -0
  125. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts.map +1 -0
  126. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.js +1 -0
  127. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts +3 -0
  128. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +1 -0
  129. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +17 -0
  130. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts +14 -0
  131. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts.map +1 -0
  132. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.js +33 -0
  133. package/dist/src/presentation/web/components/common/tech-decisions-review/index.d.ts +4 -0
  134. package/dist/src/presentation/web/components/common/tech-decisions-review/index.d.ts.map +1 -0
  135. package/dist/src/presentation/web/components/common/tech-decisions-review/index.js +2 -0
  136. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts +3 -0
  137. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts.map +1 -0
  138. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.js +7 -0
  139. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.d.ts +39 -0
  140. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.d.ts.map +1 -0
  141. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.js +1 -0
  142. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts +3 -0
  143. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -0
  144. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +39 -0
  145. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts +22 -0
  146. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -0
  147. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +108 -0
  148. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  149. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +133 -2
  150. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  151. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +28 -19
  152. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  153. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +6 -1
  154. package/dist/src/presentation/web/components/ui/drawer.d.ts.map +1 -1
  155. package/dist/src/presentation/web/components/ui/drawer.js +3 -1
  156. package/dist/src/presentation/web/components/ui/dropdown-menu.d.ts +28 -0
  157. package/dist/src/presentation/web/components/ui/dropdown-menu.d.ts.map +1 -0
  158. package/dist/src/presentation/web/components/ui/dropdown-menu.js +33 -0
  159. package/dist/src/presentation/web/hooks/agent-events-provider.d.ts +13 -0
  160. package/dist/src/presentation/web/hooks/agent-events-provider.d.ts.map +1 -0
  161. package/dist/src/presentation/web/hooks/agent-events-provider.js +20 -0
  162. package/dist/src/presentation/web/hooks/use-agent-events.d.ts.map +1 -1
  163. package/dist/src/presentation/web/hooks/use-agent-events.js +21 -1
  164. package/dist/src/presentation/web/hooks/use-notifications.d.ts +1 -5
  165. package/dist/src/presentation/web/hooks/use-notifications.d.ts.map +1 -1
  166. package/dist/src/presentation/web/hooks/use-notifications.js +5 -10
  167. package/dist/src/presentation/web/next.config.d.ts.map +1 -1
  168. package/dist/src/presentation/web/next.config.js +5 -0
  169. package/dist/tsconfig.build.tsbuildinfo +1 -1
  170. package/package.json +2 -1
  171. package/web/.next/BUILD_ID +1 -1
  172. package/web/.next/app-path-routes-manifest.json +0 -5
  173. package/web/.next/build-manifest.json +6 -6
  174. package/web/.next/cache/.previewinfo +1 -1
  175. package/web/.next/cache/.rscinfo +1 -1
  176. package/web/.next/cache/.tsbuildinfo +1 -1
  177. package/web/.next/cache/config.json +3 -3
  178. package/web/.next/fallback-build-manifest.json +2 -2
  179. package/web/.next/prerender-manifest.json +3 -3
  180. package/web/.next/required-server-files.js +4 -4
  181. package/web/.next/required-server-files.json +4 -4
  182. package/web/.next/routes-manifest.json +1 -34
  183. package/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
  184. package/web/.next/server/app/_global-error/page.js +1 -1
  185. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  186. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  187. package/web/.next/server/app/_global-error.html +2 -2
  188. package/web/.next/server/app/_global-error.rsc +7 -7
  189. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  190. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  191. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  192. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  193. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  194. package/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
  195. package/web/.next/server/app/_not-found/page.js +1 -1
  196. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  197. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  198. package/web/.next/server/app/api/agent-events/route.js +1 -1
  199. package/web/.next/server/app/api/agent-events/route.js.nft.json +1 -1
  200. package/web/.next/server/app/api/dialog/pick-files/route.js +2 -2
  201. package/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  202. package/web/.next/server/app/page/build-manifest.json +4 -4
  203. package/web/.next/server/app/page/server-reference-manifest.json +137 -1
  204. package/web/.next/server/app/page.js +2 -2
  205. package/web/.next/server/app/page.js.nft.json +1 -1
  206. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  207. package/web/.next/server/app/version/page/build-manifest.json +4 -4
  208. package/web/.next/server/app/version/page.js +1 -1
  209. package/web/.next/server/app/version/page.js.nft.json +1 -1
  210. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  211. package/web/.next/server/app-paths-manifest.json +0 -5
  212. package/web/.next/server/chunks/{403f9_next_567de315._.js → 403f9_next_435614de._.js} +7 -6
  213. package/web/.next/server/chunks/403f9_next_435614de._.js.map +1 -0
  214. package/web/.next/server/chunks/[externals]__ba6223e5._.js +3 -0
  215. package/web/.next/server/chunks/[root-of-the-server]__7d5c8b74._.js +6 -0
  216. package/web/.next/server/chunks/[root-of-the-server]__7d5c8b74._.js.map +1 -0
  217. package/web/.next/server/chunks/ssr/[externals]_node:path_d28a9bfe._.js +3 -0
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +12 -0
  219. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +1 -0
  220. package/web/.next/server/chunks/ssr/[root-of-the-server]__19354aea._.js +9 -0
  221. package/web/.next/server/chunks/ssr/[root-of-the-server]__19354aea._.js.map +1 -0
  222. package/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js → [root-of-the-server]__32472b89._.js} +2 -2
  223. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a21ef212._.js → [root-of-the-server]__d21f0894._.js} +2 -2
  224. package/web/.next/server/chunks/ssr/[root-of-the-server]__d21f0894._.js.map +1 -0
  225. package/web/.next/server/chunks/ssr/[root-of-the-server]__e1c44885._.js +3 -0
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__f47a461b._.js +3 -0
  228. package/web/.next/server/chunks/ssr/_285de9aa._.js +3 -0
  229. package/web/.next/server/chunks/ssr/_285de9aa._.js.map +1 -0
  230. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/_94d22d37._.js → server/chunks/ssr/_b1f2507a._.js} +4 -4
  231. package/web/.next/server/chunks/ssr/_b1f2507a._.js.map +1 -0
  232. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js +1 -1
  233. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js.map +1 -1
  234. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  235. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  236. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_badge_tsx_964c2a3b._.js +1 -1
  237. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_badge_tsx_964c2a3b._.js.map +1 -1
  238. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  239. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  240. package/web/.next/server/middleware-build-manifest.js +4 -4
  241. package/web/.next/server/pages/500.html +2 -2
  242. package/web/.next/server/server-reference-manifest.js +1 -1
  243. package/web/.next/server/server-reference-manifest.json +138 -2
  244. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  245. package/web/.next/standalone/src/presentation/web/.next/app-path-routes-manifest.json +0 -5
  246. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +6 -6
  247. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  248. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +4 -4
  249. package/web/.next/standalone/src/presentation/web/.next/routes-manifest.json +1 -34
  250. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +4 -4
  251. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page.js +1 -1
  252. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  253. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  254. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  255. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +7 -7
  256. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  257. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +7 -7
  258. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +3 -3
  259. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  260. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  261. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +4 -4
  262. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js +1 -1
  263. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  264. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  265. package/web/.next/standalone/src/presentation/web/.next/server/app/api/agent-events/route.js +1 -1
  266. package/web/.next/standalone/src/presentation/web/.next/server/app/api/agent-events/route.js.nft.json +1 -1
  267. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-files/route.js +2 -2
  268. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-files/route.js.nft.json +1 -1
  269. package/web/.next/standalone/src/presentation/web/.next/server/app/page/build-manifest.json +4 -4
  270. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +137 -1
  271. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +2 -2
  272. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  273. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  274. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +4 -4
  275. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js +1 -1
  276. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  277. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  278. package/web/.next/standalone/src/presentation/web/.next/server/app-paths-manifest.json +0 -5
  279. package/web/.next/standalone/src/presentation/web/.next/server/chunks/{403f9_next_567de315._.js → 403f9_next_435614de._.js} +7 -6
  280. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[externals]__ba6223e5._.js +3 -0
  281. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__7d5c8b74._.js +6 -0
  282. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[externals]_node:path_d28a9bfe._.js +3 -0
  283. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +12 -0
  284. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__19354aea._.js +9 -0
  285. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js → [root-of-the-server]__32472b89._.js} +2 -2
  286. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__a21ef212._.js → [root-of-the-server]__d21f0894._.js} +2 -2
  287. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__e1c44885._.js +3 -0
  288. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f12b60be._.js +1 -1
  289. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f47a461b._.js +3 -0
  290. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_285de9aa._.js +3 -0
  291. package/web/.next/{server/chunks/ssr/_94d22d37._.js → standalone/src/presentation/web/.next/server/chunks/ssr/_b1f2507a._.js} +4 -4
  292. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_version_version-page-client_tsx_fe9db753._.js +1 -1
  293. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  294. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_ui_badge_tsx_964c2a3b._.js +1 -1
  295. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  296. package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +4 -4
  297. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  298. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  299. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +138 -2
  300. package/web/.next/standalone/src/presentation/web/app/actions/approve-feature.ts +38 -0
  301. package/web/.next/standalone/src/presentation/web/app/actions/create-feature.ts +81 -0
  302. package/web/.next/standalone/src/presentation/web/app/actions/delete-feature.ts +22 -0
  303. package/web/.next/standalone/src/presentation/web/app/actions/get-feature-artifact.ts +55 -0
  304. package/web/.next/standalone/src/presentation/web/app/actions/get-research-artifact.ts +42 -0
  305. package/web/.next/standalone/src/presentation/web/app/actions/open-folder.ts +44 -0
  306. package/web/.next/standalone/src/presentation/web/app/actions/open-ide.ts +37 -0
  307. package/web/.next/standalone/src/presentation/web/app/{api/shell/open/route.ts → actions/open-shell.ts} +19 -27
  308. package/web/.next/standalone/src/presentation/web/app/{api/dialog/pick-folder/route.ts → actions/pick-folder.ts} +5 -9
  309. package/web/.next/standalone/src/presentation/web/app/api/agent-events/route.ts +2 -14
  310. package/web/.next/standalone/src/presentation/web/app/api/dialog/pick-files/route.ts +8 -10
  311. package/web/.next/standalone/src/presentation/web/app/globals.css +10 -0
  312. package/web/.next/standalone/src/presentation/web/app/page.tsx +1 -0
  313. package/web/.next/standalone/src/presentation/web/components/common/add-repository-node/pick-folder.ts +7 -7
  314. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +1 -1
  315. package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/pick-files.ts +6 -7
  316. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +15 -19
  317. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/use-feature-actions.ts +61 -17
  318. package/web/.next/standalone/src/presentation/web/components/common/feature-node/agent-type-icons.tsx +10 -2
  319. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node-state-config.ts +2 -0
  320. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.stories.tsx +10 -0
  321. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.tsx +38 -7
  322. package/web/.next/standalone/src/presentation/web/components/common/index.ts +18 -0
  323. package/web/.next/standalone/src/presentation/web/components/common/notification-permission-banner/index.ts +1 -0
  324. package/web/.next/standalone/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.stories.tsx +52 -0
  325. package/web/.next/standalone/src/presentation/web/components/common/notification-permission-banner/notification-permission-banner.tsx +55 -0
  326. package/web/.next/standalone/src/presentation/web/components/common/open-action-menu/config.ts +10 -0
  327. package/web/.next/standalone/src/presentation/web/components/common/open-action-menu/index.ts +2 -0
  328. package/web/.next/standalone/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.tsx +64 -0
  329. package/web/.next/standalone/src/presentation/web/components/common/open-action-menu/open-action-menu.tsx +111 -0
  330. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/index.ts +10 -0
  331. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.ts +48 -0
  332. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.tsx +34 -0
  333. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +384 -0
  334. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +216 -0
  335. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.tsx +20 -1
  336. package/web/.next/standalone/src/presentation/web/components/common/repository-node/use-repository-actions.ts +83 -20
  337. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/index.ts +2 -0
  338. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.ts +24 -0
  339. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.tsx +85 -0
  340. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +139 -0
  341. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/index.ts +8 -0
  342. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.tsx +34 -0
  343. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.ts +42 -0
  344. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx +177 -0
  345. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +188 -0
  346. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +189 -2
  347. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +28 -19
  348. package/web/.next/standalone/src/presentation/web/components/layouts/app-shell/app-shell.tsx +11 -1
  349. package/web/.next/standalone/src/presentation/web/components/ui/drawer.tsx +4 -2
  350. package/web/.next/standalone/src/presentation/web/components/ui/dropdown-menu.tsx +187 -0
  351. package/web/.next/standalone/src/presentation/web/hooks/agent-events-provider.tsx +32 -0
  352. package/web/.next/standalone/src/presentation/web/hooks/use-agent-events.ts +23 -1
  353. package/web/.next/standalone/src/presentation/web/hooks/use-notifications.ts +5 -16
  354. package/web/.next/standalone/src/presentation/web/next.config.ts +6 -0
  355. package/web/.next/standalone/src/presentation/web/package.json +2 -1
  356. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  357. package/web/.next/static/chunks/{70993ebedee7eab0.js → 084314470f2144d2.js} +1 -1
  358. package/web/.next/static/chunks/36bb03a0314fb990.css +2 -0
  359. package/web/.next/static/chunks/83ff3b6bbee54bce.js +1 -0
  360. package/web/.next/static/chunks/{fe5e04e707adb039.js → 8c0b96eb95dd31a9.js} +1 -1
  361. package/web/.next/static/chunks/{df7d29673e0ac11d.js → b13aa397579082e7.js} +1 -1
  362. package/web/.next/static/chunks/{f3b4460b1496ef52.js → cfe4dc9904fcfddb.js} +1 -1
  363. package/web/.next/static/chunks/e21d644e5a584136.js +1 -0
  364. package/web/.next/static/chunks/eca1959e083d0a45.js +10 -0
  365. package/web/.next/static/chunks/f9519a5c455143e6.js +1 -0
  366. package/web/.next/static/chunks/{c4b1e95eceaa36ca.js → fe6427c156bda6b0.js} +2 -2
  367. package/web/.next/static/chunks/{37bc3e283f734dca.js → fe70e73feb07bcfd.js} +1 -1
  368. package/web/.next/static/chunks/{turbopack-a5a88a85e7ac8e8d.js → turbopack-35ff53de4dab1e56.js} +2 -2
  369. package/web/.next/trace +1 -1
  370. package/web/.next/trace-build +1 -1
  371. package/web/.next/types/link.d.ts +1 -6
  372. package/web/.next/types/routes.d.ts +1 -6
  373. package/web/.next/types/validator.ts +0 -45
  374. package/web/package.json +2 -1
  375. package/dist/src/presentation/web/app/api/dialog/pick-folder/route.d.ts +0 -11
  376. package/dist/src/presentation/web/app/api/dialog/pick-folder/route.d.ts.map +0 -1
  377. package/dist/src/presentation/web/app/api/dialog/pick-folder/route.js +0 -16
  378. package/dist/src/presentation/web/app/api/features/[id]/route.d.ts +0 -11
  379. package/dist/src/presentation/web/app/api/features/[id]/route.d.ts.map +0 -1
  380. package/dist/src/presentation/web/app/api/features/[id]/route.js +0 -17
  381. package/dist/src/presentation/web/app/api/features/create/route.d.ts +0 -5
  382. package/dist/src/presentation/web/app/api/features/create/route.d.ts.map +0 -1
  383. package/dist/src/presentation/web/app/api/features/create/route.js +0 -65
  384. package/dist/src/presentation/web/app/api/ide/open/route.d.ts +0 -9
  385. package/dist/src/presentation/web/app/api/ide/open/route.d.ts.map +0 -1
  386. package/dist/src/presentation/web/app/api/ide/open/route.js +0 -36
  387. package/dist/src/presentation/web/app/api/shell/open/route.d.ts +0 -9
  388. package/dist/src/presentation/web/app/api/shell/open/route.d.ts.map +0 -1
  389. package/dist/src/presentation/web/app/api/shell/open/route.js +0 -57
  390. package/dist/src/presentation/web/app/api/validate-toolbar-input.d.ts +0 -18
  391. package/dist/src/presentation/web/app/api/validate-toolbar-input.d.ts.map +0 -1
  392. package/dist/src/presentation/web/app/api/validate-toolbar-input.js +0 -29
  393. package/web/.next/server/app/api/dialog/pick-folder/route/app-paths-manifest.json +0 -3
  394. package/web/.next/server/app/api/dialog/pick-folder/route/build-manifest.json +0 -11
  395. package/web/.next/server/app/api/dialog/pick-folder/route/server-reference-manifest.json +0 -4
  396. package/web/.next/server/app/api/dialog/pick-folder/route.js +0 -7
  397. package/web/.next/server/app/api/dialog/pick-folder/route.js.map +0 -5
  398. package/web/.next/server/app/api/dialog/pick-folder/route.js.nft.json +0 -1
  399. package/web/.next/server/app/api/dialog/pick-folder/route_client-reference-manifest.js +0 -2
  400. package/web/.next/server/app/api/features/[id]/route/app-paths-manifest.json +0 -3
  401. package/web/.next/server/app/api/features/[id]/route/build-manifest.json +0 -11
  402. package/web/.next/server/app/api/features/[id]/route/server-reference-manifest.json +0 -4
  403. package/web/.next/server/app/api/features/[id]/route.js +0 -7
  404. package/web/.next/server/app/api/features/[id]/route.js.map +0 -5
  405. package/web/.next/server/app/api/features/[id]/route.js.nft.json +0 -1
  406. package/web/.next/server/app/api/features/[id]/route_client-reference-manifest.js +0 -2
  407. package/web/.next/server/app/api/features/create/route/app-paths-manifest.json +0 -3
  408. package/web/.next/server/app/api/features/create/route/build-manifest.json +0 -11
  409. package/web/.next/server/app/api/features/create/route/server-reference-manifest.json +0 -4
  410. package/web/.next/server/app/api/features/create/route.js +0 -7
  411. package/web/.next/server/app/api/features/create/route.js.map +0 -5
  412. package/web/.next/server/app/api/features/create/route.js.nft.json +0 -1
  413. package/web/.next/server/app/api/features/create/route_client-reference-manifest.js +0 -2
  414. package/web/.next/server/app/api/ide/open/route/app-paths-manifest.json +0 -3
  415. package/web/.next/server/app/api/ide/open/route/build-manifest.json +0 -11
  416. package/web/.next/server/app/api/ide/open/route/server-reference-manifest.json +0 -4
  417. package/web/.next/server/app/api/ide/open/route.js +0 -7
  418. package/web/.next/server/app/api/ide/open/route.js.map +0 -5
  419. package/web/.next/server/app/api/ide/open/route.js.nft.json +0 -1
  420. package/web/.next/server/app/api/ide/open/route_client-reference-manifest.js +0 -2
  421. package/web/.next/server/app/api/shell/open/route/app-paths-manifest.json +0 -3
  422. package/web/.next/server/app/api/shell/open/route/build-manifest.json +0 -11
  423. package/web/.next/server/app/api/shell/open/route/server-reference-manifest.json +0 -4
  424. package/web/.next/server/app/api/shell/open/route.js +0 -7
  425. package/web/.next/server/app/api/shell/open/route.js.map +0 -5
  426. package/web/.next/server/app/api/shell/open/route.js.nft.json +0 -1
  427. package/web/.next/server/app/api/shell/open/route_client-reference-manifest.js +0 -2
  428. package/web/.next/server/chunks/403f9_next_567de315._.js.map +0 -1
  429. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_dialog_pick-folder_route_actions_375ed12f.js +0 -3
  430. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_[id]_route_actions_03b9a4b5.js +0 -3
  431. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_create_route_actions_de49a114.js +0 -3
  432. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_create_route_actions_de49a114.js.map +0 -1
  433. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_shell_open_route_actions_814dc5b6.js +0 -3
  434. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_shell_open_route_actions_814dc5b6.js.map +0 -1
  435. package/web/.next/server/chunks/[root-of-the-server]__04ae3a77._.js +0 -3
  436. package/web/.next/server/chunks/[root-of-the-server]__04ae3a77._.js.map +0 -1
  437. package/web/.next/server/chunks/[root-of-the-server]__3d63a020._.js +0 -8
  438. package/web/.next/server/chunks/[root-of-the-server]__3d63a020._.js.map +0 -1
  439. package/web/.next/server/chunks/[root-of-the-server]__a6bf88cc._.js +0 -4
  440. package/web/.next/server/chunks/[root-of-the-server]__a6bf88cc._.js.map +0 -1
  441. package/web/.next/server/chunks/[root-of-the-server]__acfd2769._.js +0 -3
  442. package/web/.next/server/chunks/[root-of-the-server]__acfd2769._.js.map +0 -1
  443. package/web/.next/server/chunks/[root-of-the-server]__ec87d735._.js +0 -3
  444. package/web/.next/server/chunks/[root-of-the-server]__ec87d735._.js.map +0 -1
  445. package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js +0 -3
  446. package/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js.map +0 -1
  447. package/web/.next/server/chunks/[root-of-the-server]__f32c280c._.js +0 -3
  448. package/web/.next/server/chunks/[root-of-the-server]__f32c280c._.js.map +0 -1
  449. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_ide_open_route_actions_9fe6e1cd.js +0 -3
  450. package/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_ide_open_route_actions_9fe6e1cd.js.map +0 -1
  451. package/web/.next/server/chunks/ssr/[root-of-the-server]__1eade43f._.js +0 -3
  452. package/web/.next/server/chunks/ssr/[root-of-the-server]__1eade43f._.js.map +0 -1
  453. package/web/.next/server/chunks/ssr/[root-of-the-server]__97377864._.js +0 -3
  454. package/web/.next/server/chunks/ssr/[root-of-the-server]__a21ef212._.js.map +0 -1
  455. package/web/.next/server/chunks/ssr/[root-of-the-server]__f285e474._.js +0 -3
  456. package/web/.next/server/chunks/ssr/_09afa42a._.js +0 -10
  457. package/web/.next/server/chunks/ssr/_09afa42a._.js.map +0 -1
  458. package/web/.next/server/chunks/ssr/_4676cf52._.js +0 -3
  459. package/web/.next/server/chunks/ssr/_4676cf52._.js.map +0 -1
  460. package/web/.next/server/chunks/ssr/_94d22d37._.js.map +0 -1
  461. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_a4e3cb6f.js +0 -3
  462. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_a4e3cb6f.js.map +0 -1
  463. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route/app-paths-manifest.json +0 -3
  464. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route/build-manifest.json +0 -11
  465. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route/server-reference-manifest.json +0 -4
  466. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route.js +0 -7
  467. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route.js.map +0 -5
  468. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route.js.nft.json +0 -1
  469. package/web/.next/standalone/src/presentation/web/.next/server/app/api/dialog/pick-folder/route_client-reference-manifest.js +0 -2
  470. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route/app-paths-manifest.json +0 -3
  471. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route/build-manifest.json +0 -11
  472. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route/server-reference-manifest.json +0 -4
  473. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route.js +0 -7
  474. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route.js.map +0 -5
  475. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route.js.nft.json +0 -1
  476. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/[id]/route_client-reference-manifest.js +0 -2
  477. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route/app-paths-manifest.json +0 -3
  478. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route/build-manifest.json +0 -11
  479. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route/server-reference-manifest.json +0 -4
  480. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route.js +0 -7
  481. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route.js.map +0 -5
  482. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route.js.nft.json +0 -1
  483. package/web/.next/standalone/src/presentation/web/.next/server/app/api/features/create/route_client-reference-manifest.js +0 -2
  484. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route/app-paths-manifest.json +0 -3
  485. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route/build-manifest.json +0 -11
  486. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route/server-reference-manifest.json +0 -4
  487. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route.js +0 -7
  488. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route.js.map +0 -5
  489. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route.js.nft.json +0 -1
  490. package/web/.next/standalone/src/presentation/web/.next/server/app/api/ide/open/route_client-reference-manifest.js +0 -2
  491. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route/app-paths-manifest.json +0 -3
  492. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route/build-manifest.json +0 -11
  493. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route/server-reference-manifest.json +0 -4
  494. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route.js +0 -7
  495. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route.js.map +0 -5
  496. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route.js.nft.json +0 -1
  497. package/web/.next/standalone/src/presentation/web/.next/server/app/api/shell/open/route_client-reference-manifest.js +0 -2
  498. package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_dialog_pick-folder_route_actions_375ed12f.js +0 -3
  499. package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_[id]_route_actions_03b9a4b5.js +0 -3
  500. package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_features_create_route_actions_de49a114.js +0 -3
  501. package/web/.next/standalone/src/presentation/web/.next/server/chunks/744ca_web__next-internal_server_app_api_shell_open_route_actions_814dc5b6.js +0 -3
  502. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__04ae3a77._.js +0 -3
  503. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__3d63a020._.js +0 -8
  504. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__a6bf88cc._.js +0 -4
  505. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__acfd2769._.js +0 -3
  506. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__ec87d735._.js +0 -3
  507. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__ecaf05bc._.js +0 -3
  508. package/web/.next/standalone/src/presentation/web/.next/server/chunks/[root-of-the-server]__f32c280c._.js +0 -3
  509. package/web/.next/standalone/src/presentation/web/.next/server/chunks/b1a17_presentation_web__next-internal_server_app_api_ide_open_route_actions_9fe6e1cd.js +0 -3
  510. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__1eade43f._.js +0 -3
  511. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__97377864._.js +0 -3
  512. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f285e474._.js +0 -3
  513. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_09afa42a._.js +0 -10
  514. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_4676cf52._.js +0 -3
  515. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_page_actions_a4e3cb6f.js +0 -3
  516. package/web/.next/standalone/src/presentation/web/app/api/features/[id]/route.ts +0 -20
  517. package/web/.next/standalone/src/presentation/web/app/api/features/create/route.ts +0 -103
  518. package/web/.next/standalone/src/presentation/web/app/api/ide/open/route.ts +0 -44
  519. package/web/.next/standalone/src/presentation/web/app/api/validate-toolbar-input.ts +0 -46
  520. package/web/.next/static/chunks/54743561bbaa307a.js +0 -8
  521. package/web/.next/static/chunks/74f27128e5fbfe52.css +0 -2
  522. package/web/.next/static/chunks/9993505b2a26c454.js +0 -1
  523. package/web/.next/static/chunks/c95b4cf170b7f301.js +0 -1
  524. package/web/.next/static/chunks/e78d1b265b8110c3.js +0 -1
  525. /package/web/.next/server/chunks/{744ca_web__next-internal_server_app_api_dialog_pick-folder_route_actions_375ed12f.js.map → [externals]__ba6223e5._.js.map} +0 -0
  526. /package/web/.next/server/chunks/{744ca_web__next-internal_server_app_api_features_[id]_route_actions_03b9a4b5.js.map → ssr/[externals]_node:path_d28a9bfe._.js.map} +0 -0
  527. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js.map → [root-of-the-server]__32472b89._.js.map} +0 -0
  528. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__f285e474._.js.map → [root-of-the-server]__e1c44885._.js.map} +0 -0
  529. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__97377864._.js.map → [root-of-the-server]__f47a461b._.js.map} +0 -0
  530. /package/web/.next/static/{AaXDy79mMK8ywoCbOquJB → yvV-GEMagQiZhZAF0YqQs}/_buildManifest.js +0 -0
  531. /package/web/.next/static/{AaXDy79mMK8ywoCbOquJB → yvV-GEMagQiZhZAF0YqQs}/_clientMiddlewareManifest.json +0 -0
  532. /package/web/.next/static/{AaXDy79mMK8ywoCbOquJB → yvV-GEMagQiZhZAF0YqQs}/_ssgManifest.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/prd-questionnaire/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,YAAY,EACV,qBAAqB,EACrB,2BAA2B,EAC3B,SAAS,EACT,WAAW,EACX,cAAc,EACd,oBAAoB,GACrB,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { PrdQuestionnaire } from './prd-questionnaire.js';
2
+ export { PrdQuestionnaireDrawer } from './prd-questionnaire-drawer.js';
@@ -0,0 +1,41 @@
1
+ import type { PrdOption, PrdQuestion, PrdFinalAction, PrdQuestionnaireData } from '../../../../../../packages/core/src/domain/generated/output.js';
2
+ export type { PrdOption, PrdQuestion, PrdFinalAction, PrdQuestionnaireData };
3
+ export interface PrdQuestionnaireProps {
4
+ /** Questionnaire data from the domain (questions, context, finalAction) */
5
+ data: PrdQuestionnaireData;
6
+ /** Map of questionId to selected optionId (controlled state) */
7
+ selections: Record<string, string>;
8
+ /** Selection change callback */
9
+ onSelect: (questionId: string, optionId: string) => void;
10
+ /** Chat refinement submit callback */
11
+ onRefine: (text: string) => void;
12
+ /** Finalize requirements callback */
13
+ onApprove: (actionId: string) => void;
14
+ /** Controls disabled/animated state during refinement */
15
+ isProcessing?: boolean;
16
+ /** Show the goal/context header (default: false) */
17
+ showHeader?: boolean;
18
+ }
19
+ export interface PrdQuestionnaireDrawerProps extends PrdQuestionnaireProps {
20
+ /** Whether the drawer is open */
21
+ open: boolean;
22
+ /** Callback when drawer should close */
23
+ onClose: () => void;
24
+ /** Feature name shown in drawer header */
25
+ featureName: string;
26
+ /** Feature ID shown below the name */
27
+ featureId?: string;
28
+ /** Current lifecycle stage label */
29
+ lifecycleLabel?: string;
30
+ /** Absolute path to the repository on disk */
31
+ repositoryPath?: string;
32
+ /** Git branch name for this feature */
33
+ branch?: string;
34
+ /** Absolute path to the specs folder on disk */
35
+ specPath?: string;
36
+ /** Callback to delete the feature — shows delete button when provided */
37
+ onDelete?: (featureId: string) => void;
38
+ /** Whether a delete operation is in progress */
39
+ isDeleting?: boolean;
40
+ }
41
+ //# sourceMappingURL=prd-questionnaire-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd-questionnaire-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,cAAc,EACd,oBAAoB,EACrB,MAAM,sCAAsC,CAAC;AAE9C,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,oBAAoB,EAAE,CAAC;AAE7E,MAAM,WAAW,qBAAqB;IACpC,2EAA2E;IAC3E,IAAI,EAAE,oBAAoB,CAAC;IAC3B,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,gCAAgC;IAChC,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACzD,sCAAsC;IACtC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,qCAAqC;IACrC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,yDAAyD;IACzD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,2BAA4B,SAAQ,qBAAqB;IACxE,iCAAiC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,wCAAwC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
@@ -0,0 +1,3 @@
1
+ import type { PrdQuestionnaireDrawerProps } from './prd-questionnaire-config.js';
2
+ export declare function PrdQuestionnaireDrawer({ open, onClose, featureName, featureId, repositoryPath, branch, specPath, onDelete, isDeleting, ...questionnaireProps }: PrdQuestionnaireDrawerProps): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=prd-questionnaire-drawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd-questionnaire-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAE9E,wBAAgB,sBAAsB,CAAC,EACrC,IAAI,EACJ,OAAO,EACP,WAAW,EACX,SAAS,EACT,cAAc,EACd,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,GAAG,kBAAkB,EACtB,EAAE,2BAA2B,2CAgB7B"}
@@ -0,0 +1,7 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { ReviewDrawerShell } from '../../common/review-drawer-shell/index.js';
4
+ import { PrdQuestionnaire } from './prd-questionnaire.js';
5
+ export function PrdQuestionnaireDrawer({ open, onClose, featureName, featureId, repositoryPath, branch, specPath, onDelete, isDeleting, ...questionnaireProps }) {
6
+ return (_jsx(ReviewDrawerShell, { open: open, onClose: onClose, featureName: featureName, featureId: featureId, repositoryPath: repositoryPath, branch: branch, specPath: specPath, onDelete: onDelete, isDeleting: isDeleting, children: _jsx(PrdQuestionnaire, { ...questionnaireProps }) }));
7
+ }
@@ -0,0 +1,3 @@
1
+ import type { PrdQuestionnaireProps } from './prd-questionnaire-config.js';
2
+ export declare function PrdQuestionnaire({ data, selections, onSelect, onRefine, onApprove, isProcessing, showHeader, }: PrdQuestionnaireProps): import("react/jsx-runtime").JSX.Element | null;
3
+ //# sourceMappingURL=prd-questionnaire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd-questionnaire.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,YAAoB,EACpB,UAAkB,GACnB,EAAE,qBAAqB,kDAqMvB"}
@@ -0,0 +1,42 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Send, Check, ChevronLeft, ChevronRight } from 'lucide-react';
4
+ import { useCallback, useMemo, useState } from 'react';
5
+ import { cn } from '../../../lib/utils.js';
6
+ import { Button } from '../../ui/button.js';
7
+ import { Input } from '../../ui/input.js';
8
+ import { Badge } from '../../ui/badge.js';
9
+ export function PrdQuestionnaire({ data, selections, onSelect, onRefine, onApprove, isProcessing = false, showHeader = false, }) {
10
+ const { question, context, questions, finalAction } = data;
11
+ const [currentStep, setCurrentStep] = useState(0);
12
+ const [chatInput, setChatInput] = useState('');
13
+ const total = questions.length;
14
+ const isFirstStep = currentStep === 0;
15
+ const isLastStep = currentStep === total - 1;
16
+ const currentQuestion = questions[currentStep];
17
+ const answeredCount = useMemo(() => Object.keys(selections).length, [selections]);
18
+ const handleSelect = useCallback((questionId, optionId) => {
19
+ onSelect(questionId, optionId);
20
+ // Auto-advance to the next step after selection (unless last step)
21
+ if (!isLastStep) {
22
+ setTimeout(() => setCurrentStep((s) => s + 1), 250);
23
+ }
24
+ }, [onSelect, isLastStep]);
25
+ function handleSubmit(e) {
26
+ e.preventDefault();
27
+ const text = chatInput.trim();
28
+ if (!text)
29
+ return;
30
+ onRefine(text);
31
+ setChatInput('');
32
+ }
33
+ if (total === 0)
34
+ return null;
35
+ return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "flex-1 space-y-4 overflow-y-auto p-4", children: [showHeader ? (_jsxs("div", { className: "border-border flex items-start gap-3 border-b pb-3", children: [_jsx("div", { className: "mt-1.5 h-2 w-2 shrink-0 rounded-full bg-amber-500" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-foreground mb-1.5 text-sm font-bold", children: question }), _jsx("p", { className: "text-muted-foreground text-xs leading-relaxed", children: context })] })] })) : null, _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("label", { className: "text-foreground min-w-0 flex-1 text-sm font-semibold", children: currentQuestion.question }), _jsx("div", { className: "mt-1.5 flex shrink-0 gap-1", children: questions.map((q, idx) => (_jsx("button", { type: "button", "aria-label": `Go to question ${idx + 1}`, className: cn('h-1.5 rounded-full transition-all duration-200', idx === currentStep ? 'bg-primary w-4' : 'w-1.5', idx !== currentStep && selections[q.id] ? 'bg-primary/50' : '', idx !== currentStep && !selections[q.id] ? 'bg-muted-foreground/25' : ''), onClick: () => setCurrentStep(idx) }, q.id))) })] }), _jsx("div", { className: "space-y-2", children: currentQuestion.options.map((opt, optIdx) => {
36
+ const selected = selections[currentQuestion.id] === opt.id;
37
+ const letter = String.fromCharCode(65 + optIdx);
38
+ return (_jsx("button", { type: "button", className: cn('border-border w-full rounded-md border px-3 py-3 text-left text-xs transition-all', 'hover:border-primary/70 hover:bg-primary/5 group', selected && 'border-primary bg-primary/5', opt.isNew && 'animate-option-highlight'), disabled: isProcessing, onClick: () => handleSelect(currentQuestion.id, opt.id), children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsxs("span", { className: "text-muted-foreground mt-0.5 font-mono text-xs", children: [letter, "."] }), _jsxs("div", { className: "flex-1", children: [_jsxs("div", { className: "mb-0.5 flex items-center gap-2", children: [_jsx("span", { className: "text-foreground text-xs font-semibold", children: opt.label }), opt.recommended ? (_jsx(Badge, { className: "px-1.5 py-0 text-[10px]", children: "AI Recommended" })) : null, opt.isNew ? (_jsx(Badge, { className: "border-transparent bg-emerald-600 px-1.5 py-0 text-[10px] text-white hover:bg-emerald-600/80", children: "New" })) : null] }), _jsx("div", { className: "text-muted-foreground text-xs leading-snug", children: opt.rationale })] })] }) }, opt.id));
39
+ }) })] }), _jsxs("div", { className: "flex items-center justify-between pt-2", children: [_jsxs(Button, { type: "button", variant: "ghost", size: "sm", disabled: isFirstStep || isProcessing, onClick: () => setCurrentStep((s) => s - 1), children: [_jsx(ChevronLeft, { className: "mr-1 h-4 w-4" }), "Previous"] }), isLastStep ? (_jsxs(Button, { type: "button", size: "sm", disabled: isProcessing || answeredCount < total, onClick: () => onApprove(finalAction.id), children: [_jsx(Check, { className: "mr-1 h-4 w-4" }), finalAction.label] })) : (_jsxs(Button, { type: "button", variant: "ghost", size: "sm", disabled: isProcessing, onClick: () => setCurrentStep((s) => s + 1), children: [selections[currentQuestion.id] ? 'Next' : 'Skip', _jsx(ChevronRight, { className: "ml-1 h-4 w-4" })] }))] })] }), _jsxs("div", { className: "border-border bg-background shrink-0 border-t", children: [_jsx("div", { className: cn('bg-muted h-1.5 overflow-hidden', (answeredCount > 0 && answeredCount < total) || isProcessing
40
+ ? 'opacity-100'
41
+ : 'opacity-0', 'transition-opacity duration-200'), "data-testid": "progress-bar-container", children: isProcessing ? (_jsx("div", { className: "bg-primary animate-indeterminate-progress h-full w-1/3" })) : (_jsx("div", { className: "bg-primary h-full transition-all duration-300", style: { width: `${total > 0 ? (answeredCount / total) * 100 : 0}%` }, "data-testid": "progress-bar" })) }), _jsxs("form", { onSubmit: handleSubmit, className: "flex items-center gap-2 p-4", children: [_jsx(Input, { type: "text", placeholder: "Ask AI to refine requirements...", "aria-label": "Ask AI to refine requirements", disabled: isProcessing, value: chatInput, onChange: (e) => setChatInput(e.target.value), className: "flex-1" }), _jsx(Button, { type: "submit", variant: "secondary", size: "icon", "aria-label": "Send", disabled: isProcessing, children: _jsx(Send, {}) })] })] })] }));
42
+ }
@@ -0,0 +1,26 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { PrdQuestionnaire } from './prd-questionnaire.js';
3
+ import { PrdQuestionnaireDrawer } from './prd-questionnaire-drawer.js';
4
+ declare const meta: Meta<typeof PrdQuestionnaire>;
5
+ export default meta;
6
+ type Story = StoryObj<typeof PrdQuestionnaire>;
7
+ /** Default state — first step shown, no selections. Click options to auto-advance. */
8
+ export declare const Default: Story;
9
+ /** Starting with partial selections — step dots reflect answered state. */
10
+ export declare const WithSelections: Story;
11
+ /** All questions answered — last step shows Approve button enabled. */
12
+ export declare const AllAnswered: Story;
13
+ /** Processing state — all inputs disabled, indeterminate progress bar. */
14
+ export declare const Refining: Story;
15
+ /** Single question — minimal stepper with one step. */
16
+ export declare const MinimalData: Story;
17
+ type DrawerStory = StoryObj<typeof PrdQuestionnaireDrawer>;
18
+ /** Drawer with stepper — navigate questions one at a time. */
19
+ export declare const InDrawer: DrawerStory;
20
+ /** Drawer with partial selections showing progress dots. */
21
+ export declare const InDrawerWithSelections: DrawerStory;
22
+ /** Drawer with delete button visible. */
23
+ export declare const WithDeleteButton: DrawerStory;
24
+ /** Drawer with delete in progress (button disabled). */
25
+ export declare const DeletingState: DrawerStory;
26
+ //# sourceMappingURL=prd-questionnaire.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prd-questionnaire.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAmKpE,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAmBvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAU/C,sFAAsF;AACtF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,cAAc,EAAE,KAW5B,CAAC;AAEF,uEAAuE;AACvE,eAAO,MAAM,WAAW,EAAE,KAczB,CAAC;AAEF,0EAA0E;AAC1E,eAAO,MAAM,QAAQ,EAAE,KAStB,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,WAAW,EAAE,KA8BzB,CAAC;AAIF,KAAK,WAAW,GAAG,QAAQ,CAAC,OAAO,sBAAsB,CAAC,CAAC;AA2C3D,8DAA8D;AAC9D,eAAO,MAAM,QAAQ,EAAE,WAUtB,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,EAAE,WAepC,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,EAAE,WAW9B,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,aAAa,EAAE,WAY3B,CAAC"}
@@ -0,0 +1,267 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState } from 'react';
3
+ import { fn } from '@storybook/test';
4
+ import { PrdQuestionnaire } from './prd-questionnaire.js';
5
+ import { PrdQuestionnaireDrawer } from './prd-questionnaire-drawer.js';
6
+ const mockQuestions = [
7
+ {
8
+ id: 'problem',
9
+ question: 'What specific problem does this feature solve?',
10
+ type: 'select',
11
+ options: [
12
+ {
13
+ id: 'user_pain',
14
+ label: 'User Pain Point',
15
+ rationale: 'Addresses a recurring user complaint or friction',
16
+ recommended: true,
17
+ },
18
+ { id: 'market_gap', label: 'Market Gap', rationale: 'Fills a gap vs competitors' },
19
+ { id: 'tech_debt', label: 'Technical Debt', rationale: 'Reduces accumulated technical debt' },
20
+ {
21
+ id: 'compliance',
22
+ label: 'Compliance',
23
+ rationale: 'Meets regulatory or policy requirements',
24
+ },
25
+ ],
26
+ },
27
+ {
28
+ id: 'priority',
29
+ question: 'What is the business priority level?',
30
+ type: 'select',
31
+ options: [
32
+ { id: 'p0', label: 'P0 - Critical', rationale: 'Blocking issue, must fix immediately' },
33
+ { id: 'p1', label: 'P1 - High', rationale: 'Important for next release', recommended: true },
34
+ { id: 'p2', label: 'P2 - Medium', rationale: 'Nice to have, schedule when possible' },
35
+ { id: 'p3', label: 'P3 - Low', rationale: 'Backlog item, no urgency' },
36
+ ],
37
+ },
38
+ {
39
+ id: 'success',
40
+ question: 'What metrics define success?',
41
+ type: 'select',
42
+ options: [
43
+ {
44
+ id: 'adoption',
45
+ label: 'Adoption Rate',
46
+ rationale: 'Percentage of users who adopt the feature',
47
+ recommended: true,
48
+ },
49
+ {
50
+ id: 'performance',
51
+ label: 'Performance',
52
+ rationale: 'Latency, throughput, or resource improvements',
53
+ },
54
+ {
55
+ id: 'revenue',
56
+ label: 'Revenue Impact',
57
+ rationale: 'Direct or indirect revenue contribution',
58
+ },
59
+ {
60
+ id: 'satisfaction',
61
+ label: 'User Satisfaction',
62
+ rationale: 'NPS or CSAT score improvement',
63
+ },
64
+ ],
65
+ },
66
+ {
67
+ id: 'timeline',
68
+ question: 'What is the target timeline?',
69
+ type: 'select',
70
+ options: [
71
+ {
72
+ id: 'sprint',
73
+ label: 'This Sprint',
74
+ rationale: 'Deliverable within the current sprint',
75
+ recommended: true,
76
+ },
77
+ { id: 'quarter', label: 'This Quarter', rationale: 'Target completion within 3 months' },
78
+ { id: 'half', label: 'This Half', rationale: 'Target completion within 6 months' },
79
+ { id: 'year', label: 'This Year', rationale: 'Long-term initiative for the year' },
80
+ ],
81
+ },
82
+ {
83
+ id: 'scope',
84
+ question: 'What is the feature scope?',
85
+ type: 'select',
86
+ options: [
87
+ {
88
+ id: 'mvp',
89
+ label: 'MVP',
90
+ rationale: 'Minimum viable product — core functionality only',
91
+ recommended: true,
92
+ },
93
+ {
94
+ id: 'full',
95
+ label: 'Full Feature',
96
+ rationale: 'Complete feature with all planned capabilities',
97
+ },
98
+ { id: 'experiment', label: 'Experiment', rationale: 'A/B test or limited rollout' },
99
+ {
100
+ id: 'platform',
101
+ label: 'Platform',
102
+ rationale: 'Foundational work enabling future features',
103
+ },
104
+ ],
105
+ },
106
+ {
107
+ id: 'stakeholders',
108
+ question: 'Who are the primary stakeholders?',
109
+ type: 'select',
110
+ options: [
111
+ {
112
+ id: 'end_users',
113
+ label: 'End Users',
114
+ rationale: 'Direct users of the product',
115
+ recommended: true,
116
+ },
117
+ {
118
+ id: 'internal',
119
+ label: 'Internal Teams',
120
+ rationale: 'Engineering, product, or design teams',
121
+ },
122
+ {
123
+ id: 'enterprise',
124
+ label: 'Enterprise Clients',
125
+ rationale: 'B2B customers with specific needs',
126
+ },
127
+ {
128
+ id: 'partners',
129
+ label: 'Partners',
130
+ rationale: 'Third-party integrations or ecosystem partners',
131
+ },
132
+ ],
133
+ },
134
+ ];
135
+ const mockFinalAction = {
136
+ id: 'approve-reqs',
137
+ label: 'Approve Requirements',
138
+ description: 'Finalize and lock the requirements for implementation',
139
+ };
140
+ /* ─── Interactive wrapper for stories ─── */
141
+ function InteractiveQuestionnaire({ selections: initialSelections = {}, ...props }) {
142
+ const [selections, setSelections] = useState(initialSelections);
143
+ return (_jsx(PrdQuestionnaire, { ...props, selections: selections, onSelect: (qId, optId) => setSelections((prev) => ({ ...prev, [qId]: optId })), onRefine: fn().mockName('onRefine'), onApprove: fn().mockName('onApprove') }));
144
+ }
145
+ /* ─── Standalone PrdQuestionnaire ─── */
146
+ const meta = {
147
+ title: 'Composed/PrdQuestionnaire',
148
+ component: PrdQuestionnaire,
149
+ tags: ['autodocs'],
150
+ parameters: {
151
+ layout: 'fullscreen',
152
+ },
153
+ argTypes: {
154
+ onSelect: { action: 'onSelect' },
155
+ onRefine: { action: 'onRefine' },
156
+ onApprove: { action: 'onApprove' },
157
+ },
158
+ decorators: [
159
+ (Story) => (_jsx("div", { style: { height: '600px', width: '400px', border: '1px solid var(--color-border)' }, children: _jsx(Story, {}) })),
160
+ ],
161
+ };
162
+ export default meta;
163
+ const mockData = {
164
+ question: 'Review Feature Requirements',
165
+ context: 'Please review the AI-generated requirements below. Select the best option for each question, or ask the AI to refine them.',
166
+ questions: mockQuestions,
167
+ finalAction: mockFinalAction,
168
+ };
169
+ /** Default state — first step shown, no selections. Click options to auto-advance. */
170
+ export const Default = {
171
+ render: () => _jsx(InteractiveQuestionnaire, { data: mockData }),
172
+ };
173
+ /** Starting with partial selections — step dots reflect answered state. */
174
+ export const WithSelections = {
175
+ render: () => (_jsx(InteractiveQuestionnaire, { data: mockData, selections: {
176
+ problem: 'user_pain',
177
+ priority: 'p1',
178
+ success: 'adoption',
179
+ } })),
180
+ };
181
+ /** All questions answered — last step shows Approve button enabled. */
182
+ export const AllAnswered = {
183
+ render: () => (_jsx(InteractiveQuestionnaire, { data: mockData, selections: {
184
+ problem: 'user_pain',
185
+ priority: 'p1',
186
+ success: 'adoption',
187
+ timeline: 'sprint',
188
+ scope: 'mvp',
189
+ stakeholders: 'end_users',
190
+ } })),
191
+ };
192
+ /** Processing state — all inputs disabled, indeterminate progress bar. */
193
+ export const Refining = {
194
+ args: {
195
+ data: mockData,
196
+ selections: {
197
+ problem: 'user_pain',
198
+ priority: 'p1',
199
+ },
200
+ isProcessing: true,
201
+ },
202
+ };
203
+ /** Single question — minimal stepper with one step. */
204
+ export const MinimalData = {
205
+ render: () => (_jsx(InteractiveQuestionnaire, { data: {
206
+ question: 'Quick Check',
207
+ context: 'A simple yes/no decision.',
208
+ questions: [
209
+ {
210
+ id: 'confirm',
211
+ question: 'Should we proceed?',
212
+ type: 'select',
213
+ options: [
214
+ {
215
+ id: 'yes',
216
+ label: 'Yes',
217
+ rationale: 'Proceed with implementation',
218
+ recommended: true,
219
+ },
220
+ { id: 'no', label: 'No', rationale: 'Go back and reconsider' },
221
+ ],
222
+ },
223
+ ],
224
+ finalAction: {
225
+ id: 'confirm-action',
226
+ label: 'Confirm',
227
+ description: 'Confirm the decision',
228
+ },
229
+ } })),
230
+ };
231
+ const drawerMeta = {
232
+ title: 'Composed/PrdQuestionnaireDrawer',
233
+ component: PrdQuestionnaireDrawer,
234
+ tags: ['autodocs'],
235
+ parameters: {
236
+ layout: 'fullscreen',
237
+ },
238
+ };
239
+ function DrawerTemplate({ selections: initialSelections = {}, ...props }) {
240
+ const [open, setOpen] = useState(true);
241
+ const [selections, setSelections] = useState(initialSelections);
242
+ 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(PrdQuestionnaireDrawer, { ...props, open: open, onClose: () => setOpen(false), selections: selections, onSelect: (qId, optId) => setSelections((prev) => ({ ...prev, [qId]: optId })), onRefine: fn().mockName('onRefine'), onApprove: fn().mockName('onApprove') })] }));
243
+ }
244
+ /** Drawer with stepper — navigate questions one at a time. */
245
+ export const InDrawer = {
246
+ ...drawerMeta,
247
+ render: () => (_jsx(DrawerTemplate, { featureName: "User Authentication Flow", featureId: "FEAT-042", lifecycleLabel: "Requirements", data: mockData })),
248
+ };
249
+ /** Drawer with partial selections showing progress dots. */
250
+ export const InDrawerWithSelections = {
251
+ ...drawerMeta,
252
+ render: () => (_jsx(DrawerTemplate, { featureName: "User Authentication Flow", featureId: "FEAT-042", lifecycleLabel: "Requirements", data: mockData, selections: {
253
+ problem: 'user_pain',
254
+ priority: 'p1',
255
+ success: 'adoption',
256
+ } })),
257
+ };
258
+ /** Drawer with delete button visible. */
259
+ export const WithDeleteButton = {
260
+ ...drawerMeta,
261
+ render: () => (_jsx(DrawerTemplate, { featureName: "User Authentication Flow", featureId: "FEAT-042", lifecycleLabel: "Requirements", data: mockData, onDelete: fn().mockName('onDelete') })),
262
+ };
263
+ /** Drawer with delete in progress (button disabled). */
264
+ export const DeletingState = {
265
+ ...drawerMeta,
266
+ render: () => (_jsx(DrawerTemplate, { featureName: "User Authentication Flow", featureId: "FEAT-042", lifecycleLabel: "Requirements", data: mockData, onDelete: fn().mockName('onDelete'), isDeleting: true })),
267
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CA0H5F"}
1
+ {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CA6I5F"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { Handle, Position } from '@xyflow/react';
4
- import { Github, Plus, Code2, Terminal } from 'lucide-react';
4
+ import { Github, Plus, Code2, Terminal, FolderOpen } from 'lucide-react';
5
5
  import { cn } from '../../../lib/utils.js';
6
6
  import { ActionButton } from '../../common/action-button/index.js';
7
7
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
@@ -17,7 +17,7 @@ export function RepositoryNode({ data }) {
17
17
  e.stopPropagation();
18
18
  data.onClick?.();
19
19
  }
20
- }, className: "nodrag bg-card flex w-72 cursor-default items-center gap-3 rounded-full border px-4 py-3 shadow-sm", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) })] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
20
+ }, className: "nodrag bg-card flex w-72 cursor-default items-center gap-3 rounded-full border px-4 py-3 shadow-sm", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) })] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
21
21
  e.stopPropagation();
22
22
  data.onAdd?.();
23
23
  }, className: "text-muted-foreground hover:bg-accent dark:hover:bg-accent/50 flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-full transition-colors hover:text-blue-500", children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Add feature" })] }) })) : null] })] }), data.onAdd || data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: !data.showHandles, className: "opacity-0!" })) : null] }));
@@ -4,10 +4,13 @@ export interface RepositoryActionsInput {
4
4
  export interface RepositoryActionsState {
5
5
  openInIde: () => Promise<void>;
6
6
  openInShell: () => Promise<void>;
7
+ openFolder: () => Promise<void>;
7
8
  ideLoading: boolean;
8
9
  shellLoading: boolean;
10
+ folderLoading: boolean;
9
11
  ideError: string | null;
10
12
  shellError: string | null;
13
+ folderError: string | null;
11
14
  }
12
15
  export declare function useRepositoryActions(input: RepositoryActionsInput | null): RepositoryActionsState;
13
16
  //# sourceMappingURL=use-repository-actions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-repository-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/use-repository-actions.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,GAAG,sBAAsB,CAyEjG"}
1
+ {"version":3,"file":"use-repository-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/use-repository-actions.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,sBAAsB;IACrC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAID,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,GAAG,sBAAsB,CAkIjG"}
@@ -1,25 +1,34 @@
1
1
  'use client';
2
2
  import { useState, useCallback, useRef, useEffect } from 'react';
3
+ import { openIde } from '../../../app/actions/open-ide.js';
4
+ import { openShell } from '../../../app/actions/open-shell.js';
5
+ import { openFolder } from '../../../app/actions/open-folder.js';
3
6
  const ERROR_CLEAR_DELAY = 5000;
4
7
  export function useRepositoryActions(input) {
5
8
  const [ideLoading, setIdeLoading] = useState(false);
6
9
  const [shellLoading, setShellLoading] = useState(false);
10
+ const [folderLoading, setFolderLoading] = useState(false);
7
11
  const [ideError, setIdeError] = useState(null);
8
12
  const [shellError, setShellError] = useState(null);
13
+ const [folderError, setFolderError] = useState(null);
9
14
  const ideTimerRef = useRef(null);
10
15
  const shellTimerRef = useRef(null);
16
+ const folderTimerRef = useRef(null);
11
17
  // Clear timers on unmount
12
18
  useEffect(() => {
13
19
  const ideTimer = ideTimerRef.current;
14
20
  const shellTimer = shellTimerRef.current;
21
+ const folderTimer = folderTimerRef.current;
15
22
  return () => {
16
23
  if (ideTimer)
17
24
  clearTimeout(ideTimer);
18
25
  if (shellTimer)
19
26
  clearTimeout(shellTimer);
27
+ if (folderTimer)
28
+ clearTimeout(folderTimer);
20
29
  };
21
30
  }, []);
22
- const performAction = useCallback(async (url, setLoading, setError, timerRef, isLoading) => {
31
+ const performToolbarAction = useCallback(async (action, setLoading, setError, timerRef, isLoading) => {
23
32
  if (!input || isLoading)
24
33
  return;
25
34
  // Clear any existing timer
@@ -28,16 +37,9 @@ export function useRepositoryActions(input) {
28
37
  setLoading(true);
29
38
  setError(null);
30
39
  try {
31
- const response = await fetch(url, {
32
- method: 'POST',
33
- headers: { 'Content-Type': 'application/json' },
34
- body: JSON.stringify({
35
- repositoryPath: input.repositoryPath,
36
- }),
37
- });
38
- if (!response.ok) {
39
- const data = await response.json();
40
- const errorMessage = data.error ?? 'An unexpected error occurred';
40
+ const result = await action({ repositoryPath: input.repositoryPath });
41
+ if (!result.success) {
42
+ const errorMessage = result.error ?? 'An unexpected error occurred';
41
43
  setError(errorMessage);
42
44
  timerRef.current = setTimeout(() => setError(null), ERROR_CLEAR_DELAY);
43
45
  }
@@ -51,7 +53,42 @@ export function useRepositoryActions(input) {
51
53
  setLoading(false);
52
54
  }
53
55
  }, [input]);
54
- const openInIde = useCallback(() => performAction('/api/ide/open', setIdeLoading, setIdeError, ideTimerRef, ideLoading), [performAction, ideLoading]);
55
- const openInShell = useCallback(() => performAction('/api/shell/open', setShellLoading, setShellError, shellTimerRef, shellLoading), [performAction, shellLoading]);
56
- return { openInIde, openInShell, ideLoading, shellLoading, ideError, shellError };
56
+ const performFolderAction = useCallback(async (action, setLoading, setError, timerRef, isLoading) => {
57
+ if (!input || isLoading)
58
+ return;
59
+ if (timerRef.current)
60
+ clearTimeout(timerRef.current);
61
+ setLoading(true);
62
+ setError(null);
63
+ try {
64
+ const result = await action(input.repositoryPath);
65
+ if (!result.success) {
66
+ const errorMessage = result.error ?? 'An unexpected error occurred';
67
+ setError(errorMessage);
68
+ timerRef.current = setTimeout(() => setError(null), ERROR_CLEAR_DELAY);
69
+ }
70
+ }
71
+ catch (err) {
72
+ const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred';
73
+ setError(errorMessage);
74
+ timerRef.current = setTimeout(() => setError(null), ERROR_CLEAR_DELAY);
75
+ }
76
+ finally {
77
+ setLoading(false);
78
+ }
79
+ }, [input]);
80
+ const handleOpenIde = useCallback(() => performToolbarAction(openIde, setIdeLoading, setIdeError, ideTimerRef, ideLoading), [performToolbarAction, ideLoading]);
81
+ const handleOpenShell = useCallback(() => performToolbarAction(openShell, setShellLoading, setShellError, shellTimerRef, shellLoading), [performToolbarAction, shellLoading]);
82
+ const handleOpenFolder = useCallback(() => performFolderAction(openFolder, setFolderLoading, setFolderError, folderTimerRef, folderLoading), [performFolderAction, folderLoading]);
83
+ return {
84
+ openInIde: handleOpenIde,
85
+ openInShell: handleOpenShell,
86
+ openFolder: handleOpenFolder,
87
+ ideLoading,
88
+ shellLoading,
89
+ folderLoading,
90
+ ideError,
91
+ shellError,
92
+ folderError,
93
+ };
57
94
  }
@@ -0,0 +1,3 @@
1
+ export { ReviewDrawerShell } from './review-drawer-shell.js';
2
+ export type { ReviewDrawerShellProps } from './review-drawer-shell-config.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/review-drawer-shell/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -0,0 +1 @@
1
+ export { ReviewDrawerShell } from './review-drawer-shell.js';
@@ -0,0 +1,24 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface ReviewDrawerShellProps {
3
+ /** Whether the drawer is open */
4
+ open: boolean;
5
+ /** Callback when drawer should close */
6
+ onClose: () => void;
7
+ /** Feature name shown in drawer header */
8
+ featureName: string;
9
+ /** Feature ID shown below the name (sr-only) */
10
+ featureId?: string;
11
+ /** Absolute path to the repository on disk */
12
+ repositoryPath?: string;
13
+ /** Git branch name for this feature */
14
+ branch?: string;
15
+ /** Absolute path to the specs folder on disk */
16
+ specPath?: string;
17
+ /** Callback to delete the feature — shows inline delete button when provided */
18
+ onDelete?: (featureId: string) => void;
19
+ /** Whether a delete operation is in progress */
20
+ isDeleting?: boolean;
21
+ /** Drawer body content */
22
+ children: ReactNode;
23
+ }
24
+ //# sourceMappingURL=review-drawer-shell-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review-drawer-shell-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,sBAAsB;IACrC,iCAAiC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,wCAAwC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0BAA0B;IAC1B,QAAQ,EAAE,SAAS,CAAC;CACrB"}