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