@shepai/cli 1.47.0 → 1.49.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 (235) hide show
  1. package/apis/json-schema/ApprovalGateDefaults.yaml +26 -0
  2. package/apis/json-schema/Feature.yaml +3 -0
  3. package/apis/json-schema/Repository.yaml +16 -0
  4. package/apis/json-schema/Settings.yaml +5 -0
  5. package/apis/json-schema/WorkflowConfig.yaml +4 -20
  6. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +17 -0
  7. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/ports/output/services/worktree-service.interface.d.ts +11 -1
  9. package/dist/packages/core/src/application/ports/output/services/worktree-service.interface.d.ts.map +1 -1
  10. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +3 -1
  11. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  12. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +11 -4
  13. package/dist/packages/core/src/application/use-cases/features/get-plan-artifact.use-case.d.ts +19 -0
  14. package/dist/packages/core/src/application/use-cases/features/get-plan-artifact.use-case.d.ts.map +1 -0
  15. package/dist/packages/core/src/application/use-cases/features/get-plan-artifact.use-case.js +52 -0
  16. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  17. package/dist/packages/core/src/infrastructure/di/container.js +8 -0
  18. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js +1 -1
  19. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +2 -0
  21. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.d.ts +2 -0
  22. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.d.ts.map +1 -1
  23. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.js +66 -30
  24. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
  25. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +15 -7
  26. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +2 -0
  27. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  28. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +41 -0
  29. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts +2 -1
  30. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
  31. package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +29 -4
  32. package/dist/src/presentation/cli/ui/messages.d.ts.map +1 -1
  33. package/dist/src/presentation/cli/ui/messages.js +1 -7
  34. package/dist/src/presentation/web/app/actions/approve-feature.d.ts +2 -1
  35. package/dist/src/presentation/web/app/actions/approve-feature.d.ts.map +1 -1
  36. package/dist/src/presentation/web/app/actions/approve-feature.js +2 -2
  37. package/dist/src/presentation/web/app/actions/get-merge-review-data.d.ts +7 -0
  38. package/dist/src/presentation/web/app/actions/get-merge-review-data.d.ts.map +1 -0
  39. package/dist/src/presentation/web/app/actions/get-merge-review-data.js +49 -0
  40. package/dist/src/presentation/web/app/actions/reject-feature.d.ts +7 -0
  41. package/dist/src/presentation/web/app/actions/reject-feature.d.ts.map +1 -0
  42. package/dist/src/presentation/web/app/actions/reject-feature.js +34 -0
  43. package/dist/src/presentation/web/app/page.d.ts.map +1 -1
  44. package/dist/src/presentation/web/app/page.js +1 -0
  45. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.d.ts +24 -0
  46. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.d.ts.map +1 -0
  47. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.js +1 -0
  48. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts +3 -0
  49. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts.map +1 -0
  50. package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +12 -0
  51. package/dist/src/presentation/web/components/common/drawer-action-bar/index.d.ts +3 -0
  52. package/dist/src/presentation/web/components/common/drawer-action-bar/index.d.ts.map +1 -0
  53. package/dist/src/presentation/web/components/common/drawer-action-bar/index.js +1 -0
  54. package/dist/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input-config.d.ts +11 -0
  55. package/dist/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input-config.d.ts.map +1 -0
  56. package/dist/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input-config.js +1 -0
  57. package/dist/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input.d.ts +3 -0
  58. package/dist/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input.d.ts.map +1 -0
  59. package/dist/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input.js +18 -0
  60. package/dist/src/presentation/web/components/common/drawer-revision-input/index.d.ts +3 -0
  61. package/dist/src/presentation/web/components/common/drawer-revision-input/index.d.ts.map +1 -0
  62. package/dist/src/presentation/web/components/common/drawer-revision-input/index.js +1 -0
  63. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  64. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +8 -1
  65. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +1 -0
  66. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  67. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +22 -1
  68. package/dist/src/presentation/web/components/common/merge-review/index.d.ts +4 -0
  69. package/dist/src/presentation/web/components/common/merge-review/index.d.ts.map +1 -0
  70. package/dist/src/presentation/web/components/common/merge-review/index.js +2 -0
  71. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts +77 -0
  72. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts.map +1 -0
  73. package/dist/src/presentation/web/components/common/merge-review/merge-review-config.js +1 -0
  74. package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.d.ts +3 -0
  75. package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.d.ts.map +1 -0
  76. package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.js +7 -0
  77. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts +3 -0
  78. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -0
  79. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +25 -0
  80. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +32 -0
  81. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -0
  82. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +165 -0
  83. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts +4 -2
  84. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts.map +1 -1
  85. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts +1 -1
  86. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts.map +1 -1
  87. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +6 -15
  88. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +4 -0
  89. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
  90. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +24 -3
  91. package/dist/src/presentation/web/components/common/reject-feedback-dialog/index.d.ts +3 -0
  92. package/dist/src/presentation/web/components/common/reject-feedback-dialog/index.d.ts.map +1 -0
  93. package/dist/src/presentation/web/components/common/reject-feedback-dialog/index.js +1 -0
  94. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog-config.d.ts +9 -0
  95. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog-config.d.ts.map +1 -0
  96. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog-config.js +1 -0
  97. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.d.ts +3 -0
  98. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.d.ts.map +1 -0
  99. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.js +19 -0
  100. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.stories.d.ts +14 -0
  101. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.stories.d.ts.map +1 -0
  102. package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.stories.js +46 -0
  103. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.d.ts +4 -2
  104. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.d.ts.map +1 -1
  105. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts +1 -1
  106. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -1
  107. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +4 -14
  108. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts +4 -0
  109. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -1
  110. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +24 -6
  111. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  112. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +88 -19
  113. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
  114. package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +15 -0
  115. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  116. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +37 -15
  117. package/dist/tsconfig.build.tsbuildinfo +1 -1
  118. package/package.json +1 -1
  119. package/web/.next/BUILD_ID +1 -1
  120. package/web/.next/build-manifest.json +2 -2
  121. package/web/.next/cache/.previewinfo +1 -1
  122. package/web/.next/cache/.rscinfo +1 -1
  123. package/web/.next/cache/.tsbuildinfo +1 -1
  124. package/web/.next/cache/config.json +3 -3
  125. package/web/.next/fallback-build-manifest.json +2 -2
  126. package/web/.next/prerender-manifest.json +3 -3
  127. package/web/.next/required-server-files.js +1 -1
  128. package/web/.next/required-server-files.json +1 -1
  129. package/web/.next/server/app/_global-error.html +2 -2
  130. package/web/.next/server/app/_global-error.rsc +1 -1
  131. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  132. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  133. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  134. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  135. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  136. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  137. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  138. package/web/.next/server/app/page/server-reference-manifest.json +54 -24
  139. package/web/.next/server/app/page.js +2 -1
  140. package/web/.next/server/app/page.js.nft.json +1 -1
  141. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  142. package/web/.next/server/app/version/page.js.nft.json +1 -1
  143. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +4 -4
  145. package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +1 -1
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js +9 -0
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js.map +1 -0
  149. package/web/.next/server/chunks/ssr/[root-of-the-server]__d8fbe735._.js +3 -0
  150. package/web/.next/server/chunks/ssr/[root-of-the-server]__d8fbe735._.js.map +1 -0
  151. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/_3ac3601c._.js → server/chunks/ssr/_1fafa9db._.js} +2 -2
  152. package/web/.next/server/chunks/ssr/_1fafa9db._.js.map +1 -0
  153. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  154. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  156. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  157. package/web/.next/server/pages/500.html +2 -2
  158. package/web/.next/server/server-reference-manifest.js +1 -1
  159. package/web/.next/server/server-reference-manifest.json +55 -25
  160. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  161. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  162. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  163. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  164. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  165. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  166. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  167. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  168. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  169. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  170. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  171. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  172. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  173. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +54 -24
  174. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +2 -1
  175. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  176. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  177. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  178. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +4 -4
  180. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
  181. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js +9 -0
  182. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__d8fbe735._.js +3 -0
  183. package/web/.next/{server/chunks/ssr/_3ac3601c._.js → standalone/src/presentation/web/.next/server/chunks/ssr/_1fafa9db._.js} +2 -2
  184. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  185. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  186. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  187. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  188. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +55 -25
  189. package/web/.next/standalone/src/presentation/web/app/actions/approve-feature.ts +4 -2
  190. package/web/.next/standalone/src/presentation/web/app/actions/get-merge-review-data.ts +64 -0
  191. package/web/.next/standalone/src/presentation/web/app/actions/reject-feature.ts +52 -0
  192. package/web/.next/standalone/src/presentation/web/app/page.tsx +1 -0
  193. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.ts +24 -0
  194. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx +64 -0
  195. package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/index.ts +2 -0
  196. package/web/.next/standalone/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input-config.ts +10 -0
  197. package/web/.next/standalone/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input.tsx +41 -0
  198. package/web/.next/standalone/src/presentation/web/components/common/drawer-revision-input/index.ts +2 -0
  199. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.stories.tsx +23 -1
  200. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.tsx +6 -1
  201. package/web/.next/standalone/src/presentation/web/components/common/merge-review/index.ts +7 -0
  202. package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review-config.ts +83 -0
  203. package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review-drawer.tsx +34 -0
  204. package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.stories.tsx +240 -0
  205. package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.tsx +223 -0
  206. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.ts +4 -2
  207. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +36 -8
  208. package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +16 -47
  209. package/web/.next/standalone/src/presentation/web/components/common/reject-feedback-dialog/index.ts +2 -0
  210. package/web/.next/standalone/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog-config.ts +8 -0
  211. package/web/.next/standalone/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.stories.tsx +63 -0
  212. package/web/.next/standalone/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.tsx +78 -0
  213. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.ts +4 -2
  214. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx +27 -6
  215. package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +14 -42
  216. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +157 -31
  217. package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center.stories.tsx +15 -0
  218. package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +47 -17
  219. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  220. package/web/.next/static/chunks/{9f8e71029fb04681.js → 0da7a9860fa6ae05.js} +2 -2
  221. package/web/.next/static/chunks/191ca1529c9868dd.js +10 -0
  222. package/web/.next/static/chunks/22f30ce91a3c79c1.js +1 -0
  223. package/web/.next/static/chunks/59b8bd47023e0249.css +2 -0
  224. package/web/.next/trace +1 -1
  225. package/web/.next/trace-build +1 -1
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__d6d75c22._.js +0 -9
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__d6d75c22._.js.map +0 -1
  228. package/web/.next/server/chunks/ssr/_3ac3601c._.js.map +0 -1
  229. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__d6d75c22._.js +0 -9
  230. package/web/.next/static/chunks/779c99975c85389e.js +0 -10
  231. package/web/.next/static/chunks/83ff3b6bbee54bce.js +0 -1
  232. package/web/.next/static/chunks/b7b7abe79e05b229.css +0 -2
  233. /package/web/.next/static/{wQ3vPV9I8JeacVNyp4HFg → UT60KjU8SOYIjqeqo2WT-}/_buildManifest.js +0 -0
  234. /package/web/.next/static/{wQ3vPV9I8JeacVNyp4HFg → UT60KjU8SOYIjqeqo2WT-}/_clientMiddlewareManifest.json +0 -0
  235. /package/web/.next/static/{wQ3vPV9I8JeacVNyp4HFg → UT60KjU8SOYIjqeqo2WT-}/_ssgManifest.js +0 -0
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "node": {
3
- "40d0a3e706fa8b01e4364b67a1f80c2f26dc02af10": {
3
+ "60725e6edd6c9743fb7fa2acdedba221ea99a22c99": {
4
4
  "workers": {
5
5
  "app/page": {
6
- "moduleId": 94090,
6
+ "moduleId": 4510,
7
7
  "async": false,
8
8
  "exportedName": "approveFeature",
9
9
  "filename": "src/presentation/web/app/actions/approve-feature.ts"
@@ -15,10 +15,25 @@
15
15
  "filename": "src/presentation/web/app/actions/approve-feature.ts",
16
16
  "exportedName": "approveFeature"
17
17
  },
18
- "40115d3ddb31ff86dafde210f83d4d01739ef550de": {
18
+ "605e21808f0e88d6e49558246e7498db1a31108458": {
19
19
  "workers": {
20
20
  "app/page": {
21
- "moduleId": 94090,
21
+ "moduleId": 4510,
22
+ "async": false,
23
+ "exportedName": "rejectFeature",
24
+ "filename": "src/presentation/web/app/actions/reject-feature.ts"
25
+ }
26
+ },
27
+ "layer": {
28
+ "app/page": "action-browser"
29
+ },
30
+ "filename": "src/presentation/web/app/actions/reject-feature.ts",
31
+ "exportedName": "rejectFeature"
32
+ },
33
+ "4034da6eaae02e393a605d9a77a1475647a322e92b": {
34
+ "workers": {
35
+ "app/page": {
36
+ "moduleId": 4510,
22
37
  "async": false,
23
38
  "exportedName": "getFeatureArtifact",
24
39
  "filename": "src/presentation/web/app/actions/get-feature-artifact.ts"
@@ -30,10 +45,10 @@
30
45
  "filename": "src/presentation/web/app/actions/get-feature-artifact.ts",
31
46
  "exportedName": "getFeatureArtifact"
32
47
  },
33
- "403ea6c9bd10b21438b631731894e18e2c9a72a037": {
48
+ "40c39d9f141368b3a789ccd8a1818bbb0fc304657e": {
34
49
  "workers": {
35
50
  "app/page": {
36
- "moduleId": 94090,
51
+ "moduleId": 4510,
37
52
  "async": false,
38
53
  "exportedName": "getResearchArtifact",
39
54
  "filename": "src/presentation/web/app/actions/get-research-artifact.ts"
@@ -45,10 +60,10 @@
45
60
  "filename": "src/presentation/web/app/actions/get-research-artifact.ts",
46
61
  "exportedName": "getResearchArtifact"
47
62
  },
48
- "0093c723faa4b6cfd43ff6a346973c45dcdafd917c": {
63
+ "0094559528ecdb02319480522b15f2b0fbabf70de0": {
49
64
  "workers": {
50
65
  "app/page": {
51
- "moduleId": 94090,
66
+ "moduleId": 4510,
52
67
  "async": false,
53
68
  "exportedName": "getWorkflowDefaults",
54
69
  "filename": "src/presentation/web/app/actions/get-workflow-defaults.ts"
@@ -60,10 +75,25 @@
60
75
  "filename": "src/presentation/web/app/actions/get-workflow-defaults.ts",
61
76
  "exportedName": "getWorkflowDefaults"
62
77
  },
63
- "40a30ff303cb355d994314077a44146c2afe41633a": {
78
+ "40a4ae95c3eb64cfde57dc6db22db9f3660b7a764f": {
79
+ "workers": {
80
+ "app/page": {
81
+ "moduleId": 4510,
82
+ "async": false,
83
+ "exportedName": "getMergeReviewData",
84
+ "filename": "src/presentation/web/app/actions/get-merge-review-data.ts"
85
+ }
86
+ },
87
+ "layer": {
88
+ "app/page": "action-browser"
89
+ },
90
+ "filename": "src/presentation/web/app/actions/get-merge-review-data.ts",
91
+ "exportedName": "getMergeReviewData"
92
+ },
93
+ "40e3cffaa33524a12e55626b274ab07a38f5271589": {
64
94
  "workers": {
65
95
  "app/page": {
66
- "moduleId": 94090,
96
+ "moduleId": 4510,
67
97
  "async": false,
68
98
  "exportedName": "openIde",
69
99
  "filename": "src/presentation/web/app/actions/open-ide.ts"
@@ -75,10 +105,10 @@
75
105
  "filename": "src/presentation/web/app/actions/open-ide.ts",
76
106
  "exportedName": "openIde"
77
107
  },
78
- "40c994b683284ab7c96f945c8b95fb023aa0ffc854": {
108
+ "4049e6f8ecdd0b75842cf02b8ac52a8157bebc0142": {
79
109
  "workers": {
80
110
  "app/page": {
81
- "moduleId": 94090,
111
+ "moduleId": 4510,
82
112
  "async": false,
83
113
  "exportedName": "openShell",
84
114
  "filename": "src/presentation/web/app/actions/open-shell.ts"
@@ -90,10 +120,10 @@
90
120
  "filename": "src/presentation/web/app/actions/open-shell.ts",
91
121
  "exportedName": "openShell"
92
122
  },
93
- "40ed3604b89a263f2d2428a04b03e0397d4d1dfe14": {
123
+ "407c4c1533c9b75110ad59cefcdabb70ac5b5401b3": {
94
124
  "workers": {
95
125
  "app/page": {
96
- "moduleId": 94090,
126
+ "moduleId": 4510,
97
127
  "async": false,
98
128
  "exportedName": "openFolder",
99
129
  "filename": "src/presentation/web/app/actions/open-folder.ts"
@@ -105,10 +135,10 @@
105
135
  "filename": "src/presentation/web/app/actions/open-folder.ts",
106
136
  "exportedName": "openFolder"
107
137
  },
108
- "002cfb464c1d3ab32bd963f49035b100891de6215e": {
138
+ "005600d5f26056661789ce94bb1f2138a1be4b514d": {
109
139
  "workers": {
110
140
  "app/page": {
111
- "moduleId": 94090,
141
+ "moduleId": 4510,
112
142
  "async": false,
113
143
  "exportedName": "pickFolder",
114
144
  "filename": "src/presentation/web/app/actions/pick-folder.ts"
@@ -120,10 +150,10 @@
120
150
  "filename": "src/presentation/web/app/actions/pick-folder.ts",
121
151
  "exportedName": "pickFolder"
122
152
  },
123
- "40ebcd0e44246e2d829ed41e5882ccfc8f2d9ea549": {
153
+ "402ca918bcfe848cb370fc9398dd4822598236b08b": {
124
154
  "workers": {
125
155
  "app/page": {
126
- "moduleId": 94090,
156
+ "moduleId": 4510,
127
157
  "async": false,
128
158
  "exportedName": "createFeature",
129
159
  "filename": "src/presentation/web/app/actions/create-feature.ts"
@@ -135,10 +165,10 @@
135
165
  "filename": "src/presentation/web/app/actions/create-feature.ts",
136
166
  "exportedName": "createFeature"
137
167
  },
138
- "40aeecbe93c1ac4107b91ca18021b180088949d524": {
168
+ "406ebd5e8423afbbb122410891f7083f04e7932897": {
139
169
  "workers": {
140
170
  "app/page": {
141
- "moduleId": 94090,
171
+ "moduleId": 4510,
142
172
  "async": false,
143
173
  "exportedName": "deleteFeature",
144
174
  "filename": "src/presentation/web/app/actions/delete-feature.ts"
@@ -150,10 +180,10 @@
150
180
  "filename": "src/presentation/web/app/actions/delete-feature.ts",
151
181
  "exportedName": "deleteFeature"
152
182
  },
153
- "40f460f3a71643a4470fe6b0624a42ffe4328ac96a": {
183
+ "409b87593fd7e237b4bb51d81f1b3f1465df6b8efc": {
154
184
  "workers": {
155
185
  "app/page": {
156
- "moduleId": 94090,
186
+ "moduleId": 4510,
157
187
  "async": false,
158
188
  "exportedName": "addRepository",
159
189
  "filename": "src/presentation/web/app/actions/add-repository.ts"
@@ -165,10 +195,10 @@
165
195
  "filename": "src/presentation/web/app/actions/add-repository.ts",
166
196
  "exportedName": "addRepository"
167
197
  },
168
- "40076d6aa59873fb8fc1482d79ec46f1190e5586ed": {
198
+ "4002db4a13cd5cd14cc6f0bfd87a9b1e38cb990411": {
169
199
  "workers": {
170
200
  "app/page": {
171
- "moduleId": 94090,
201
+ "moduleId": 4510,
172
202
  "async": false,
173
203
  "exportedName": "deleteRepository",
174
204
  "filename": "src/presentation/web/app/actions/delete-repository.ts"
@@ -182,5 +212,5 @@
182
212
  }
183
213
  },
184
214
  "edge": {},
185
- "encryptionKey": "NtfNvj3HgiKgYLoNQgEO3FR4k83Rs/qJeYJ3CJR63lI="
215
+ "encryptionKey": "lfDMOktcEgm3EhZyios0W88TuAca2toOgnxMajteruU="
186
216
  }
@@ -3,9 +3,11 @@
3
3
  import { resolve } from '@/lib/server-container';
4
4
  import type { ApproveAgentRunUseCase } from '@shepai/core/application/use-cases/agents/approve-agent-run.use-case';
5
5
  import type { IFeatureRepository } from '@shepai/core/application/ports/output/repositories/feature-repository.interface';
6
+ import type { PrdApprovalPayload } from '@shepai/core/domain/generated/output';
6
7
 
7
8
  export async function approveFeature(
8
- featureId: string
9
+ featureId: string,
10
+ payload?: PrdApprovalPayload
9
11
  ): Promise<{ approved: boolean; error?: string }> {
10
12
  if (!featureId.trim()) {
11
13
  return { approved: false, error: 'Feature id is required' };
@@ -24,7 +26,7 @@ export async function approveFeature(
24
26
  }
25
27
 
26
28
  const approveUseCase = resolve<ApproveAgentRunUseCase>('ApproveAgentRunUseCase');
27
- const result = await approveUseCase.execute(feature.agentRunId);
29
+ const result = await approveUseCase.execute(feature.agentRunId, payload);
28
30
 
29
31
  if (!result.approved) {
30
32
  return { approved: false, error: result.reason };
@@ -0,0 +1,64 @@
1
+ 'use server';
2
+
3
+ import { resolve } from '@/lib/server-container';
4
+ import type { IFeatureRepository } from '@shepai/core/application/ports/output/repositories/feature-repository.interface';
5
+ import type { IGitPrService } from '@shepai/core/application/ports/output/services/git-pr-service.interface';
6
+ import type { GetPlanArtifactUseCase } from '@shepai/core/application/use-cases/features/get-plan-artifact.use-case';
7
+ import type {
8
+ MergeReviewData,
9
+ MergeReviewPhase,
10
+ } from '@/components/common/merge-review/merge-review-config';
11
+
12
+ type GetMergeReviewDataResult = MergeReviewData | { error: string };
13
+
14
+ export async function getMergeReviewData(featureId: string): Promise<GetMergeReviewDataResult> {
15
+ if (!featureId.trim()) {
16
+ return { error: 'Feature id is required' };
17
+ }
18
+
19
+ try {
20
+ const featureRepo = resolve<IFeatureRepository>('IFeatureRepository');
21
+ const feature = await featureRepo.findById(featureId);
22
+
23
+ if (!feature) {
24
+ return { error: 'Feature not found' };
25
+ }
26
+
27
+ const pr = feature.pr
28
+ ? {
29
+ url: feature.pr.url,
30
+ number: feature.pr.number,
31
+ status: feature.pr.status,
32
+ commitHash: feature.pr.commitHash,
33
+ ciStatus: feature.pr.ciStatus,
34
+ }
35
+ : undefined;
36
+
37
+ const branch = feature.branch ? { source: feature.branch, target: 'main' } : undefined;
38
+
39
+ // Load plan phases (best-effort)
40
+ let phases: MergeReviewPhase[] | undefined;
41
+ try {
42
+ const planUseCase = resolve<GetPlanArtifactUseCase>('GetPlanArtifactUseCase');
43
+ const plan = await planUseCase.execute(featureId);
44
+ phases = plan.phases.map(({ id, name, description }) => ({ id, name, description }));
45
+ } catch {
46
+ // Plan unavailable — not critical
47
+ }
48
+
49
+ if (!feature.worktreePath) {
50
+ return { pr, branch, phases, warning: pr ? undefined : 'No PR or diff data available' };
51
+ }
52
+
53
+ try {
54
+ const gitPrService = resolve<IGitPrService>('IGitPrService');
55
+ const diffSummary = await gitPrService.getPrDiffSummary(feature.worktreePath, 'main');
56
+ return { pr, branch, phases, diffSummary };
57
+ } catch {
58
+ return { pr, branch, phases, warning: 'Diff statistics unavailable' };
59
+ }
60
+ } catch (error: unknown) {
61
+ const message = error instanceof Error ? error.message : 'Failed to load merge review data';
62
+ return { error: message };
63
+ }
64
+ }
@@ -0,0 +1,52 @@
1
+ 'use server';
2
+
3
+ import { resolve } from '@/lib/server-container';
4
+ import type { RejectAgentRunUseCase } from '@shepai/core/application/use-cases/agents/reject-agent-run.use-case';
5
+ import type { IFeatureRepository } from '@shepai/core/application/ports/output/repositories/feature-repository.interface';
6
+
7
+ export async function rejectFeature(
8
+ featureId: string,
9
+ feedback: string
10
+ ): Promise<{
11
+ rejected: boolean;
12
+ iteration?: number;
13
+ iterationWarning?: boolean;
14
+ error?: string;
15
+ }> {
16
+ if (!featureId.trim()) {
17
+ return { rejected: false, error: 'Feature id is required' };
18
+ }
19
+
20
+ if (!feedback.trim()) {
21
+ return { rejected: false, error: 'Feedback is required' };
22
+ }
23
+
24
+ try {
25
+ const featureRepo = resolve<IFeatureRepository>('IFeatureRepository');
26
+ const feature = await featureRepo.findById(featureId);
27
+
28
+ if (!feature) {
29
+ return { rejected: false, error: 'Feature not found' };
30
+ }
31
+
32
+ if (!feature.agentRunId) {
33
+ return { rejected: false, error: 'Feature has no agent run' };
34
+ }
35
+
36
+ const rejectUseCase = resolve<RejectAgentRunUseCase>('RejectAgentRunUseCase');
37
+ const result = await rejectUseCase.execute(feature.agentRunId, feedback);
38
+
39
+ if (!result.rejected) {
40
+ return { rejected: false, error: result.reason };
41
+ }
42
+
43
+ return {
44
+ rejected: true,
45
+ iteration: result.iteration,
46
+ iterationWarning: result.iterationWarning,
47
+ };
48
+ } catch (error: unknown) {
49
+ const message = error instanceof Error ? error.message : 'Failed to reject feature';
50
+ return { rejected: false, error: message };
51
+ }
52
+ }
@@ -32,6 +32,7 @@ const nodeToLifecyclePhase: Record<string, FeatureLifecyclePhase> = {
32
32
  research: 'research',
33
33
  plan: 'implementation',
34
34
  implement: 'implementation',
35
+ merge: 'review',
35
36
  };
36
37
 
37
38
  export default async function HomePage() {
@@ -0,0 +1,24 @@
1
+ import type { ReactNode } from 'react';
2
+
3
+ export interface DrawerActionBarProps {
4
+ /** Callback when user rejects with feedback (inline input or dialog) */
5
+ onReject?: (feedback: string) => void;
6
+ /** Callback when user approves */
7
+ onApprove: () => void;
8
+ /** Label for the approve button */
9
+ approveLabel: string;
10
+ /** Icon element for the approve button */
11
+ approveIcon?: ReactNode;
12
+ /** Placeholder for the inline revision input */
13
+ revisionPlaceholder?: string;
14
+ /** Title for the reject feedback dialog */
15
+ rejectDialogTitle?: string;
16
+ /** Whether an approval/processing operation is in flight */
17
+ isProcessing?: boolean;
18
+ /** Whether a reject operation is in flight */
19
+ isRejecting?: boolean;
20
+ /** Whether to show the reject button (defaults to true when onReject is provided) */
21
+ showRejectButton?: boolean;
22
+ /** Content rendered between revision input and action buttons (e.g. progress bar) */
23
+ children?: ReactNode;
24
+ }
@@ -0,0 +1,64 @@
1
+ 'use client';
2
+
3
+ import { useState } from 'react';
4
+ import { X } from 'lucide-react';
5
+ import { Button } from '@/components/ui/button';
6
+ import { RejectFeedbackDialog } from '@/components/common/reject-feedback-dialog';
7
+ import { DrawerRevisionInput } from '@/components/common/drawer-revision-input';
8
+ import type { DrawerActionBarProps } from './drawer-action-bar-config';
9
+
10
+ export function DrawerActionBar({
11
+ onReject,
12
+ onApprove,
13
+ approveLabel,
14
+ approveIcon,
15
+ revisionPlaceholder,
16
+ rejectDialogTitle,
17
+ isProcessing = false,
18
+ isRejecting = false,
19
+ showRejectButton = true,
20
+ children,
21
+ }: DrawerActionBarProps) {
22
+ const [rejectDialogOpen, setRejectDialogOpen] = useState(false);
23
+ const disabled = isProcessing || isRejecting;
24
+
25
+ return (
26
+ <div className="border-border shrink-0 border-t">
27
+ {children}
28
+ {onReject ? (
29
+ <DrawerRevisionInput
30
+ onSubmit={onReject}
31
+ placeholder={revisionPlaceholder}
32
+ disabled={disabled || !onReject}
33
+ />
34
+ ) : null}
35
+ <div className="flex items-center gap-2 px-4 pb-4">
36
+ {onReject && showRejectButton ? (
37
+ <>
38
+ <Button
39
+ type="button"
40
+ variant="outline"
41
+ className="text-destructive hover:text-destructive"
42
+ disabled={disabled}
43
+ onClick={() => setRejectDialogOpen(true)}
44
+ >
45
+ <X className="mr-1.5 h-4 w-4" />
46
+ Reject
47
+ </Button>
48
+ <RejectFeedbackDialog
49
+ open={rejectDialogOpen}
50
+ onOpenChange={setRejectDialogOpen}
51
+ onConfirm={onReject}
52
+ isSubmitting={isRejecting}
53
+ title={rejectDialogTitle}
54
+ />
55
+ </>
56
+ ) : null}
57
+ <Button type="button" className="flex-1" disabled={disabled} onClick={onApprove}>
58
+ {approveIcon}
59
+ {approveLabel}
60
+ </Button>
61
+ </div>
62
+ </div>
63
+ );
64
+ }
@@ -0,0 +1,2 @@
1
+ export { DrawerActionBar } from './drawer-action-bar';
2
+ export type { DrawerActionBarProps } from './drawer-action-bar-config';
@@ -0,0 +1,10 @@
1
+ export interface DrawerRevisionInputProps {
2
+ /** Callback when user submits revision text */
3
+ onSubmit: (text: string) => void;
4
+ /** Placeholder text for the input */
5
+ placeholder?: string;
6
+ /** Accessible label for the input */
7
+ ariaLabel?: string;
8
+ /** Whether the input should be disabled */
9
+ disabled?: boolean;
10
+ }
@@ -0,0 +1,41 @@
1
+ 'use client';
2
+
3
+ import { useState } from 'react';
4
+ import { Send } from 'lucide-react';
5
+ import { Button } from '@/components/ui/button';
6
+ import { Input } from '@/components/ui/input';
7
+ import type { DrawerRevisionInputProps } from './drawer-revision-input-config';
8
+
9
+ export function DrawerRevisionInput({
10
+ onSubmit,
11
+ placeholder = 'Ask AI to revise...',
12
+ ariaLabel,
13
+ disabled = false,
14
+ }: DrawerRevisionInputProps) {
15
+ const [chatInput, setChatInput] = useState('');
16
+
17
+ function handleSubmit(e: { preventDefault: () => void }) {
18
+ e.preventDefault();
19
+ const text = chatInput.trim();
20
+ if (!text) return;
21
+ onSubmit(text);
22
+ setChatInput('');
23
+ }
24
+
25
+ return (
26
+ <form onSubmit={handleSubmit} className="flex items-center gap-2 p-4">
27
+ <Input
28
+ type="text"
29
+ placeholder={placeholder}
30
+ aria-label={ariaLabel ?? placeholder}
31
+ disabled={disabled}
32
+ value={chatInput}
33
+ onChange={(e) => setChatInput(e.target.value)}
34
+ className="flex-1"
35
+ />
36
+ <Button type="submit" variant="secondary" size="icon" aria-label="Send" disabled={disabled}>
37
+ <Send />
38
+ </Button>
39
+ </form>
40
+ );
41
+ }
@@ -0,0 +1,2 @@
1
+ export { DrawerRevisionInput } from './drawer-revision-input';
2
+ export type { DrawerRevisionInputProps } from './drawer-revision-input-config';
@@ -106,6 +106,16 @@ const allStatesData: FeatureNodeData[] = [
106
106
  repositoryPath: '/home/user/my-repo',
107
107
  branch: 'feat/data-pipeline',
108
108
  },
109
+ {
110
+ name: 'Merge Review',
111
+ description: 'PR ready for merge approval',
112
+ featureId: '#bi3',
113
+ lifecycle: 'review' as FeatureLifecyclePhase,
114
+ state: 'action-required',
115
+ progress: 90,
116
+ repositoryPath: '/home/user/my-repo',
117
+ branch: 'feat/merge-review',
118
+ },
109
119
  {
110
120
  name: 'Payment Gateway',
111
121
  description: 'Stripe integration for subscriptions',
@@ -145,7 +155,7 @@ export const AllStates: Story = {
145
155
  render: () => (
146
156
  <div className="flex flex-wrap gap-6">
147
157
  {allStatesData.map((data) => (
148
- <FeatureNodeCanvas key={data.state} style={{ width: 500, height: 350 }} data={data} />
158
+ <FeatureNodeCanvas key={data.featureId} style={{ width: 500, height: 350 }} data={data} />
149
159
  ))}
150
160
  </div>
151
161
  ),
@@ -316,6 +326,18 @@ export const Creating: Story = {
316
326
  render: (args) => <FeatureNodeCanvas data={args} />,
317
327
  };
318
328
 
329
+ export const MergeReviewActionRequired: Story = {
330
+ args: {
331
+ name: 'Merge Review',
332
+ description: 'PR ready for merge approval',
333
+ featureId: '#bi3',
334
+ lifecycle: 'review',
335
+ state: 'action-required',
336
+ progress: 90,
337
+ },
338
+ render: (args) => <FeatureNodeCanvas data={args} />,
339
+ };
340
+
319
341
  export const ErrorWithMessage: Story = {
320
342
  args: {
321
343
  name: 'Email Service',
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
 
3
3
  import { Handle, Position } from '@xyflow/react';
4
- import { Settings, Plus, FileText, Wrench, type LucideIcon } from 'lucide-react';
4
+ import { Settings, Plus, FileText, Wrench, GitMerge, type LucideIcon } from 'lucide-react';
5
5
  import { cn } from '@/lib/utils';
6
6
  import {
7
7
  featureNodeStateConfig,
@@ -21,6 +21,7 @@ function getBadgeIcon(data: FeatureNodeData): LucideIcon {
21
21
  if (data.state === 'action-required') {
22
22
  if (data.lifecycle === 'requirements') return FileText;
23
23
  if (data.lifecycle === 'implementation') return Wrench;
24
+ if (data.lifecycle === 'review') return GitMerge;
24
25
  }
25
26
  return config.icon;
26
27
  }
@@ -34,6 +35,9 @@ function getActionRequiredBadgeClasses(data: FeatureNodeData): {
34
35
  if (data.lifecycle === 'implementation') {
35
36
  return { badgeClass: 'text-indigo-700', badgeBgClass: 'bg-indigo-50' };
36
37
  }
38
+ if (data.lifecycle === 'review') {
39
+ return { badgeClass: 'text-emerald-700', badgeBgClass: 'bg-emerald-50' };
40
+ }
37
41
  return null; // requirements stays amber (default)
38
42
  }
39
43
 
@@ -51,6 +55,7 @@ function getBadgeText(data: FeatureNodeData): string {
51
55
  case 'action-required':
52
56
  if (data.lifecycle === 'requirements') return 'Review Product Requirements';
53
57
  if (data.lifecycle === 'implementation') return 'Review Technical Planning';
58
+ if (data.lifecycle === 'review') return 'Review Merge Request';
54
59
  return config.label;
55
60
  case 'error':
56
61
  return data.errorMessage ?? 'Something went wrong';
@@ -0,0 +1,7 @@
1
+ export { MergeReview } from './merge-review';
2
+ export { MergeReviewDrawer } from './merge-review-drawer';
3
+ export type {
4
+ MergeReviewProps,
5
+ MergeReviewDrawerProps,
6
+ MergeReviewData,
7
+ } from './merge-review-config';
@@ -0,0 +1,83 @@
1
+ import type { PrStatus, CiStatus } from '@shepai/core/domain/generated/output';
2
+
3
+ /** Diff summary statistics for the PR */
4
+ export interface MergeReviewDiffSummary {
5
+ filesChanged: number;
6
+ additions: number;
7
+ deletions: number;
8
+ commitCount: number;
9
+ }
10
+
11
+ /** PR metadata extracted from Feature.pr */
12
+ export interface MergeReviewPr {
13
+ url: string;
14
+ number: number;
15
+ status: PrStatus;
16
+ commitHash?: string;
17
+ ciStatus?: CiStatus;
18
+ }
19
+
20
+ /** A phase from the implementation plan */
21
+ export interface MergeReviewPhase {
22
+ id: string;
23
+ name: string;
24
+ description?: string;
25
+ }
26
+
27
+ /** Branch merge direction info */
28
+ export interface MergeReviewBranch {
29
+ /** Feature branch name */
30
+ source: string;
31
+ /** Target branch name (e.g. 'main') */
32
+ target: string;
33
+ }
34
+
35
+ /** Data returned by the getMergeReviewData server action */
36
+ export interface MergeReviewData {
37
+ /** PR metadata (omitted when the feature has no PR) */
38
+ pr?: MergeReviewPr;
39
+ /** Aggregate diff statistics (omitted when worktree is unavailable) */
40
+ diffSummary?: MergeReviewDiffSummary;
41
+ /** Implementation phases from plan.yaml */
42
+ phases?: MergeReviewPhase[];
43
+ /** Branch merge direction */
44
+ branch?: MergeReviewBranch;
45
+ /** Warning message when diff summary could not be retrieved */
46
+ warning?: string;
47
+ }
48
+
49
+ /** Props for the merge review content component */
50
+ export interface MergeReviewProps {
51
+ /** Merge review data from the server action */
52
+ data: MergeReviewData;
53
+ /** Approve merge callback */
54
+ onApprove: () => void;
55
+ /** Reject merge callback — opens feedback dialog when provided; also used for inline text rejection */
56
+ onReject?: (feedback: string) => void;
57
+ /** Controls disabled state during approval */
58
+ isProcessing?: boolean;
59
+ /** Whether a reject operation is in flight */
60
+ isRejecting?: boolean;
61
+ }
62
+
63
+ /** Props for the merge review drawer (shell wrapper) */
64
+ export interface MergeReviewDrawerProps extends MergeReviewProps {
65
+ /** Whether the drawer is open */
66
+ open: boolean;
67
+ /** Callback when drawer should close */
68
+ onClose: () => void;
69
+ /** Feature name shown in drawer header */
70
+ featureName: string;
71
+ /** Feature ID shown below the name */
72
+ featureId?: string;
73
+ /** Absolute path to the repository on disk */
74
+ repositoryPath?: string;
75
+ /** Git branch name — passed to ReviewDrawerShell for actions */
76
+ branch?: string;
77
+ /** Absolute path to the specs folder on disk */
78
+ specPath?: string;
79
+ /** Callback to delete the feature — shows delete button when provided */
80
+ onDelete?: (featureId: string) => void;
81
+ /** Whether a delete operation is in progress */
82
+ isDeleting?: boolean;
83
+ }