@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.
- package/apis/json-schema/ApprovalGateDefaults.yaml +26 -0
- package/apis/json-schema/Feature.yaml +3 -0
- package/apis/json-schema/Repository.yaml +16 -0
- package/apis/json-schema/Settings.yaml +5 -0
- package/apis/json-schema/WorkflowConfig.yaml +4 -20
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +17 -0
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/worktree-service.interface.d.ts +11 -1
- package/dist/packages/core/src/application/ports/output/services/worktree-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +3 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +11 -4
- package/dist/packages/core/src/application/use-cases/features/get-plan-artifact.use-case.d.ts +19 -0
- package/dist/packages/core/src/application/use-cases/features/get-plan-artifact.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/get-plan-artifact.use-case.js +52 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +8 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +2 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.d.ts +2 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge.node.js +66 -30
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +15 -7
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +2 -0
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +41 -0
- package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +29 -4
- package/dist/src/presentation/cli/ui/messages.d.ts.map +1 -1
- package/dist/src/presentation/cli/ui/messages.js +1 -7
- package/dist/src/presentation/web/app/actions/approve-feature.d.ts +2 -1
- package/dist/src/presentation/web/app/actions/approve-feature.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/approve-feature.js +2 -2
- package/dist/src/presentation/web/app/actions/get-merge-review-data.d.ts +7 -0
- package/dist/src/presentation/web/app/actions/get-merge-review-data.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-merge-review-data.js +49 -0
- package/dist/src/presentation/web/app/actions/reject-feature.d.ts +7 -0
- package/dist/src/presentation/web/app/actions/reject-feature.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/reject-feature.js +34 -0
- package/dist/src/presentation/web/app/page.d.ts.map +1 -1
- package/dist/src/presentation/web/app/page.js +1 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.d.ts +24 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.js +1 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts +3 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.js +12 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/drawer-action-bar/index.js +1 -0
- package/dist/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input-config.d.ts +11 -0
- package/dist/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input-config.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input-config.js +1 -0
- package/dist/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input.d.ts +3 -0
- package/dist/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input.js +18 -0
- package/dist/src/presentation/web/components/common/drawer-revision-input/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/drawer-revision-input/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/drawer-revision-input/index.js +1 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +8 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +22 -1
- package/dist/src/presentation/web/components/common/merge-review/index.d.ts +4 -0
- package/dist/src/presentation/web/components/common/merge-review/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/merge-review/index.js +2 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts +77 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review-config.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review-config.js +1 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.d.ts +3 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.js +7 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts +3 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review.js +25 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +32 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +165 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts +4 -2
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +6 -15
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +4 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +24 -3
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/index.js +1 -0
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog-config.d.ts +9 -0
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog-config.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog-config.js +1 -0
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.d.ts +3 -0
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.js +19 -0
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.stories.d.ts +14 -0
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.stories.js +46 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.d.ts +4 -2
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.js +4 -14
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts +4 -0
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +24 -6
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +88 -19
- package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +15 -0
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +37 -15
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/cache/.previewinfo +1 -1
- package/web/.next/cache/.rscinfo +1 -1
- package/web/.next/cache/.tsbuildinfo +1 -1
- package/web/.next/cache/config.json +3 -3
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/page/server-reference-manifest.json +54 -24
- package/web/.next/server/app/page.js +2 -1
- package/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +4 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js +9 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d8fbe735._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d8fbe735._.js.map +1 -0
- package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/_3ac3601c._.js → server/chunks/ssr/_1fafa9db._.js} +2 -2
- package/web/.next/server/chunks/ssr/_1fafa9db._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
- package/web/.next/server/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +55 -25
- package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
- package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
- package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
- package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +54 -24
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +2 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__03a0dba7._.js +4 -4
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__2d1a8e37._.js +9 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__d8fbe735._.js +3 -0
- package/web/.next/{server/chunks/ssr/_3ac3601c._.js → standalone/src/presentation/web/.next/server/chunks/ssr/_1fafa9db._.js} +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +55 -25
- package/web/.next/standalone/src/presentation/web/app/actions/approve-feature.ts +4 -2
- package/web/.next/standalone/src/presentation/web/app/actions/get-merge-review-data.ts +64 -0
- package/web/.next/standalone/src/presentation/web/app/actions/reject-feature.ts +52 -0
- package/web/.next/standalone/src/presentation/web/app/page.tsx +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar-config.ts +24 -0
- package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/drawer-action-bar.tsx +64 -0
- package/web/.next/standalone/src/presentation/web/components/common/drawer-action-bar/index.ts +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input-config.ts +10 -0
- package/web/.next/standalone/src/presentation/web/components/common/drawer-revision-input/drawer-revision-input.tsx +41 -0
- package/web/.next/standalone/src/presentation/web/components/common/drawer-revision-input/index.ts +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.stories.tsx +23 -1
- package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.tsx +6 -1
- package/web/.next/standalone/src/presentation/web/components/common/merge-review/index.ts +7 -0
- package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review-config.ts +83 -0
- package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review-drawer.tsx +34 -0
- package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.stories.tsx +240 -0
- package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.tsx +223 -0
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-config.ts +4 -2
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.tsx +36 -8
- package/web/.next/standalone/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.tsx +16 -47
- package/web/.next/standalone/src/presentation/web/components/common/reject-feedback-dialog/index.ts +2 -0
- package/web/.next/standalone/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog-config.ts +8 -0
- package/web/.next/standalone/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.stories.tsx +63 -0
- package/web/.next/standalone/src/presentation/web/components/common/reject-feedback-dialog/reject-feedback-dialog.tsx +78 -0
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review-config.ts +4 -2
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.tsx +27 -6
- package/web/.next/standalone/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.tsx +14 -42
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +157 -31
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center.stories.tsx +15 -0
- package/web/.next/standalone/src/presentation/web/components/features/control-center/use-control-center-state.ts +47 -17
- package/web/.next/standalone/src/presentation/web/server.js +1 -1
- package/web/.next/static/chunks/{9f8e71029fb04681.js → 0da7a9860fa6ae05.js} +2 -2
- package/web/.next/static/chunks/191ca1529c9868dd.js +10 -0
- package/web/.next/static/chunks/22f30ce91a3c79c1.js +1 -0
- package/web/.next/static/chunks/59b8bd47023e0249.css +2 -0
- package/web/.next/trace +1 -1
- package/web/.next/trace-build +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d6d75c22._.js +0 -9
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d6d75c22._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_3ac3601c._.js.map +0 -1
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__d6d75c22._.js +0 -9
- package/web/.next/static/chunks/779c99975c85389e.js +0 -10
- package/web/.next/static/chunks/83ff3b6bbee54bce.js +0 -1
- package/web/.next/static/chunks/b7b7abe79e05b229.css +0 -2
- /package/web/.next/static/{wQ3vPV9I8JeacVNyp4HFg → UT60KjU8SOYIjqeqo2WT-}/_buildManifest.js +0 -0
- /package/web/.next/static/{wQ3vPV9I8JeacVNyp4HFg → UT60KjU8SOYIjqeqo2WT-}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{wQ3vPV9I8JeacVNyp4HFg → UT60KjU8SOYIjqeqo2WT-}/_ssgManifest.js +0 -0
package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"node": {
|
|
3
|
-
"
|
|
3
|
+
"60725e6edd6c9743fb7fa2acdedba221ea99a22c99": {
|
|
4
4
|
"workers": {
|
|
5
5
|
"app/page": {
|
|
6
|
-
"moduleId":
|
|
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
|
-
"
|
|
18
|
+
"605e21808f0e88d6e49558246e7498db1a31108458": {
|
|
19
19
|
"workers": {
|
|
20
20
|
"app/page": {
|
|
21
|
-
"moduleId":
|
|
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
|
-
"
|
|
48
|
+
"40c39d9f141368b3a789ccd8a1818bbb0fc304657e": {
|
|
34
49
|
"workers": {
|
|
35
50
|
"app/page": {
|
|
36
|
-
"moduleId":
|
|
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
|
-
"
|
|
63
|
+
"0094559528ecdb02319480522b15f2b0fbabf70de0": {
|
|
49
64
|
"workers": {
|
|
50
65
|
"app/page": {
|
|
51
|
-
"moduleId":
|
|
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
|
-
"
|
|
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":
|
|
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
|
-
"
|
|
108
|
+
"4049e6f8ecdd0b75842cf02b8ac52a8157bebc0142": {
|
|
79
109
|
"workers": {
|
|
80
110
|
"app/page": {
|
|
81
|
-
"moduleId":
|
|
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
|
-
"
|
|
123
|
+
"407c4c1533c9b75110ad59cefcdabb70ac5b5401b3": {
|
|
94
124
|
"workers": {
|
|
95
125
|
"app/page": {
|
|
96
|
-
"moduleId":
|
|
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
|
-
"
|
|
138
|
+
"005600d5f26056661789ce94bb1f2138a1be4b514d": {
|
|
109
139
|
"workers": {
|
|
110
140
|
"app/page": {
|
|
111
|
-
"moduleId":
|
|
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
|
-
"
|
|
153
|
+
"402ca918bcfe848cb370fc9398dd4822598236b08b": {
|
|
124
154
|
"workers": {
|
|
125
155
|
"app/page": {
|
|
126
|
-
"moduleId":
|
|
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
|
-
"
|
|
168
|
+
"406ebd5e8423afbbb122410891f7083f04e7932897": {
|
|
139
169
|
"workers": {
|
|
140
170
|
"app/page": {
|
|
141
|
-
"moduleId":
|
|
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
|
-
"
|
|
183
|
+
"409b87593fd7e237b4bb51d81f1b3f1465df6b8efc": {
|
|
154
184
|
"workers": {
|
|
155
185
|
"app/page": {
|
|
156
|
-
"moduleId":
|
|
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
|
-
"
|
|
198
|
+
"4002db4a13cd5cd14cc6f0bfd87a9b1e38cb990411": {
|
|
169
199
|
"workers": {
|
|
170
200
|
"app/page": {
|
|
171
|
-
"moduleId":
|
|
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": "
|
|
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
|
+
}
|
|
@@ -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,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
|
+
}
|
|
@@ -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.
|
|
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',
|
package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node.tsx
CHANGED
|
@@ -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,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
|
+
}
|