@shepai/cli 1.46.0 → 1.48.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 +5 -0
- 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 +10 -3
- 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/create-feature.d.ts +2 -0
- package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/create-feature.js +3 -1
- 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/get-workflow-defaults.d.ts +11 -0
- package/dist/src/presentation/web/app/actions/get-workflow-defaults.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/get-workflow-defaults.js +15 -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/feature-create-drawer/feature-create-drawer.d.ts +5 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +25 -7
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +17 -0
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +54 -2
- 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 +75 -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 +36 -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/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +66 -2
- 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 +52 -22
- package/web/.next/server/app/page.js +1 -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]__19d52794._.js +9 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__19d52794._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- 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 +53 -23
- 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 +52 -22
- package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +1 -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]__19d52794._.js +9 -0
- package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js +1 -1
- 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 +53 -23
- package/web/.next/standalone/src/presentation/web/app/actions/create-feature.ts +5 -1
- 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/get-workflow-defaults.ts +28 -0
- package/web/.next/standalone/src/presentation/web/app/page.tsx +1 -0
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx +74 -1
- package/web/.next/standalone/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx +55 -5
- 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 +81 -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 +252 -0
- package/web/.next/standalone/src/presentation/web/components/features/control-center/control-center-inner.tsx +96 -1
- 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/22f30ce91a3c79c1.js +1 -0
- package/web/.next/static/chunks/66378a6c055c4e67.js +10 -0
- package/web/.next/static/chunks/8668962d3e682263.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]__4e8ca89c._.js +0 -9
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4e8ca89c._.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]__4e8ca89c._.js +0 -9
- package/web/.next/static/chunks/83ff3b6bbee54bce.js +0 -1
- package/web/.next/static/chunks/b7b7abe79e05b229.css +0 -2
- package/web/.next/static/chunks/ecf44fa8a155c854.js +0 -10
- /package/web/.next/static/{nM-uXIiW9k_0Z_GM_4bI4 → 1kZFDMQ0i-Y8dy1KkHlzv}/_buildManifest.js +0 -0
- /package/web/.next/static/{nM-uXIiW9k_0Z_GM_4bI4 → 1kZFDMQ0i-Y8dy1KkHlzv}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{nM-uXIiW9k_0Z_GM_4bI4 → 1kZFDMQ0i-Y8dy1KkHlzv}/_ssgManifest.js +0 -0
|
@@ -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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAEpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;
|
|
1
|
+
{"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAEpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,UAAU,kBAAkB;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAqBD,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgChD"}
|
|
@@ -12,7 +12,7 @@ function composeUserInput(name, description, attachments) {
|
|
|
12
12
|
return userInput;
|
|
13
13
|
}
|
|
14
14
|
export async function createFeature(input) {
|
|
15
|
-
const { name, description, repositoryPath, attachments, approvalGates } = input;
|
|
15
|
+
const { name, description, repositoryPath, attachments, approvalGates, push, openPr } = input;
|
|
16
16
|
if (!name?.trim()) {
|
|
17
17
|
return { error: 'name is required' };
|
|
18
18
|
}
|
|
@@ -31,6 +31,8 @@ export async function createFeature(input) {
|
|
|
31
31
|
userInput,
|
|
32
32
|
repositoryPath,
|
|
33
33
|
approvalGates: gates,
|
|
34
|
+
push: push ?? false,
|
|
35
|
+
openPr: openPr ?? false,
|
|
34
36
|
});
|
|
35
37
|
return { feature: result.feature };
|
|
36
38
|
}
|
|
@@ -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,11 @@
|
|
|
1
|
+
export interface WorkflowDefaults {
|
|
2
|
+
approvalGates: {
|
|
3
|
+
allowPrd: boolean;
|
|
4
|
+
allowPlan: boolean;
|
|
5
|
+
allowMerge: boolean;
|
|
6
|
+
};
|
|
7
|
+
push: boolean;
|
|
8
|
+
openPr: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare function getWorkflowDefaults(): Promise<WorkflowDefaults>;
|
|
11
|
+
//# sourceMappingURL=get-workflow-defaults.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-workflow-defaults.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-workflow-defaults.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAarE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
|
|
3
|
+
export async function getWorkflowDefaults() {
|
|
4
|
+
const settings = getSettings();
|
|
5
|
+
const { workflow } = settings;
|
|
6
|
+
return {
|
|
7
|
+
approvalGates: {
|
|
8
|
+
allowPrd: workflow.approvalGateDefaults.allowPrd,
|
|
9
|
+
allowPlan: workflow.approvalGateDefaults.allowPlan,
|
|
10
|
+
allowMerge: workflow.approvalGateDefaults.allowMerge,
|
|
11
|
+
},
|
|
12
|
+
push: workflow.approvalGateDefaults.pushOnImplementationComplete,
|
|
13
|
+
openPr: workflow.openPrOnImplementationComplete,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -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/feature-create-drawer/feature-create-drawer.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { FileAttachment } from '../../../../../../packages/core/src/infrastructure/services/file-dialog.service.js';
|
|
2
|
+
import type { WorkflowDefaults } from '../../../app/actions/get-workflow-defaults.js';
|
|
2
3
|
export type { FileAttachment } from '../../../../../../packages/core/src/infrastructure/services/file-dialog.service.js';
|
|
3
4
|
export interface FeatureCreatePayload {
|
|
4
5
|
name: string;
|
|
@@ -10,6 +11,8 @@ export interface FeatureCreatePayload {
|
|
|
10
11
|
allowPlan: boolean;
|
|
11
12
|
allowMerge: boolean;
|
|
12
13
|
};
|
|
14
|
+
push: boolean;
|
|
15
|
+
openPr: boolean;
|
|
13
16
|
}
|
|
14
17
|
export interface FeatureCreateDrawerProps {
|
|
15
18
|
open: boolean;
|
|
@@ -17,6 +20,7 @@ export interface FeatureCreateDrawerProps {
|
|
|
17
20
|
onSubmit: (data: FeatureCreatePayload) => void;
|
|
18
21
|
repositoryPath: string;
|
|
19
22
|
isSubmitting?: boolean;
|
|
23
|
+
workflowDefaults?: WorkflowDefaults;
|
|
20
24
|
}
|
|
21
|
-
export declare function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, isSubmitting, }: FeatureCreateDrawerProps): import("react/jsx-runtime").JSX.Element;
|
|
25
|
+
export declare function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, isSubmitting, workflowDefaults, }: FeatureCreateDrawerProps): import("react/jsx-runtime").JSX.Element;
|
|
22
26
|
//# sourceMappingURL=feature-create-drawer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAC/F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CACjB;AAcD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,GACjB,EAAE,wBAAwB,2CA2O1B"}
|
package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { useState, useCallback } from 'react';
|
|
3
|
+
import { useState, useCallback, useEffect } from 'react';
|
|
4
4
|
import { XIcon, PlusIcon, FileIcon, FileTextIcon, ImageIcon, CodeIcon, Trash2Icon, } from 'lucide-react';
|
|
5
5
|
import { cn } from '../../../lib/utils.js';
|
|
6
6
|
import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerDescription, DrawerFooter, } from '../../ui/drawer.js';
|
|
@@ -9,6 +9,7 @@ import { Input } from '../../ui/input.js';
|
|
|
9
9
|
import { Textarea } from '../../ui/textarea.js';
|
|
10
10
|
import { Label } from '../../ui/label.js';
|
|
11
11
|
import { CheckboxGroup } from '../../ui/checkbox-group.js';
|
|
12
|
+
import { CheckboxGroupItem } from '../../ui/checkbox-group-item.js';
|
|
12
13
|
import { Separator } from '../../ui/separator.js';
|
|
13
14
|
import { Badge } from '../../ui/badge.js';
|
|
14
15
|
import { pickFiles } from './pick-files.js';
|
|
@@ -22,17 +23,32 @@ const EMPTY_GATES = {
|
|
|
22
23
|
allowPlan: false,
|
|
23
24
|
allowMerge: false,
|
|
24
25
|
};
|
|
25
|
-
export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, isSubmitting = false, }) {
|
|
26
|
+
export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, isSubmitting = false, workflowDefaults, }) {
|
|
27
|
+
const defaultGates = workflowDefaults?.approvalGates ?? EMPTY_GATES;
|
|
28
|
+
const defaultPush = workflowDefaults?.push ?? false;
|
|
29
|
+
const defaultOpenPr = workflowDefaults?.openPr ?? false;
|
|
26
30
|
const [name, setName] = useState('');
|
|
27
31
|
const [description, setDescription] = useState('');
|
|
28
32
|
const [attachments, setAttachments] = useState([]);
|
|
29
|
-
const [approvalGates, setApprovalGates] = useState({ ...
|
|
33
|
+
const [approvalGates, setApprovalGates] = useState({ ...defaultGates });
|
|
34
|
+
const [push, setPush] = useState(defaultPush);
|
|
35
|
+
const [openPr, setOpenPr] = useState(defaultOpenPr);
|
|
36
|
+
// Sync state when workflowDefaults load asynchronously
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (workflowDefaults) {
|
|
39
|
+
setApprovalGates({ ...workflowDefaults.approvalGates });
|
|
40
|
+
setPush(workflowDefaults.push);
|
|
41
|
+
setOpenPr(workflowDefaults.openPr);
|
|
42
|
+
}
|
|
43
|
+
}, [workflowDefaults]);
|
|
30
44
|
const resetForm = useCallback(() => {
|
|
31
45
|
setName('');
|
|
32
46
|
setDescription('');
|
|
33
47
|
setAttachments([]);
|
|
34
|
-
setApprovalGates({ ...
|
|
35
|
-
|
|
48
|
+
setApprovalGates({ ...defaultGates });
|
|
49
|
+
setPush(defaultPush);
|
|
50
|
+
setOpenPr(defaultOpenPr);
|
|
51
|
+
}, [defaultGates, defaultPush, defaultOpenPr]);
|
|
36
52
|
const handleOpenChange = useCallback((nextOpen) => {
|
|
37
53
|
if (!nextOpen) {
|
|
38
54
|
resetForm();
|
|
@@ -54,8 +70,10 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
|
|
|
54
70
|
allowPlan: approvalGates.allowPlan ?? false,
|
|
55
71
|
allowMerge: approvalGates.allowMerge ?? false,
|
|
56
72
|
},
|
|
73
|
+
push: push || openPr,
|
|
74
|
+
openPr,
|
|
57
75
|
});
|
|
58
|
-
}, [name, description, attachments, approvalGates, repositoryPath, onSubmit]);
|
|
76
|
+
}, [name, description, attachments, approvalGates, repositoryPath, onSubmit, push, openPr]);
|
|
59
77
|
const handleAddFiles = useCallback(async () => {
|
|
60
78
|
try {
|
|
61
79
|
const files = await pickFiles();
|
|
@@ -70,7 +88,7 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
|
|
|
70
88
|
const handleRemoveFile = useCallback((path) => {
|
|
71
89
|
setAttachments((prev) => prev.filter((f) => f.path !== path));
|
|
72
90
|
}, []);
|
|
73
|
-
return (_jsx(Drawer, { direction: "right", modal: false, handleOnly: true, open: open, onOpenChange: handleOpenChange, children: _jsxs(DrawerContent, { direction: "right", className: "w-96", showCloseButton: false, children: [_jsx("button", { type: "button", "aria-label": "Close", onClick: onClose, className: "ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden", children: _jsx(XIcon, { className: "size-4" }) }), _jsxs(DrawerHeader, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500" }), _jsx(DrawerTitle, { children: "NEW FEATURE" })] }), _jsx(DrawerDescription, { asChild: true, children: _jsx("div", { children: _jsx(Badge, { variant: "secondary", children: "Creating..." }) }) })] }), _jsx(Separator, {}), _jsx("div", { className: "flex-1 overflow-y-auto p-4", children: _jsxs("form", { id: "create-feature-form", onSubmit: handleSubmit, className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "feature-name", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "FEATURE NAME" }), _jsx(Input, { id: "feature-name", placeholder: "e.g. GitHub OAuth Login", value: name, onChange: (e) => setName(e.target.value), required: true, disabled: isSubmitting })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "feature-description", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "DESCRIPTION" }), _jsx(Textarea, { id: "feature-description", placeholder: "Describe what this feature does...", value: description, onChange: (e) => setDescription(e.target.value), rows: 4, disabled: isSubmitting })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "APPROVE" }), _jsx(CheckboxGroup, { label: "Autonomous Mode", description: "YOLO!", parentAriaLabel: "Auto approve all", options: AUTO_APPROVE_OPTIONS, value: approvalGates, onValueChange: setApprovalGates, disabled: isSubmitting })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: ["ATTACHMENTS", attachments.length > 0 && (_jsxs("span", { className: "text-muted-foreground/60 ml-1.5", children: ["(", attachments.length, ")"] }))] }), _jsxs(Button, { type: "button", variant: "outline", size: "xs", onClick: handleAddFiles, disabled: isSubmitting, children: [_jsx(PlusIcon, { className: "size-3" }), "Add Files"] })] }), attachments.length > 0 && (_jsx("div", { className: "flex flex-col gap-2", children: attachments.map((file) => (_jsx(AttachmentCard, { file: file, onRemove: () => handleRemoveFile(file.path), disabled: isSubmitting }, file.path))) }))] })] }) }), _jsx(Separator, {}), _jsxs(DrawerFooter, { className: "flex-row justify-end gap-2", children: [_jsx(Button, { variant: "outline", onClick: onClose, disabled: isSubmitting, children: "Cancel" }), _jsx(Button, { type: "submit", form: "create-feature-form", disabled: !name.trim() || isSubmitting, children: isSubmitting ? 'Creating...' : '+ Create Feature' })] })] }) }));
|
|
91
|
+
return (_jsx(Drawer, { direction: "right", modal: false, handleOnly: true, open: open, onOpenChange: handleOpenChange, children: _jsxs(DrawerContent, { direction: "right", className: "w-96", showCloseButton: false, children: [_jsx("button", { type: "button", "aria-label": "Close", onClick: onClose, className: "ring-offset-background focus:ring-ring absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden", children: _jsx(XIcon, { className: "size-4" }) }), _jsxs(DrawerHeader, { children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("div", { className: "h-2.5 w-2.5 shrink-0 rounded-full bg-blue-500" }), _jsx(DrawerTitle, { children: "NEW FEATURE" })] }), _jsx(DrawerDescription, { asChild: true, children: _jsx("div", { children: _jsx(Badge, { variant: "secondary", children: "Creating..." }) }) })] }), _jsx(Separator, {}), _jsx("div", { className: "flex-1 overflow-y-auto p-4", children: _jsxs("form", { id: "create-feature-form", onSubmit: handleSubmit, className: "flex flex-col gap-4", children: [_jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "feature-name", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "FEATURE NAME" }), _jsx(Input, { id: "feature-name", placeholder: "e.g. GitHub OAuth Login", value: name, onChange: (e) => setName(e.target.value), required: true, disabled: isSubmitting })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { htmlFor: "feature-description", className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "DESCRIPTION" }), _jsx(Textarea, { id: "feature-description", placeholder: "Describe what this feature does...", value: description, onChange: (e) => setDescription(e.target.value), rows: 4, disabled: isSubmitting })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "APPROVE" }), _jsx(CheckboxGroup, { label: "Autonomous Mode", description: "YOLO!", parentAriaLabel: "Auto approve all", options: AUTO_APPROVE_OPTIONS, value: approvalGates, onValueChange: setApprovalGates, disabled: isSubmitting })] }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(CheckboxGroupItem, { id: "push", label: "Push", description: "Push branch to remote after implementation.", checked: push || openPr, onCheckedChange: setPush, disabled: openPr || isSubmitting }), _jsx(CheckboxGroupItem, { id: "open-pr", label: "Create PR", description: "Open a pull request after pushing.", checked: openPr, onCheckedChange: setOpenPr, disabled: isSubmitting })] })] }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs(Label, { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: ["ATTACHMENTS", attachments.length > 0 && (_jsxs("span", { className: "text-muted-foreground/60 ml-1.5", children: ["(", attachments.length, ")"] }))] }), _jsxs(Button, { type: "button", variant: "outline", size: "xs", onClick: handleAddFiles, disabled: isSubmitting, children: [_jsx(PlusIcon, { className: "size-3" }), "Add Files"] })] }), attachments.length > 0 && (_jsx("div", { className: "flex flex-col gap-2", children: attachments.map((file) => (_jsx(AttachmentCard, { file: file, onRemove: () => handleRemoveFile(file.path), disabled: isSubmitting }, file.path))) }))] })] }) }), _jsx(Separator, {}), _jsxs(DrawerFooter, { className: "flex-row justify-end gap-2", children: [_jsx(Button, { variant: "outline", onClick: onClose, disabled: isSubmitting, children: "Cancel" }), _jsx(Button, { type: "submit", form: "create-feature-form", disabled: !name.trim() || isSubmitting, children: isSubmitting ? 'Creating...' : '+ Create Feature' })] })] }) }));
|
|
74
92
|
}
|
|
75
93
|
/* ---------------------------------------------------------------------------
|
|
76
94
|
* Private sub-components & utilities
|
|
@@ -67,6 +67,23 @@ export declare const PrdOnly: Story;
|
|
|
67
67
|
* Manual review for requirements and planning, auto-approve merge to Done.
|
|
68
68
|
*/
|
|
69
69
|
export declare const MergeOnly: Story;
|
|
70
|
+
/**
|
|
71
|
+
* Push checkbox checked — the "Push" option is enabled so the branch will be
|
|
72
|
+
* pushed to remote after implementation. "Create PR" remains unchecked.
|
|
73
|
+
*/
|
|
74
|
+
export declare const PushOnly: Story;
|
|
75
|
+
/**
|
|
76
|
+
* Create PR checked — checking "Create PR" auto-checks and disables "Push"
|
|
77
|
+
* because a PR cannot be created without pushing. Both checkboxes appear
|
|
78
|
+
* checked, but "Push" is non-interactive (disabled).
|
|
79
|
+
*/
|
|
80
|
+
export declare const PrChecked: Story;
|
|
81
|
+
/**
|
|
82
|
+
* Drawer pre-populated from workflow settings — PRD and Plan approval gates
|
|
83
|
+
* are checked, Push and Create PR are enabled. These values come from
|
|
84
|
+
* `shep settings workflow` and are read at mount time via `getWorkflowDefaults()`.
|
|
85
|
+
*/
|
|
86
|
+
export declare const WithWorkflowDefaults: Story;
|
|
70
87
|
/**
|
|
71
88
|
* Fully interactive story — open the drawer, fill the form, toggle checkboxes,
|
|
72
89
|
* and click "Add Files" to attach files via the native OS file picker.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-create-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"feature-create-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAS9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,mBAAmB,CAyB1C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAiDlD,uFAAuF;AACvF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAiBvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,KAUxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAYF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAWlC,CAAC;AAMF;;;;;;;;;GASG;AACH,eAAO,MAAM,WAAW,EAAE,KAsCzB,CAAC"}
|
|
@@ -70,7 +70,7 @@ const logClose = fn().mockName('onClose');
|
|
|
70
70
|
* Trigger wrapper — every story uses this so nothing auto-opens on Docs page
|
|
71
71
|
* ------------------------------------------------------------------------- */
|
|
72
72
|
/** Starts closed — click button to open. Actions are logged. */
|
|
73
|
-
function CreateDrawerTrigger({ label = 'Open Create Feature' }) {
|
|
73
|
+
function CreateDrawerTrigger({ label = 'Open Create Feature', workflowDefaults, }) {
|
|
74
74
|
const [open, setOpen] = useState(false);
|
|
75
75
|
return (_jsxs("div", { className: "flex h-screen items-start p-4", children: [_jsx(Button, { variant: "outline", onClick: () => setOpen(true), children: label }), _jsx(FeatureCreateDrawer, { open: open, onClose: () => {
|
|
76
76
|
setOpen(false);
|
|
@@ -78,7 +78,7 @@ function CreateDrawerTrigger({ label = 'Open Create Feature' }) {
|
|
|
78
78
|
}, onSubmit: (data) => {
|
|
79
79
|
logSubmit(data);
|
|
80
80
|
setOpen(false);
|
|
81
|
-
}, repositoryPath: "/Users/dev/my-repo" })] }));
|
|
81
|
+
}, repositoryPath: "/Users/dev/my-repo", workflowDefaults: workflowDefaults })] }));
|
|
82
82
|
}
|
|
83
83
|
/* ---------------------------------------------------------------------------
|
|
84
84
|
* Per-state stories
|
|
@@ -179,6 +179,58 @@ export const MergeOnly = {
|
|
|
179
179
|
await userEvent.click(merge);
|
|
180
180
|
},
|
|
181
181
|
};
|
|
182
|
+
/* ---------------------------------------------------------------------------
|
|
183
|
+
* Git checkbox stories
|
|
184
|
+
* ------------------------------------------------------------------------- */
|
|
185
|
+
/**
|
|
186
|
+
* Push checkbox checked — the "Push" option is enabled so the branch will be
|
|
187
|
+
* pushed to remote after implementation. "Create PR" remains unchecked.
|
|
188
|
+
*/
|
|
189
|
+
export const PushOnly = {
|
|
190
|
+
render: () => _jsx(CreateDrawerTrigger, { label: "Open (Push Only)" }),
|
|
191
|
+
play: async ({ canvasElement }) => {
|
|
192
|
+
const canvas = within(canvasElement);
|
|
193
|
+
await userEvent.click(canvas.getByRole('button', { name: 'Open (Push Only)' }));
|
|
194
|
+
const body = within(canvasElement.ownerDocument.body);
|
|
195
|
+
const pushCheckbox = await body.findByLabelText('Push');
|
|
196
|
+
await userEvent.click(pushCheckbox);
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Create PR checked — checking "Create PR" auto-checks and disables "Push"
|
|
201
|
+
* because a PR cannot be created without pushing. Both checkboxes appear
|
|
202
|
+
* checked, but "Push" is non-interactive (disabled).
|
|
203
|
+
*/
|
|
204
|
+
export const PrChecked = {
|
|
205
|
+
render: () => _jsx(CreateDrawerTrigger, { label: "Open (PR Checked)" }),
|
|
206
|
+
play: async ({ canvasElement }) => {
|
|
207
|
+
const canvas = within(canvasElement);
|
|
208
|
+
await userEvent.click(canvas.getByRole('button', { name: 'Open (PR Checked)' }));
|
|
209
|
+
const body = within(canvasElement.ownerDocument.body);
|
|
210
|
+
const prCheckbox = await body.findByLabelText('Create PR');
|
|
211
|
+
await userEvent.click(prCheckbox);
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
/* ---------------------------------------------------------------------------
|
|
215
|
+
* Workflow defaults stories
|
|
216
|
+
* ------------------------------------------------------------------------- */
|
|
217
|
+
const SAMPLE_WORKFLOW_DEFAULTS = {
|
|
218
|
+
approvalGates: { allowPrd: true, allowPlan: true, allowMerge: false },
|
|
219
|
+
push: true,
|
|
220
|
+
openPr: true,
|
|
221
|
+
};
|
|
222
|
+
/**
|
|
223
|
+
* Drawer pre-populated from workflow settings — PRD and Plan approval gates
|
|
224
|
+
* are checked, Push and Create PR are enabled. These values come from
|
|
225
|
+
* `shep settings workflow` and are read at mount time via `getWorkflowDefaults()`.
|
|
226
|
+
*/
|
|
227
|
+
export const WithWorkflowDefaults = {
|
|
228
|
+
render: () => (_jsx(CreateDrawerTrigger, { label: "Open (Workflow Defaults)", workflowDefaults: SAMPLE_WORKFLOW_DEFAULTS })),
|
|
229
|
+
play: async ({ canvasElement }) => {
|
|
230
|
+
const canvas = within(canvasElement);
|
|
231
|
+
await userEvent.click(canvas.getByRole('button', { name: 'Open (Workflow Defaults)' }));
|
|
232
|
+
},
|
|
233
|
+
};
|
|
182
234
|
/* ---------------------------------------------------------------------------
|
|
183
235
|
* Interactive story — full paths shown in submitted data panel
|
|
184
236
|
* ------------------------------------------------------------------------- */
|
|
@@ -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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import type { PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
2
|
+
/** Diff summary statistics for the PR */
|
|
3
|
+
export interface MergeReviewDiffSummary {
|
|
4
|
+
filesChanged: number;
|
|
5
|
+
additions: number;
|
|
6
|
+
deletions: number;
|
|
7
|
+
commitCount: number;
|
|
8
|
+
}
|
|
9
|
+
/** PR metadata extracted from Feature.pr */
|
|
10
|
+
export interface MergeReviewPr {
|
|
11
|
+
url: string;
|
|
12
|
+
number: number;
|
|
13
|
+
status: PrStatus;
|
|
14
|
+
commitHash?: string;
|
|
15
|
+
ciStatus?: CiStatus;
|
|
16
|
+
}
|
|
17
|
+
/** A phase from the implementation plan */
|
|
18
|
+
export interface MergeReviewPhase {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
}
|
|
23
|
+
/** Branch merge direction info */
|
|
24
|
+
export interface MergeReviewBranch {
|
|
25
|
+
/** Feature branch name */
|
|
26
|
+
source: string;
|
|
27
|
+
/** Target branch name (e.g. 'main') */
|
|
28
|
+
target: string;
|
|
29
|
+
}
|
|
30
|
+
/** Data returned by the getMergeReviewData server action */
|
|
31
|
+
export interface MergeReviewData {
|
|
32
|
+
/** PR metadata (omitted when the feature has no PR) */
|
|
33
|
+
pr?: MergeReviewPr;
|
|
34
|
+
/** Aggregate diff statistics (omitted when worktree is unavailable) */
|
|
35
|
+
diffSummary?: MergeReviewDiffSummary;
|
|
36
|
+
/** Implementation phases from plan.yaml */
|
|
37
|
+
phases?: MergeReviewPhase[];
|
|
38
|
+
/** Branch merge direction */
|
|
39
|
+
branch?: MergeReviewBranch;
|
|
40
|
+
/** Warning message when diff summary could not be retrieved */
|
|
41
|
+
warning?: string;
|
|
42
|
+
}
|
|
43
|
+
/** Props for the merge review content component */
|
|
44
|
+
export interface MergeReviewProps {
|
|
45
|
+
/** Merge review data from the server action */
|
|
46
|
+
data: MergeReviewData;
|
|
47
|
+
/** Approve merge callback */
|
|
48
|
+
onApprove: () => void;
|
|
49
|
+
/** Send refinement text to AI */
|
|
50
|
+
onRefine: (text: string) => void;
|
|
51
|
+
/** Controls disabled state during approval */
|
|
52
|
+
isProcessing?: boolean;
|
|
53
|
+
}
|
|
54
|
+
/** Props for the merge review drawer (shell wrapper) */
|
|
55
|
+
export interface MergeReviewDrawerProps extends MergeReviewProps {
|
|
56
|
+
/** Whether the drawer is open */
|
|
57
|
+
open: boolean;
|
|
58
|
+
/** Callback when drawer should close */
|
|
59
|
+
onClose: () => void;
|
|
60
|
+
/** Feature name shown in drawer header */
|
|
61
|
+
featureName: string;
|
|
62
|
+
/** Feature ID shown below the name */
|
|
63
|
+
featureId?: string;
|
|
64
|
+
/** Absolute path to the repository on disk */
|
|
65
|
+
repositoryPath?: string;
|
|
66
|
+
/** Git branch name — passed to ReviewDrawerShell for actions */
|
|
67
|
+
branch?: string;
|
|
68
|
+
/** Absolute path to the specs folder on disk */
|
|
69
|
+
specPath?: string;
|
|
70
|
+
/** Callback to delete the feature — shows delete button when provided */
|
|
71
|
+
onDelete?: (featureId: string) => void;
|
|
72
|
+
/** Whether a delete operation is in progress */
|
|
73
|
+
isDeleting?: boolean;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=merge-review-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-review-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAE/E,yCAAyC;AACzC,MAAM,WAAW,sBAAsB;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,4CAA4C;AAC5C,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,QAAQ,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,2CAA2C;AAC3C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,kCAAkC;AAClC,MAAM,WAAW,iBAAiB;IAChC,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,4DAA4D;AAC5D,MAAM,WAAW,eAAe;IAC9B,uDAAuD;IACvD,EAAE,CAAC,EAAE,aAAa,CAAC;IACnB,uEAAuE;IACvE,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC,2CAA2C;IAC3C,MAAM,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAC5B,6BAA6B;IAC7B,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,mDAAmD;AACnD,MAAM,WAAW,gBAAgB;IAC/B,+CAA+C;IAC/C,IAAI,EAAE,eAAe,CAAC;IACtB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,iCAAiC;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,8CAA8C;IAC9C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wDAAwD;AACxD,MAAM,WAAW,sBAAuB,SAAQ,gBAAgB;IAC9D,iCAAiC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,wCAAwC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { MergeReviewDrawerProps } from './merge-review-config.js';
|
|
2
|
+
export declare function MergeReviewDrawer({ open, onClose, featureName, featureId, repositoryPath, branch, specPath, onDelete, isDeleting, ...reviewProps }: MergeReviewDrawerProps): import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
//# sourceMappingURL=merge-review-drawer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-review-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review-drawer.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEpE,wBAAgB,iBAAiB,CAAC,EAChC,IAAI,EACJ,OAAO,EACP,WAAW,EACX,SAAS,EACT,cAAc,EACd,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,GAAG,WAAW,EACf,EAAE,sBAAsB,2CAgBxB"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
+
import { ReviewDrawerShell } from '../../common/review-drawer-shell/index.js';
|
|
4
|
+
import { MergeReview } from './merge-review.js';
|
|
5
|
+
export function MergeReviewDrawer({ open, onClose, featureName, featureId, repositoryPath, branch, specPath, onDelete, isDeleting, ...reviewProps }) {
|
|
6
|
+
return (_jsx(ReviewDrawerShell, { open: open, onClose: onClose, featureName: featureName, featureId: featureId, repositoryPath: repositoryPath, branch: branch, specPath: specPath, onDelete: onDelete, isDeleting: isDeleting, children: _jsx(MergeReview, { ...reviewProps }) }));
|
|
7
|
+
}
|