@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
@@ -25,6 +25,47 @@ let GitPrService = class GitPrService {
25
25
  constructor(execFile) {
26
26
  this.execFile = execFile;
27
27
  }
28
+ async hasRemote(cwd) {
29
+ const { stdout } = await this.execFile('git', ['remote'], { cwd });
30
+ return stdout.trim().length > 0;
31
+ }
32
+ async getDefaultBranch(cwd) {
33
+ // 1. Try remote HEAD reference (most reliable when remote exists)
34
+ try {
35
+ const { stdout } = await this.execFile('git', ['symbolic-ref', 'refs/remotes/origin/HEAD'], {
36
+ cwd,
37
+ });
38
+ const ref = stdout.trim(); // e.g. "refs/remotes/origin/main"
39
+ if (ref)
40
+ return ref.replace('refs/remotes/origin/', '');
41
+ }
42
+ catch {
43
+ // No remote HEAD configured — continue to fallbacks
44
+ }
45
+ // 2. Check for common default branch names locally
46
+ for (const candidate of ['main', 'master']) {
47
+ try {
48
+ const { stdout } = await this.execFile('git', ['rev-parse', '--verify', `refs/heads/${candidate}`], { cwd });
49
+ if (stdout.trim())
50
+ return candidate;
51
+ }
52
+ catch {
53
+ // Branch doesn't exist — try next
54
+ }
55
+ }
56
+ // 3. Fall back to current branch (works for single-branch / fresh repos)
57
+ try {
58
+ const { stdout } = await this.execFile('git', ['symbolic-ref', '--short', 'HEAD'], { cwd });
59
+ const branch = stdout.trim();
60
+ if (branch)
61
+ return branch;
62
+ }
63
+ catch {
64
+ // Detached HEAD — continue
65
+ }
66
+ // 4. Ultimate fallback
67
+ return 'main';
68
+ }
28
69
  async hasUncommittedChanges(cwd) {
29
70
  const { stdout } = await this.execFile('git', ['status', '--porcelain'], { cwd });
30
71
  return stdout.trim().length > 0;
@@ -17,11 +17,12 @@ export type ExecFunction = (file: string, args: string[], options?: object) => P
17
17
  export declare class WorktreeService implements IWorktreeService {
18
18
  private readonly execFile;
19
19
  constructor(execFile: ExecFunction);
20
- create(repoPath: string, branch: string, worktreePath: string): Promise<WorktreeInfo>;
20
+ create(repoPath: string, branch: string, worktreePath: string, startPoint?: string): Promise<WorktreeInfo>;
21
21
  remove(worktreePath: string): Promise<void>;
22
22
  list(repoPath: string): Promise<WorktreeInfo[]>;
23
23
  exists(repoPath: string, branch: string): Promise<boolean>;
24
24
  branchExists(repoPath: string, branch: string): Promise<boolean>;
25
+ ensureGitRepository(repoPath: string): Promise<void>;
25
26
  getWorktreePath(repoPath: string, branch: string): string;
26
27
  private parseWorktreeOutput;
27
28
  private parseGitError;
@@ -1 +1 @@
1
- {"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAOlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqBrF,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtE,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAU9B"}
1
+ {"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAOlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAqBlB,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB1D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAU9B"}
@@ -18,8 +18,11 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
18
18
  return function (target, key) { decorator(target, key, paramIndex); }
19
19
  };
20
20
  import { createHash } from 'node:crypto';
21
+ import { mkdirSync } from 'node:fs';
21
22
  import path from 'node:path';
22
23
  import { injectable, inject } from 'tsyringe';
24
+ const GIT_AUTO_INIT_USER = 'shep-ai[bot]';
25
+ const GIT_AUTO_INIT_EMAIL = 'bot@shep.bot';
23
26
  import { WorktreeError, WorktreeErrorCode, } from '../../../application/ports/output/services/worktree-service.interface.js';
24
27
  import { getShepHomeDir } from '../filesystem/shep-directory.service.js';
25
28
  let WorktreeService = class WorktreeService {
@@ -27,11 +30,12 @@ let WorktreeService = class WorktreeService {
27
30
  constructor(execFile) {
28
31
  this.execFile = execFile;
29
32
  }
30
- async create(repoPath, branch, worktreePath) {
33
+ async create(repoPath, branch, worktreePath, startPoint) {
31
34
  try {
32
- await this.execFile('git', ['worktree', 'add', worktreePath, '-b', branch], {
33
- cwd: repoPath,
34
- });
35
+ const args = ['worktree', 'add', worktreePath, '-b', branch];
36
+ if (startPoint)
37
+ args.push(startPoint);
38
+ await this.execFile('git', args, { cwd: repoPath });
35
39
  }
36
40
  catch (error) {
37
41
  throw this.parseGitError(error);
@@ -73,6 +77,27 @@ let WorktreeService = class WorktreeService {
73
77
  return false;
74
78
  }
75
79
  }
80
+ async ensureGitRepository(repoPath) {
81
+ try {
82
+ await this.execFile('git', ['rev-parse', '--is-inside-work-tree'], { cwd: repoPath });
83
+ return; // Already a git repo
84
+ }
85
+ catch {
86
+ // Not a git repo — initialize it
87
+ }
88
+ try {
89
+ mkdirSync(repoPath, { recursive: true });
90
+ await this.execFile('git', ['init'], { cwd: repoPath });
91
+ await this.execFile('git', ['config', 'user.name', GIT_AUTO_INIT_USER], { cwd: repoPath });
92
+ await this.execFile('git', ['config', 'user.email', GIT_AUTO_INIT_EMAIL], { cwd: repoPath });
93
+ await this.execFile('git', ['commit', '--allow-empty', '-m', 'Initial commit'], {
94
+ cwd: repoPath,
95
+ });
96
+ }
97
+ catch (error) {
98
+ throw this.parseGitError(error);
99
+ }
100
+ }
76
101
  getWorktreePath(repoPath, branch) {
77
102
  const repoHash = createHash('sha256').update(repoPath).digest('hex').slice(0, 16);
78
103
  const slug = branch.replace(/\//g, '-');
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/ui/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH;;GAEG;AACH,eAAO,MAAM,QAAQ;IACnB;;;;OAIG;6BACa,MAAM,KAAG,IAAI;IAI7B;;;;;;OAMG;2BACW,MAAM,UAAU,KAAK,KAAG,IAAI;IAY1C;;;;OAIG;6BACa,MAAM,KAAG,IAAI;IAI7B;;;;OAIG;0BACU,MAAM,KAAG,IAAI;IAI1B;;;;OAIG;2BACW,MAAM,KAAG,IAAI;IAM3B;;OAEG;4BACU,IAAI;IAIjB;;OAEG;yBACS,MAAM,KAAG,IAAI;CAGjB,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/ui/messages.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH;;GAEG;AACH,eAAO,MAAM,QAAQ;IACnB;;;;OAIG;6BACa,MAAM,KAAG,IAAI;IAI7B;;;;;;OAMG;2BACW,MAAM,UAAU,KAAK,KAAG,IAAI;IAO1C;;;;OAIG;6BACa,MAAM,KAAG,IAAI;IAI7B;;;;OAIG;0BACU,MAAM,KAAG,IAAI;IAI1B;;;;OAIG;2BACW,MAAM,KAAG,IAAI;IAM3B;;OAEG;4BACU,IAAI;IAIjB;;OAEG;yBACS,MAAM,KAAG,IAAI;CAGjB,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,OAAO,QAAQ,CAAC"}
@@ -32,13 +32,7 @@ export const messages = {
32
32
  error: (text, error) => {
33
33
  console.error(colors.error(`${symbols.error} ${text}`));
34
34
  if (error) {
35
- // Show full stack in debug mode, otherwise just the message
36
- if (process.env.DEBUG) {
37
- console.error(colors.muted(error.stack ?? error.message));
38
- }
39
- else {
40
- console.error(colors.muted(error.message));
41
- }
35
+ console.error(colors.muted(error.stack ?? error.message));
42
36
  }
43
37
  },
44
38
  /**
@@ -1,4 +1,5 @@
1
- export declare function approveFeature(featureId: string): Promise<{
1
+ import type { PrdApprovalPayload } from '../../../../../packages/core/src/domain/generated/output.js';
2
+ export declare function approveFeature(featureId: string, payload?: PrdApprovalPayload): Promise<{
2
3
  approved: boolean;
3
4
  error?: string;
4
5
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"approve-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/approve-feature.ts"],"names":[],"mappings":"AAMA,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BhD"}
1
+ {"version":3,"file":"approve-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/approve-feature.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAE/E,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA6BhD"}
@@ -1,6 +1,6 @@
1
1
  'use server';
2
2
  import { resolve } from '../../lib/server-container.js';
3
- export async function approveFeature(featureId) {
3
+ export async function approveFeature(featureId, payload) {
4
4
  if (!featureId.trim()) {
5
5
  return { approved: false, error: 'Feature id is required' };
6
6
  }
@@ -14,7 +14,7 @@ export async function approveFeature(featureId) {
14
14
  return { approved: false, error: 'Feature has no agent run' };
15
15
  }
16
16
  const approveUseCase = resolve('ApproveAgentRunUseCase');
17
- const result = await approveUseCase.execute(feature.agentRunId);
17
+ const result = await approveUseCase.execute(feature.agentRunId, payload);
18
18
  if (!result.approved) {
19
19
  return { approved: false, error: result.reason };
20
20
  }
@@ -0,0 +1,7 @@
1
+ import type { MergeReviewData } from '../../components/common/merge-review/merge-review-config.js';
2
+ type GetMergeReviewDataResult = MergeReviewData | {
3
+ error: string;
4
+ };
5
+ export declare function getMergeReviewData(featureId: string): Promise<GetMergeReviewDataResult>;
6
+ export {};
7
+ //# sourceMappingURL=get-merge-review-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-merge-review-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-merge-review-data.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,eAAe,EAEhB,MAAM,sDAAsD,CAAC;AAE9D,KAAK,wBAAwB,GAAG,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpE,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAkD7F"}
@@ -0,0 +1,49 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function getMergeReviewData(featureId) {
4
+ if (!featureId.trim()) {
5
+ return { error: 'Feature id is required' };
6
+ }
7
+ try {
8
+ const featureRepo = resolve('IFeatureRepository');
9
+ const feature = await featureRepo.findById(featureId);
10
+ if (!feature) {
11
+ return { error: 'Feature not found' };
12
+ }
13
+ const pr = feature.pr
14
+ ? {
15
+ url: feature.pr.url,
16
+ number: feature.pr.number,
17
+ status: feature.pr.status,
18
+ commitHash: feature.pr.commitHash,
19
+ ciStatus: feature.pr.ciStatus,
20
+ }
21
+ : undefined;
22
+ const branch = feature.branch ? { source: feature.branch, target: 'main' } : undefined;
23
+ // Load plan phases (best-effort)
24
+ let phases;
25
+ try {
26
+ const planUseCase = resolve('GetPlanArtifactUseCase');
27
+ const plan = await planUseCase.execute(featureId);
28
+ phases = plan.phases.map(({ id, name, description }) => ({ id, name, description }));
29
+ }
30
+ catch {
31
+ // Plan unavailable — not critical
32
+ }
33
+ if (!feature.worktreePath) {
34
+ return { pr, branch, phases, warning: pr ? undefined : 'No PR or diff data available' };
35
+ }
36
+ try {
37
+ const gitPrService = resolve('IGitPrService');
38
+ const diffSummary = await gitPrService.getPrDiffSummary(feature.worktreePath, 'main');
39
+ return { pr, branch, phases, diffSummary };
40
+ }
41
+ catch {
42
+ return { pr, branch, phases, warning: 'Diff statistics unavailable' };
43
+ }
44
+ }
45
+ catch (error) {
46
+ const message = error instanceof Error ? error.message : 'Failed to load merge review data';
47
+ return { error: message };
48
+ }
49
+ }
@@ -0,0 +1,7 @@
1
+ export declare function rejectFeature(featureId: string, feedback: string): Promise<{
2
+ rejected: boolean;
3
+ iteration?: number;
4
+ iterationWarning?: boolean;
5
+ error?: string;
6
+ }>;
7
+ //# sourceMappingURL=reject-feature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reject-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/reject-feature.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IACT,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAqCD"}
@@ -0,0 +1,34 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function rejectFeature(featureId, feedback) {
4
+ if (!featureId.trim()) {
5
+ return { rejected: false, error: 'Feature id is required' };
6
+ }
7
+ if (!feedback.trim()) {
8
+ return { rejected: false, error: 'Feedback is required' };
9
+ }
10
+ try {
11
+ const featureRepo = resolve('IFeatureRepository');
12
+ const feature = await featureRepo.findById(featureId);
13
+ if (!feature) {
14
+ return { rejected: false, error: 'Feature not found' };
15
+ }
16
+ if (!feature.agentRunId) {
17
+ return { rejected: false, error: 'Feature has no agent run' };
18
+ }
19
+ const rejectUseCase = resolve('RejectAgentRunUseCase');
20
+ const result = await rejectUseCase.execute(feature.agentRunId, feedback);
21
+ if (!result.rejected) {
22
+ return { rejected: false, error: result.reason };
23
+ }
24
+ return {
25
+ rejected: true,
26
+ iteration: result.iteration,
27
+ iterationWarning: result.iterationWarning,
28
+ };
29
+ }
30
+ catch (error) {
31
+ const message = error instanceof Error ? error.message : 'Failed to reject feature';
32
+ return { rejected: false, error: message };
33
+ }
34
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/page.tsx"],"names":[],"mappings":"AAcA,uFAAuF;AACvF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAqBvC,wBAA8B,QAAQ,qDAwHrC"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/page.tsx"],"names":[],"mappings":"AAcA,uFAAuF;AACvF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAsBvC,wBAA8B,QAAQ,qDAwHrC"}
@@ -21,6 +21,7 @@ const nodeToLifecyclePhase = {
21
21
  research: 'research',
22
22
  plan: 'implementation',
23
23
  implement: 'implementation',
24
+ merge: 'review',
24
25
  };
25
26
  export default async function HomePage() {
26
27
  const listFeatures = resolve('ListFeaturesUseCase');
@@ -0,0 +1,24 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface DrawerActionBarProps {
3
+ /** Callback when user rejects with feedback (inline input or dialog) */
4
+ onReject?: (feedback: string) => void;
5
+ /** Callback when user approves */
6
+ onApprove: () => void;
7
+ /** Label for the approve button */
8
+ approveLabel: string;
9
+ /** Icon element for the approve button */
10
+ approveIcon?: ReactNode;
11
+ /** Placeholder for the inline revision input */
12
+ revisionPlaceholder?: string;
13
+ /** Title for the reject feedback dialog */
14
+ rejectDialogTitle?: string;
15
+ /** Whether an approval/processing operation is in flight */
16
+ isProcessing?: boolean;
17
+ /** Whether a reject operation is in flight */
18
+ isRejecting?: boolean;
19
+ /** Whether to show the reject button (defaults to true when onReject is provided) */
20
+ showRejectButton?: boolean;
21
+ /** Content rendered between revision input and action buttons (e.g. progress bar) */
22
+ children?: ReactNode;
23
+ }
24
+ //# sourceMappingURL=drawer-action-bar-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer-action-bar-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACtC,kCAAkC;IAClC,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,gDAAgD;IAChD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2CAA2C;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,8CAA8C;IAC9C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qFAAqF;IACrF,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,qFAAqF;IACrF,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB"}
@@ -0,0 +1,3 @@
1
+ import type { DrawerActionBarProps } from './drawer-action-bar-config.js';
2
+ export declare function DrawerActionBar({ onReject, onApprove, approveLabel, approveIcon, revisionPlaceholder, rejectDialogTitle, isProcessing, isRejecting, showRejectButton, children, }: DrawerActionBarProps): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=drawer-action-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer-action-bar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,iBAAiB,EACjB,YAAoB,EACpB,WAAmB,EACnB,gBAAuB,EACvB,QAAQ,GACT,EAAE,oBAAoB,2CA2CtB"}
@@ -0,0 +1,12 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { X } from 'lucide-react';
5
+ import { Button } from '../../ui/button.js';
6
+ import { RejectFeedbackDialog } from '../../common/reject-feedback-dialog/index.js';
7
+ import { DrawerRevisionInput } from '../../common/drawer-revision-input/index.js';
8
+ export function DrawerActionBar({ onReject, onApprove, approveLabel, approveIcon, revisionPlaceholder, rejectDialogTitle, isProcessing = false, isRejecting = false, showRejectButton = true, children, }) {
9
+ const [rejectDialogOpen, setRejectDialogOpen] = useState(false);
10
+ const disabled = isProcessing || isRejecting;
11
+ return (_jsxs("div", { className: "border-border shrink-0 border-t", children: [children, onReject ? (_jsx(DrawerRevisionInput, { onSubmit: onReject, placeholder: revisionPlaceholder, disabled: disabled || !onReject })) : null, _jsxs("div", { className: "flex items-center gap-2 px-4 pb-4", children: [onReject && showRejectButton ? (_jsxs(_Fragment, { children: [_jsxs(Button, { type: "button", variant: "outline", className: "text-destructive hover:text-destructive", disabled: disabled, onClick: () => setRejectDialogOpen(true), children: [_jsx(X, { className: "mr-1.5 h-4 w-4" }), "Reject"] }), _jsx(RejectFeedbackDialog, { open: rejectDialogOpen, onOpenChange: setRejectDialogOpen, onConfirm: onReject, isSubmitting: isRejecting, title: rejectDialogTitle })] })) : null, _jsxs(Button, { type: "button", className: "flex-1", disabled: disabled, onClick: onApprove, children: [approveIcon, approveLabel] })] })] }));
12
+ }
@@ -0,0 +1,3 @@
1
+ export { DrawerActionBar } from './drawer-action-bar.js';
2
+ export type { DrawerActionBarProps } from './drawer-action-bar-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/drawer-action-bar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1 @@
1
+ export { DrawerActionBar } from './drawer-action-bar.js';
@@ -0,0 +1,11 @@
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
+ }
11
+ //# sourceMappingURL=drawer-revision-input-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer-revision-input-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-revision-input/drawer-revision-input-config.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,wBAAwB;IACvC,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
@@ -0,0 +1,3 @@
1
+ import type { DrawerRevisionInputProps } from './drawer-revision-input-config.js';
2
+ export declare function DrawerRevisionInput({ onSubmit, placeholder, ariaLabel, disabled, }: DrawerRevisionInputProps): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=drawer-revision-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drawer-revision-input.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/drawer-revision-input/drawer-revision-input.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE/E,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,WAAmC,EACnC,SAAS,EACT,QAAgB,GACjB,EAAE,wBAAwB,2CA2B1B"}
@@ -0,0 +1,18 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { Send } from 'lucide-react';
5
+ import { Button } from '../../ui/button.js';
6
+ import { Input } from '../../ui/input.js';
7
+ export function DrawerRevisionInput({ onSubmit, placeholder = 'Ask AI to revise...', ariaLabel, disabled = false, }) {
8
+ const [chatInput, setChatInput] = useState('');
9
+ function handleSubmit(e) {
10
+ e.preventDefault();
11
+ const text = chatInput.trim();
12
+ if (!text)
13
+ return;
14
+ onSubmit(text);
15
+ setChatInput('');
16
+ }
17
+ return (_jsxs("form", { onSubmit: handleSubmit, className: "flex items-center gap-2 p-4", children: [_jsx(Input, { type: "text", placeholder: placeholder, "aria-label": ariaLabel ?? placeholder, disabled: disabled, value: chatInput, onChange: (e) => setChatInput(e.target.value), className: "flex-1" }), _jsx(Button, { type: "submit", variant: "secondary", size: "icon", "aria-label": "Send", disabled: disabled, children: _jsx(Send, {}) })] }));
18
+ }
@@ -0,0 +1,3 @@
1
+ export { DrawerRevisionInput } from './drawer-revision-input.js';
2
+ export type { DrawerRevisionInputProps } from './drawer-revision-input-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/drawer-revision-input/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1 @@
1
+ export { DrawerRevisionInput } from './drawer-revision-input.js';
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAmDnE,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CA4KA"}
1
+ {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAwDnE,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CA4KA"}
@@ -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 { Settings, Plus, FileText, Wrench } from 'lucide-react';
4
+ import { Settings, Plus, FileText, Wrench, GitMerge } from 'lucide-react';
5
5
  import { cn } from '../../../lib/utils.js';
6
6
  import { featureNodeStateConfig, lifecycleDisplayLabels, lifecycleRunningVerbs, } from './feature-node-state-config.js';
7
7
  import { getAgentTypeIcon } from './agent-type-icons.js';
@@ -16,6 +16,8 @@ function getBadgeIcon(data) {
16
16
  return FileText;
17
17
  if (data.lifecycle === 'implementation')
18
18
  return Wrench;
19
+ if (data.lifecycle === 'review')
20
+ return GitMerge;
19
21
  }
20
22
  return config.icon;
21
23
  }
@@ -26,6 +28,9 @@ function getActionRequiredBadgeClasses(data) {
26
28
  if (data.lifecycle === 'implementation') {
27
29
  return { badgeClass: 'text-indigo-700', badgeBgClass: 'bg-indigo-50' };
28
30
  }
31
+ if (data.lifecycle === 'review') {
32
+ return { badgeClass: 'text-emerald-700', badgeBgClass: 'bg-emerald-50' };
33
+ }
29
34
  return null; // requirements stays amber (default)
30
35
  }
31
36
  function getBadgeText(data) {
@@ -44,6 +49,8 @@ function getBadgeText(data) {
44
49
  return 'Review Product Requirements';
45
50
  if (data.lifecycle === 'implementation')
46
51
  return 'Review Technical Planning';
52
+ if (data.lifecycle === 'review')
53
+ return 'Review Merge Request';
47
54
  return config.label;
48
55
  case 'error':
49
56
  return data.errorMessage ?? 'Something went wrong';
@@ -12,6 +12,7 @@ export declare const LongContent: Story;
12
12
  export declare const DoneWithRuntime: Story;
13
13
  export declare const BlockedByFeature: Story;
14
14
  export declare const Creating: Story;
15
+ export declare const MergeReviewActionRequired: Story;
15
16
  export declare const ErrorWithMessage: Story;
16
17
  export declare const Interactive: Story;
17
18
  //# sourceMappingURL=feature-node.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAKvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAiCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAc/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AA8EF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAWF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AAsEF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC"}
1
+ {"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAKvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAiCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAc/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAwFF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAWF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AAsEF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAUvC,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC"}
@@ -69,6 +69,16 @@ const allStatesData = [
69
69
  repositoryPath: '/home/user/my-repo',
70
70
  branch: 'feat/data-pipeline',
71
71
  },
72
+ {
73
+ name: 'Merge Review',
74
+ description: 'PR ready for merge approval',
75
+ featureId: '#bi3',
76
+ lifecycle: 'review',
77
+ state: 'action-required',
78
+ progress: 90,
79
+ repositoryPath: '/home/user/my-repo',
80
+ branch: 'feat/merge-review',
81
+ },
72
82
  {
73
83
  name: 'Payment Gateway',
74
84
  description: 'Stripe integration for subscriptions',
@@ -104,7 +114,7 @@ const allStatesData = [
104
114
  },
105
115
  ];
106
116
  export const AllStates = {
107
- render: () => (_jsx("div", { className: "flex flex-wrap gap-6", children: allStatesData.map((data) => (_jsx(FeatureNodeCanvas, { style: { width: 500, height: 350 }, data: data }, data.state))) })),
117
+ render: () => (_jsx("div", { className: "flex flex-wrap gap-6", children: allStatesData.map((data) => (_jsx(FeatureNodeCanvas, { style: { width: 500, height: 350 }, data: data }, data.featureId))) })),
108
118
  };
109
119
  const allLifecycles = [
110
120
  'requirements',
@@ -245,6 +255,17 @@ export const Creating = {
245
255
  },
246
256
  render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
247
257
  };
258
+ export const MergeReviewActionRequired = {
259
+ args: {
260
+ name: 'Merge Review',
261
+ description: 'PR ready for merge approval',
262
+ featureId: '#bi3',
263
+ lifecycle: 'review',
264
+ state: 'action-required',
265
+ progress: 90,
266
+ },
267
+ render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
268
+ };
248
269
  export const ErrorWithMessage = {
249
270
  args: {
250
271
  name: 'Email Service',
@@ -0,0 +1,4 @@
1
+ export { MergeReview } from './merge-review.js';
2
+ export { MergeReviewDrawer } from './merge-review-drawer.js';
3
+ export type { MergeReviewProps, MergeReviewDrawerProps, MergeReviewData, } from './merge-review-config.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,eAAe,GAChB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { MergeReview } from './merge-review.js';
2
+ export { MergeReviewDrawer } from './merge-review-drawer.js';