@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
|
@@ -3,18 +3,26 @@
|
|
|
3
3
|
import { useCallback, useEffect, useState } from 'react';
|
|
4
4
|
import type { Edge } from '@xyflow/react';
|
|
5
5
|
import { toast } from 'sonner';
|
|
6
|
+
import type {
|
|
7
|
+
PrdApprovalPayload,
|
|
8
|
+
QuestionSelectionChange,
|
|
9
|
+
} from '@shepai/core/domain/generated/output';
|
|
6
10
|
import { approveFeature } from '@/app/actions/approve-feature';
|
|
11
|
+
import { rejectFeature } from '@/app/actions/reject-feature';
|
|
7
12
|
import { getFeatureArtifact } from '@/app/actions/get-feature-artifact';
|
|
8
13
|
import { getResearchArtifact } from '@/app/actions/get-research-artifact';
|
|
9
14
|
import { getWorkflowDefaults } from '@/app/actions/get-workflow-defaults';
|
|
10
15
|
import type { WorkflowDefaults } from '@/app/actions/get-workflow-defaults';
|
|
16
|
+
import { getMergeReviewData } from '@/app/actions/get-merge-review-data';
|
|
11
17
|
import type { TechDecisionsReviewData } from '@/components/common/tech-decisions-review';
|
|
18
|
+
import type { MergeReviewData } from '@/components/common/merge-review';
|
|
12
19
|
import { FeaturesCanvas } from '@/components/features/features-canvas';
|
|
13
20
|
import type { CanvasNodeType } from '@/components/features/features-canvas';
|
|
14
21
|
import { FeatureDrawer, FeatureCreateDrawer } from '@/components/common';
|
|
15
22
|
import { PrdQuestionnaireDrawer } from '@/components/common/prd-questionnaire';
|
|
16
23
|
import type { PrdQuestionnaireData } from '@/components/common/prd-questionnaire';
|
|
17
24
|
import { TechDecisionsDrawer } from '@/components/common/tech-decisions-review';
|
|
25
|
+
import { MergeReviewDrawer } from '@/components/common/merge-review';
|
|
18
26
|
import { NotificationPermissionBanner } from '@/components/common/notification-permission-banner';
|
|
19
27
|
import { ControlCenterEmptyState } from './control-center-empty-state';
|
|
20
28
|
import { useControlCenterState } from './use-control-center-state';
|
|
@@ -58,38 +66,55 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
|
|
|
58
66
|
|
|
59
67
|
// PRD questionnaire drawer state
|
|
60
68
|
const [prdSelections, setPrdSelections] = useState<Record<string, string>>({});
|
|
61
|
-
const [isPrdProcessing, setIsPrdProcessing] = useState(false);
|
|
62
69
|
const [questionnaireData, setQuestionnaireData] = useState<PrdQuestionnaireData | null>(null);
|
|
63
70
|
const [isLoadingQuestionnaire, setIsLoadingQuestionnaire] = useState(false);
|
|
64
71
|
|
|
72
|
+
// Reject state (shared by both drawers)
|
|
73
|
+
const [isRejecting, setIsRejecting] = useState(false);
|
|
74
|
+
|
|
65
75
|
// Tech decisions drawer state
|
|
66
76
|
const [techDecisionsData, setTechDecisionsData] = useState<TechDecisionsReviewData | null>(null);
|
|
67
77
|
const [isLoadingTechDecisions, setIsLoadingTechDecisions] = useState(false);
|
|
68
78
|
|
|
79
|
+
// Merge review drawer state
|
|
80
|
+
const [mergeReviewData, setMergeReviewData] = useState<MergeReviewData | null>(null);
|
|
81
|
+
const [isLoadingMergeReview, setIsLoadingMergeReview] = useState(false);
|
|
82
|
+
|
|
69
83
|
const showPrdDrawer =
|
|
70
84
|
selectedNode?.lifecycle === 'requirements' && selectedNode?.state === 'action-required';
|
|
71
85
|
|
|
72
86
|
const showTechDecisionsDrawer =
|
|
73
87
|
selectedNode?.lifecycle === 'implementation' && selectedNode?.state === 'action-required';
|
|
74
88
|
|
|
89
|
+
const showMergeReviewDrawer =
|
|
90
|
+
selectedNode?.lifecycle === 'review' && selectedNode?.state === 'action-required';
|
|
91
|
+
|
|
75
92
|
const handlePrdSelect = useCallback((questionId: string, optionId: string) => {
|
|
76
93
|
setPrdSelections((prev) => ({ ...prev, [questionId]: optionId }));
|
|
77
94
|
}, []);
|
|
78
95
|
|
|
79
|
-
const handlePrdRefine = useCallback(async (_text: string) => {
|
|
80
|
-
setIsPrdProcessing(true);
|
|
81
|
-
// TODO: Call API to refine requirements
|
|
82
|
-
// For now simulate a delay
|
|
83
|
-
await new Promise((resolve) => setTimeout(resolve, 1500));
|
|
84
|
-
setIsPrdProcessing(false);
|
|
85
|
-
}, []);
|
|
86
|
-
|
|
87
96
|
const handlePrdApprove = useCallback(
|
|
88
97
|
async (_actionId: string) => {
|
|
89
98
|
const featureId = selectedNode?.featureId;
|
|
90
99
|
if (!featureId) return;
|
|
91
100
|
|
|
92
|
-
|
|
101
|
+
let payload: PrdApprovalPayload | undefined;
|
|
102
|
+
if (questionnaireData) {
|
|
103
|
+
const changedSelections: QuestionSelectionChange[] = [];
|
|
104
|
+
for (const [questionId, optionId] of Object.entries(prdSelections)) {
|
|
105
|
+
const question = questionnaireData.questions.find((q) => q.id === questionId);
|
|
106
|
+
const option = question?.options.find((o) => o.id === optionId);
|
|
107
|
+
if (question && option) {
|
|
108
|
+
changedSelections.push({
|
|
109
|
+
questionId: question.question,
|
|
110
|
+
selectedOption: option.label,
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
payload = { approved: true, changedSelections };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
const result = await approveFeature(featureId, payload);
|
|
93
118
|
|
|
94
119
|
if (!result.approved) {
|
|
95
120
|
toast.error(result.error ?? 'Failed to approve requirements');
|
|
@@ -100,30 +125,79 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
|
|
|
100
125
|
clearSelection();
|
|
101
126
|
setPrdSelections({});
|
|
102
127
|
},
|
|
128
|
+
[selectedNode?.featureId, clearSelection, questionnaireData, prdSelections]
|
|
129
|
+
);
|
|
130
|
+
|
|
131
|
+
// Shared reject handler — all drawers use the same rejectFeature flow
|
|
132
|
+
const handleReject = useCallback(
|
|
133
|
+
async (feedback: string, label: string, onDone?: () => void) => {
|
|
134
|
+
const featureId = selectedNode?.featureId;
|
|
135
|
+
if (!featureId) return;
|
|
136
|
+
|
|
137
|
+
setIsRejecting(true);
|
|
138
|
+
try {
|
|
139
|
+
const result = await rejectFeature(featureId, feedback);
|
|
140
|
+
|
|
141
|
+
if (!result.rejected) {
|
|
142
|
+
toast.error(result.error ?? `Failed to reject ${label.toLowerCase()}`);
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
toast.success(`${label} rejected — agent re-iterating (iteration ${result.iteration})`);
|
|
147
|
+
if (result.iterationWarning) {
|
|
148
|
+
toast.warning(
|
|
149
|
+
`Iteration ${result.iteration} — consider approving or adjusting feedback to avoid excessive iterations`
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
clearSelection();
|
|
153
|
+
onDone?.();
|
|
154
|
+
} finally {
|
|
155
|
+
setIsRejecting(false);
|
|
156
|
+
}
|
|
157
|
+
},
|
|
103
158
|
[selectedNode?.featureId, clearSelection]
|
|
104
159
|
);
|
|
105
160
|
|
|
106
|
-
const
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
161
|
+
const handlePrdReject = useCallback(
|
|
162
|
+
(feedback: string) => handleReject(feedback, 'Requirements', () => setPrdSelections({})),
|
|
163
|
+
[handleReject]
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
const handleTechDecisionsReject = useCallback(
|
|
167
|
+
(feedback: string) => handleReject(feedback, 'Plan'),
|
|
168
|
+
[handleReject]
|
|
169
|
+
);
|
|
112
170
|
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
171
|
+
const handleMergeReject = useCallback(
|
|
172
|
+
(feedback: string) => handleReject(feedback, 'Merge'),
|
|
173
|
+
[handleReject]
|
|
174
|
+
);
|
|
175
|
+
|
|
176
|
+
// Shared approve handler — tech decisions and merge use identical approve flows
|
|
177
|
+
const handleSimpleApprove = useCallback(
|
|
178
|
+
async (label: string) => {
|
|
179
|
+
const featureId = selectedNode?.featureId;
|
|
180
|
+
if (!featureId) return;
|
|
181
|
+
|
|
182
|
+
const result = await approveFeature(featureId);
|
|
183
|
+
|
|
184
|
+
if (!result.approved) {
|
|
185
|
+
toast.error(result.error ?? `Failed to approve ${label.toLowerCase()}`);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
116
188
|
|
|
117
|
-
|
|
189
|
+
toast.success(`${label} approved — agent resuming`);
|
|
190
|
+
clearSelection();
|
|
191
|
+
},
|
|
192
|
+
[selectedNode?.featureId, clearSelection]
|
|
193
|
+
);
|
|
118
194
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
195
|
+
const handleTechDecisionsApprove = useCallback(
|
|
196
|
+
() => handleSimpleApprove('Plan'),
|
|
197
|
+
[handleSimpleApprove]
|
|
198
|
+
);
|
|
123
199
|
|
|
124
|
-
|
|
125
|
-
clearSelection();
|
|
126
|
-
}, [selectedNode?.featureId, clearSelection]);
|
|
200
|
+
const handleMergeApprove = useCallback(() => handleSimpleApprove('Merge'), [handleSimpleApprove]);
|
|
127
201
|
|
|
128
202
|
// Fetch questionnaire data and reset selections when a different feature is selected
|
|
129
203
|
const prdFeatureId = showPrdDrawer ? selectedNode?.featureId : null;
|
|
@@ -197,6 +271,36 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
|
|
|
197
271
|
};
|
|
198
272
|
}, [techDecisionsFeatureId]);
|
|
199
273
|
|
|
274
|
+
// Fetch merge review data when a feature is in review + action-required
|
|
275
|
+
const mergeFeatureId = showMergeReviewDrawer ? selectedNode?.featureId : null;
|
|
276
|
+
useEffect(() => {
|
|
277
|
+
setMergeReviewData(null);
|
|
278
|
+
|
|
279
|
+
if (!mergeFeatureId) return;
|
|
280
|
+
|
|
281
|
+
let cancelled = false;
|
|
282
|
+
setIsLoadingMergeReview(true);
|
|
283
|
+
getMergeReviewData(mergeFeatureId)
|
|
284
|
+
.then((result) => {
|
|
285
|
+
if (cancelled) return;
|
|
286
|
+
if ('error' in result) {
|
|
287
|
+
toast.error(result.error);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
setMergeReviewData(result);
|
|
291
|
+
})
|
|
292
|
+
.catch(() => {
|
|
293
|
+
if (!cancelled) toast.error('Failed to load merge review data');
|
|
294
|
+
})
|
|
295
|
+
.finally(() => {
|
|
296
|
+
if (!cancelled) setIsLoadingMergeReview(false);
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
return () => {
|
|
300
|
+
cancelled = true;
|
|
301
|
+
};
|
|
302
|
+
}, [mergeFeatureId]);
|
|
303
|
+
|
|
200
304
|
const hasRepositories = nodes.some((n) => n.type === 'repositoryNode');
|
|
201
305
|
|
|
202
306
|
// Listen for global "open create drawer" events from the sidebar
|
|
@@ -240,7 +344,9 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
|
|
|
240
344
|
emptyState={<ControlCenterEmptyState onRepositorySelect={handleAddRepository} />}
|
|
241
345
|
/>
|
|
242
346
|
<FeatureDrawer
|
|
243
|
-
selectedNode={
|
|
347
|
+
selectedNode={
|
|
348
|
+
showPrdDrawer || showTechDecisionsDrawer || showMergeReviewDrawer ? null : selectedNode
|
|
349
|
+
}
|
|
244
350
|
onClose={clearSelection}
|
|
245
351
|
onDelete={handleDeleteFeature}
|
|
246
352
|
isDeleting={isDeleting}
|
|
@@ -258,11 +364,12 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
|
|
|
258
364
|
data={questionnaireData}
|
|
259
365
|
selections={prdSelections}
|
|
260
366
|
onSelect={handlePrdSelect}
|
|
261
|
-
onRefine={handlePrdRefine}
|
|
262
367
|
onApprove={handlePrdApprove}
|
|
368
|
+
onReject={handlePrdReject}
|
|
369
|
+
isRejecting={isRejecting}
|
|
263
370
|
onDelete={handleDeleteFeature}
|
|
264
371
|
isDeleting={isDeleting}
|
|
265
|
-
isProcessing={
|
|
372
|
+
isProcessing={isLoadingQuestionnaire}
|
|
266
373
|
/>
|
|
267
374
|
) : null}
|
|
268
375
|
{techDecisionsData ? (
|
|
@@ -275,13 +382,32 @@ export function ControlCenterInner({ initialNodes, initialEdges }: ControlCenter
|
|
|
275
382
|
branch={selectedNode?.branch}
|
|
276
383
|
specPath={selectedNode?.specPath}
|
|
277
384
|
data={techDecisionsData}
|
|
278
|
-
onRefine={handleTechDecisionsRefine}
|
|
279
385
|
onApprove={handleTechDecisionsApprove}
|
|
386
|
+
onReject={handleTechDecisionsReject}
|
|
387
|
+
isRejecting={isRejecting}
|
|
280
388
|
onDelete={handleDeleteFeature}
|
|
281
389
|
isDeleting={isDeleting}
|
|
282
390
|
isProcessing={isLoadingTechDecisions}
|
|
283
391
|
/>
|
|
284
392
|
) : null}
|
|
393
|
+
{mergeReviewData ? (
|
|
394
|
+
<MergeReviewDrawer
|
|
395
|
+
open={showMergeReviewDrawer}
|
|
396
|
+
onClose={clearSelection}
|
|
397
|
+
featureName={selectedNode?.name ?? ''}
|
|
398
|
+
featureId={selectedNode?.featureId}
|
|
399
|
+
repositoryPath={selectedNode?.repositoryPath}
|
|
400
|
+
branch={selectedNode?.branch}
|
|
401
|
+
specPath={selectedNode?.specPath}
|
|
402
|
+
data={mergeReviewData}
|
|
403
|
+
onApprove={handleMergeApprove}
|
|
404
|
+
onReject={handleMergeReject}
|
|
405
|
+
isRejecting={isRejecting}
|
|
406
|
+
onDelete={handleDeleteFeature}
|
|
407
|
+
isDeleting={isDeleting}
|
|
408
|
+
isProcessing={isLoadingMergeReview}
|
|
409
|
+
/>
|
|
410
|
+
) : null}
|
|
285
411
|
<FeatureCreateDrawer
|
|
286
412
|
open={isCreateDrawerOpen}
|
|
287
413
|
onClose={closeCreateDrawer}
|
|
@@ -75,6 +75,21 @@ const featureNodes: FeatureNodeType[] = [
|
|
|
75
75
|
branch: 'feat/api-gateway',
|
|
76
76
|
},
|
|
77
77
|
},
|
|
78
|
+
{
|
|
79
|
+
id: 'feat-4',
|
|
80
|
+
type: 'featureNode',
|
|
81
|
+
position: { x: 800, y: 345 },
|
|
82
|
+
data: {
|
|
83
|
+
name: 'Merge Review',
|
|
84
|
+
description: 'PR ready for merge approval',
|
|
85
|
+
featureId: '#f4',
|
|
86
|
+
lifecycle: 'review',
|
|
87
|
+
state: 'action-required',
|
|
88
|
+
progress: 90,
|
|
89
|
+
repositoryPath: '/home/user/my-repo',
|
|
90
|
+
branch: 'feat/merge-review',
|
|
91
|
+
},
|
|
92
|
+
},
|
|
78
93
|
];
|
|
79
94
|
|
|
80
95
|
const repoNode: RepositoryNodeType = {
|
|
@@ -351,8 +351,19 @@ export function useControlCenterState(
|
|
|
351
351
|
}
|
|
352
352
|
|
|
353
353
|
setSelectedNode(null);
|
|
354
|
-
setNodes((
|
|
355
|
-
|
|
354
|
+
setNodes((currentNodes) => {
|
|
355
|
+
const remainingNodes = currentNodes.filter((n) => n.id !== featureId);
|
|
356
|
+
const remainingEdges = edges.filter(
|
|
357
|
+
(e) => e.source !== featureId && e.target !== featureId
|
|
358
|
+
);
|
|
359
|
+
const result = layoutWithDagre(remainingNodes, remainingEdges, {
|
|
360
|
+
direction: 'LR',
|
|
361
|
+
ranksep: 200,
|
|
362
|
+
nodesep: 60,
|
|
363
|
+
});
|
|
364
|
+
setEdges(result.edges);
|
|
365
|
+
return result.nodes;
|
|
366
|
+
});
|
|
356
367
|
toast.success('Feature deleted successfully');
|
|
357
368
|
router.refresh();
|
|
358
369
|
} catch {
|
|
@@ -361,7 +372,7 @@ export function useControlCenterState(
|
|
|
361
372
|
setIsDeleting(false);
|
|
362
373
|
}
|
|
363
374
|
},
|
|
364
|
-
[router]
|
|
375
|
+
[router, edges]
|
|
365
376
|
);
|
|
366
377
|
|
|
367
378
|
const handleDeleteRepository = useCallback(
|
|
@@ -430,23 +441,23 @@ export function useControlCenterState(
|
|
|
430
441
|
.pop() ?? path;
|
|
431
442
|
|
|
432
443
|
// Optimistic UI: add node immediately
|
|
444
|
+
let savedAddRepoY = 0;
|
|
433
445
|
setNodes((currentNodes) => {
|
|
434
446
|
const repoNodes = currentNodes.filter((n) => n.type === 'repositoryNode');
|
|
435
447
|
const addRepoNode = currentNodes.find((n) => n.type === 'addRepositoryNode');
|
|
436
448
|
|
|
437
|
-
//
|
|
449
|
+
// Save addRepoNode's original Y for rollback on error
|
|
450
|
+
if (addRepoNode) savedAddRepoY = addRepoNode.position.y;
|
|
451
|
+
|
|
452
|
+
// Place in the repo column, at the addRepoNode's current position
|
|
438
453
|
const repoX = repoNodes[0]?.position.x ?? addRepoNode?.position.x ?? 50;
|
|
439
454
|
const repoHeight = 50; // repositoryNode height
|
|
440
455
|
const gap = 15; // match dagre nodesep
|
|
441
456
|
|
|
442
|
-
const
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
? addRepoNode.position.y
|
|
447
|
-
: 0;
|
|
448
|
-
|
|
449
|
-
const position = { x: repoX, y: lastRepoBottomY + gap };
|
|
457
|
+
const position = {
|
|
458
|
+
x: repoX,
|
|
459
|
+
y: addRepoNode ? addRepoNode.position.y : 0,
|
|
460
|
+
};
|
|
450
461
|
|
|
451
462
|
const newNode = {
|
|
452
463
|
id: tempId,
|
|
@@ -455,8 +466,10 @@ export function useControlCenterState(
|
|
|
455
466
|
data: { name: repoName, repositoryPath: path, id: tempId },
|
|
456
467
|
} as CanvasNodeType;
|
|
457
468
|
|
|
458
|
-
//
|
|
459
|
-
const addRepoY =
|
|
469
|
+
// Shift addRepo button down by exactly one slot
|
|
470
|
+
const addRepoY = addRepoNode
|
|
471
|
+
? addRepoNode.position.y + repoHeight + gap
|
|
472
|
+
: position.y + repoHeight + gap;
|
|
460
473
|
|
|
461
474
|
return currentNodes
|
|
462
475
|
.map((n) =>
|
|
@@ -469,8 +482,16 @@ export function useControlCenterState(
|
|
|
469
482
|
addRepository({ path, name: repoName })
|
|
470
483
|
.then((result) => {
|
|
471
484
|
if (result.error) {
|
|
472
|
-
// Rollback optimistic node
|
|
473
|
-
setNodes((prev) =>
|
|
485
|
+
// Rollback optimistic node and restore addRepoNode position
|
|
486
|
+
setNodes((prev) =>
|
|
487
|
+
prev
|
|
488
|
+
.filter((n) => n.id !== tempId)
|
|
489
|
+
.map((n) =>
|
|
490
|
+
n.type === 'addRepositoryNode'
|
|
491
|
+
? { ...n, position: { ...n.position, y: savedAddRepoY } }
|
|
492
|
+
: n
|
|
493
|
+
)
|
|
494
|
+
);
|
|
474
495
|
toast.error(result.error);
|
|
475
496
|
return;
|
|
476
497
|
}
|
|
@@ -501,7 +522,16 @@ export function useControlCenterState(
|
|
|
501
522
|
router.refresh();
|
|
502
523
|
})
|
|
503
524
|
.catch(() => {
|
|
504
|
-
|
|
525
|
+
// Rollback optimistic node and restore addRepoNode position
|
|
526
|
+
setNodes((prev) =>
|
|
527
|
+
prev
|
|
528
|
+
.filter((n) => n.id !== tempId)
|
|
529
|
+
.map((n) =>
|
|
530
|
+
n.type === 'addRepositoryNode'
|
|
531
|
+
? { ...n, position: { ...n.position, y: savedAddRepoY } }
|
|
532
|
+
: n
|
|
533
|
+
)
|
|
534
|
+
);
|
|
505
535
|
toast.error('Failed to add repository');
|
|
506
536
|
});
|
|
507
537
|
},
|
|
@@ -15,7 +15,7 @@ const currentPort = parseInt(process.env.PORT, 10) || 3000
|
|
|
15
15
|
const hostname = process.env.HOSTNAME || '0.0.0.0'
|
|
16
16
|
|
|
17
17
|
let keepAliveTimeout = parseInt(process.env.KEEP_ALIVE_TIMEOUT, 10)
|
|
18
|
-
const nextConfig = {"env":{"NEXT_PUBLIC_SHEP_VERSION":"1.
|
|
18
|
+
const nextConfig = {"env":{"NEXT_PUBLIC_SHEP_VERSION":"1.48.0","NEXT_PUBLIC_SHEP_PACKAGE_NAME":"@shepai/cli","NEXT_PUBLIC_SHEP_DESCRIPTION":"Autonomous AI Native SDLC Platform - Automate the development cycle from idea to deploy"},"webpack":null,"typescript":{"ignoreBuildErrors":false},"typedRoutes":true,"distDir":"./.next","cleanDistDir":true,"assetPrefix":"","cacheMaxMemorySize":52428800,"configOrigin":"next.config.ts","useFileSystemPublicRoutes":true,"generateEtags":true,"pageExtensions":["tsx","ts","jsx","js"],"poweredByHeader":true,"compress":true,"images":{"deviceSizes":[640,750,828,1080,1200,1920,2048,3840],"imageSizes":[32,48,64,96,128,256,384],"path":"/_next/image","loader":"default","loaderFile":"","domains":[],"disableStaticImages":false,"minimumCacheTTL":14400,"formats":["image/webp"],"maximumRedirects":3,"maximumResponseBody":50000000,"dangerouslyAllowLocalIP":false,"dangerouslyAllowSVG":false,"contentSecurityPolicy":"script-src 'none'; frame-src 'none'; sandbox;","contentDispositionType":"attachment","localPatterns":[{"pathname":"**","search":""}],"remotePatterns":[],"qualities":[75],"unoptimized":false},"devIndicators":{"position":"bottom-left"},"onDemandEntries":{"maxInactiveAge":60000,"pagesBufferLength":5},"basePath":"","sassOptions":{},"trailingSlash":false,"i18n":null,"productionBrowserSourceMaps":false,"excludeDefaultMomentLocales":true,"reactProductionProfiling":false,"reactStrictMode":null,"reactMaxHeadersLength":6000,"httpAgentOptions":{"keepAlive":true},"logging":{},"compiler":{},"expireTime":31536000,"staticPageGenerationTimeout":60,"output":"standalone","modularizeImports":{"@mui/icons-material":{"transform":"@mui/icons-material/{{member}}"},"lodash":{"transform":"lodash/{{member}}"}},"outputFileTracingRoot":"/home/runner/work/cli/cli","cacheComponents":false,"cacheLife":{"default":{"stale":300,"revalidate":900,"expire":4294967294},"seconds":{"stale":30,"revalidate":1,"expire":60},"minutes":{"stale":300,"revalidate":60,"expire":3600},"hours":{"stale":300,"revalidate":3600,"expire":86400},"days":{"stale":300,"revalidate":86400,"expire":604800},"weeks":{"stale":300,"revalidate":604800,"expire":2592000},"max":{"stale":300,"revalidate":2592000,"expire":31536000}},"cacheHandlers":{},"experimental":{"useSkewCookie":false,"cssChunking":true,"multiZoneDraftMode":false,"appNavFailHandling":false,"prerenderEarlyExit":true,"serverMinification":true,"linkNoTouchStart":false,"caseSensitiveRoutes":false,"dynamicOnHover":false,"preloadEntriesOnStart":true,"clientRouterFilter":true,"clientRouterFilterRedirects":false,"fetchCacheKeyPrefix":"","proxyPrefetch":"flexible","optimisticClientCache":true,"manualClientBasePath":false,"cpus":3,"memoryBasedWorkersCount":false,"imgOptConcurrency":null,"imgOptTimeoutInSeconds":7,"imgOptMaxInputPixels":268402689,"imgOptSequentialRead":null,"imgOptSkipMetadata":null,"isrFlushToDisk":true,"workerThreads":false,"optimizeCss":false,"nextScriptWorkers":false,"scrollRestoration":false,"externalDir":false,"disableOptimizedLoading":false,"gzipSize":true,"craCompat":false,"esmExternals":true,"fullySpecified":false,"swcTraceProfiling":false,"forceSwcTransforms":false,"largePageDataBytes":128000,"typedEnv":false,"parallelServerCompiles":false,"parallelServerBuildTraces":false,"ppr":false,"authInterrupts":false,"webpackMemoryOptimizations":false,"optimizeServerReact":true,"viewTransition":false,"removeUncaughtErrorAndRejectionListeners":false,"validateRSCRequestHeaders":false,"staleTimes":{"dynamic":0,"static":300},"reactDebugChannel":false,"serverComponentsHmrCache":true,"staticGenerationMaxConcurrency":8,"staticGenerationMinPagesPerWorker":25,"transitionIndicator":false,"inlineCss":false,"useCache":false,"globalNotFound":false,"browserDebugInfoInTerminal":false,"lockDistDir":true,"isolatedDevBuild":true,"proxyClientMaxBodySize":10485760,"hideLogsAfterAbort":false,"mcpServer":true,"turbopackFileSystemCacheForDev":true,"turbopackFileSystemCacheForBuild":false,"turbopackInferModuleSideEffects":false,"optimizePackageImports":["lucide-react","date-fns","lodash-es","ramda","antd","react-bootstrap","ahooks","@ant-design/icons","@headlessui/react","@headlessui-float/react","@heroicons/react/20/solid","@heroicons/react/24/solid","@heroicons/react/24/outline","@visx/visx","@tremor/react","rxjs","@mui/material","@mui/icons-material","recharts","react-use","effect","@effect/schema","@effect/platform","@effect/platform-node","@effect/platform-browser","@effect/platform-bun","@effect/sql","@effect/sql-mssql","@effect/sql-mysql2","@effect/sql-pg","@effect/sql-sqlite-node","@effect/sql-sqlite-bun","@effect/sql-sqlite-wasm","@effect/sql-sqlite-react-native","@effect/rpc","@effect/rpc-http","@effect/typeclass","@effect/experimental","@effect/opentelemetry","@material-ui/core","@material-ui/icons","@tabler/icons-react","mui-core","react-icons/ai","react-icons/bi","react-icons/bs","react-icons/cg","react-icons/ci","react-icons/di","react-icons/fa","react-icons/fa6","react-icons/fc","react-icons/fi","react-icons/gi","react-icons/go","react-icons/gr","react-icons/hi","react-icons/hi2","react-icons/im","react-icons/io","react-icons/io5","react-icons/lia","react-icons/lib","react-icons/lu","react-icons/md","react-icons/pi","react-icons/ri","react-icons/rx","react-icons/si","react-icons/sl","react-icons/tb","react-icons/tfi","react-icons/ti","react-icons/vsc","react-icons/wi"],"trustHostHeader":false,"isExperimentalCompile":false},"htmlLimitedBots":"[\\w-]+-Google|Google-[\\w-]+|Chrome-Lighthouse|Slurp|DuckDuckBot|baiduspider|yandex|sogou|bitlybot|tumblr|vkShare|quora link preview|redditbot|ia_archiver|Bingbot|BingPreview|applebot|facebookexternalhit|facebookcatalog|Twitterbot|LinkedInBot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|Yeti|googleweblight","bundlePagesRouterDependencies":false,"configFileName":"next.config.ts","turbopack":{"root":"/home/runner/work/cli/cli"},"serverExternalPackages":["tsyringe","reflect-metadata","better-sqlite3"],"distDirRoot":".next"}
|
|
19
19
|
|
|
20
20
|
process.env.__NEXT_PRIVATE_STANDALONE_CONFIG = JSON.stringify(nextConfig)
|
|
21
21
|
|