@shepai/cli 1.58.0 → 1.59.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/dist/src/presentation/web/app/page.d.ts.map +1 -1
  2. package/dist/src/presentation/web/app/page.js +9 -0
  3. package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.d.ts +5 -0
  4. package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.d.ts.map +1 -0
  5. package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.js +14 -0
  6. package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.stories.d.ts +12 -0
  7. package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.stories.d.ts.map +1 -0
  8. package/dist/src/presentation/web/components/common/ci-status-badge/ci-status-badge.stories.js +20 -0
  9. package/dist/src/presentation/web/components/common/ci-status-badge/index.d.ts +2 -0
  10. package/dist/src/presentation/web/components/common/ci-status-badge/index.d.ts.map +1 -0
  11. package/dist/src/presentation/web/components/common/ci-status-badge/index.js +1 -0
  12. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  13. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +13 -2
  14. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts +8 -0
  15. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts.map +1 -1
  16. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +41 -0
  17. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +9 -0
  18. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  19. package/dist/src/presentation/web/components/common/merge-review/merge-review.d.ts.map +1 -1
  20. package/dist/src/presentation/web/components/common/merge-review/merge-review.js +2 -12
  21. package/dist/tsconfig.build.tsbuildinfo +1 -1
  22. package/package.json +1 -1
  23. package/web/.next/BUILD_ID +1 -1
  24. package/web/.next/build-manifest.json +2 -2
  25. package/web/.next/cache/.previewinfo +1 -1
  26. package/web/.next/cache/.rscinfo +1 -1
  27. package/web/.next/cache/.tsbuildinfo +1 -1
  28. package/web/.next/cache/config.json +3 -3
  29. package/web/.next/fallback-build-manifest.json +2 -2
  30. package/web/.next/prerender-manifest.json +3 -3
  31. package/web/.next/required-server-files.js +1 -1
  32. package/web/.next/required-server-files.json +1 -1
  33. package/web/.next/server/app/_global-error.html +2 -2
  34. package/web/.next/server/app/_global-error.rsc +1 -1
  35. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  36. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  37. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  38. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  39. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  40. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  41. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  42. package/web/.next/server/app/page/server-reference-manifest.json +14 -14
  43. package/web/.next/server/app/page.js.nft.json +1 -1
  44. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  45. package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  46. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  48. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  49. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  50. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
  51. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  52. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  53. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  54. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  55. package/web/.next/server/chunks/ssr/[root-of-the-server]__86c7bba5._.js +2 -2
  56. package/web/.next/server/chunks/ssr/[root-of-the-server]__86c7bba5._.js.map +1 -1
  57. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
  58. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
  59. package/web/.next/server/chunks/ssr/{[root-of-the-server]__847521e6._.js → [root-of-the-server]__bced1185._.js} +2 -2
  60. package/web/.next/server/chunks/ssr/{[root-of-the-server]__847521e6._.js.map → [root-of-the-server]__bced1185._.js.map} +1 -1
  61. package/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
  62. package/web/.next/server/chunks/ssr/_027596cf._.js +1 -1
  63. package/web/.next/server/chunks/ssr/_027596cf._.js.map +1 -1
  64. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  65. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  66. package/web/.next/server/pages/500.html +2 -2
  67. package/web/.next/server/server-reference-manifest.js +1 -1
  68. package/web/.next/server/server-reference-manifest.json +15 -15
  69. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  70. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +2 -2
  71. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  72. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  73. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  74. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  75. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  76. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  77. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  78. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  79. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  80. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  81. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  82. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +14 -14
  83. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  84. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  85. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  86. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  87. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  88. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  89. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  90. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  91. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  92. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__86c7bba5._.js +2 -2
  93. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +2 -2
  94. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__847521e6._.js → [root-of-the-server]__bced1185._.js} +2 -2
  95. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js +1 -1
  96. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_027596cf._.js +1 -1
  97. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  98. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  99. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  100. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +15 -15
  101. package/web/.next/standalone/src/presentation/web/app/page.tsx +9 -0
  102. package/web/.next/standalone/src/presentation/web/components/common/ci-status-badge/ci-status-badge.stories.tsx +27 -0
  103. package/web/.next/standalone/src/presentation/web/components/common/ci-status-badge/ci-status-badge.tsx +29 -0
  104. package/web/.next/standalone/src/presentation/web/components/common/ci-status-badge/index.ts +1 -0
  105. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.tsx +53 -0
  106. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +61 -1
  107. package/web/.next/standalone/src/presentation/web/components/common/feature-node/feature-node-state-config.ts +9 -0
  108. package/web/.next/standalone/src/presentation/web/components/common/merge-review/merge-review.tsx +1 -29
  109. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  110. package/web/.next/static/chunks/{eb0e60434c992fc1.js → 4f7d89c9e09aed99.js} +2 -2
  111. package/web/.next/static/chunks/{7138c478667158d0.js → 6d33cb9af6245c98.js} +1 -1
  112. package/web/.next/static/chunks/b511c65023ec1889.css +2 -0
  113. package/web/.next/static/chunks/{3f5de337d3fc604f.js → d85b95e893db08bc.js} +1 -1
  114. package/web/.next/trace +1 -1
  115. package/web/.next/trace-build +1 -1
  116. package/web/.next/static/chunks/60bbbe7ff679eb4c.css +0 -2
  117. /package/web/.next/static/{e7Q45G0MI6cgci9Gn2J-i → xjc1tfvwTdK1Xv5Id2oaO}/_buildManifest.js +0 -0
  118. /package/web/.next/static/{e7Q45G0MI6cgci9Gn2J-i → xjc1tfvwTdK1Xv5Id2oaO}/_clientMiddlewareManifest.json +0 -0
  119. /package/web/.next/static/{e7Q45G0MI6cgci9Gn2J-i → xjc1tfvwTdK1Xv5Id2oaO}/_ssgManifest.js +0 -0
@@ -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;AAsBvC,wBAA8B,QAAQ,qDAwHrC"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/page.tsx"],"names":[],"mappings":"AAcA,uFAAuF;AACvF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAsBvC,wBAA8B,QAAQ,qDAiIrC"}
@@ -81,6 +81,15 @@ export default async function HomePage() {
81
81
  ...(run?.agentType && { agentType: run.agentType }),
82
82
  ...(run?.error && { errorMessage: run.error }),
83
83
  ...(blockedBy && { blockedBy }),
84
+ ...(feature.pr && {
85
+ pr: {
86
+ url: feature.pr.url,
87
+ number: feature.pr.number,
88
+ status: feature.pr.status,
89
+ ciStatus: feature.pr.ciStatus,
90
+ commitHash: feature.pr.commitHash,
91
+ },
92
+ }),
84
93
  };
85
94
  const featureNodeId = `feat-${feature.id}`;
86
95
  nodes.push({
@@ -0,0 +1,5 @@
1
+ import { CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
2
+ export declare function CiStatusBadge({ status }: {
3
+ status: CiStatus;
4
+ }): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=ci-status-badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-status-badge.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/ci-status-badge/ci-status-badge.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAGhE,wBAAgB,aAAa,CAAC,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,2CAwB7D"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { CheckCircle2, Loader2, XCircle } from 'lucide-react';
3
+ import { CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
4
+ import { Badge } from '../../ui/badge.js';
5
+ export function CiStatusBadge({ status }) {
6
+ switch (status) {
7
+ case CiStatus.Success:
8
+ return (_jsxs(Badge, { className: "border-transparent bg-green-50 text-green-700 hover:bg-green-50", children: [_jsx(CheckCircle2, { className: "mr-1 h-3.5 w-3.5" }), "Passing"] }));
9
+ case CiStatus.Pending:
10
+ return (_jsxs(Badge, { className: "border-transparent bg-yellow-50 text-yellow-700 hover:bg-yellow-50", children: [_jsx(Loader2, { className: "mr-1 h-3.5 w-3.5 animate-spin" }), "Pending"] }));
11
+ case CiStatus.Failure:
12
+ return (_jsxs(Badge, { className: "border-transparent bg-red-50 text-red-700 hover:bg-red-50", children: [_jsx(XCircle, { className: "mr-1 h-3.5 w-3.5" }), "Failing"] }));
13
+ }
14
+ }
@@ -0,0 +1,12 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { CiStatusBadge } from './ci-status-badge.js';
3
+ declare const meta: Meta<typeof CiStatusBadge>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof CiStatusBadge>;
6
+ /** CI passed — green badge with check icon. */
7
+ export declare const Success: Story;
8
+ /** CI pending — yellow badge with animated spinner. */
9
+ export declare const Pending: Story;
10
+ /** CI failed — red badge with X icon. */
11
+ export declare const Failure: Story;
12
+ //# sourceMappingURL=ci-status-badge.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-status-badge.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/ci-status-badge/ci-status-badge.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAIpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,aAAa,CAAC,CAAC;AAE5C,+CAA+C;AAC/C,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
2
+ import { CiStatusBadge } from './ci-status-badge.js';
3
+ const meta = {
4
+ title: 'Common/CiStatusBadge',
5
+ component: CiStatusBadge,
6
+ tags: ['autodocs'],
7
+ };
8
+ export default meta;
9
+ /** CI passed — green badge with check icon. */
10
+ export const Success = {
11
+ args: { status: CiStatus.Success },
12
+ };
13
+ /** CI pending — yellow badge with animated spinner. */
14
+ export const Pending = {
15
+ args: { status: CiStatus.Pending },
16
+ };
17
+ /** CI failed — red badge with X icon. */
18
+ export const Failure = {
19
+ args: { status: CiStatus.Failure },
20
+ };
@@ -0,0 +1,2 @@
1
+ export { CiStatusBadge } from './ci-status-badge.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/ci-status-badge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1 @@
1
+ export { CiStatusBadge } from './ci-status-badge.js';
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/feature-drawer.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGxE,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,aAAa,CAAC,EAC5B,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,UAAkB,GACnB,EAAE,kBAAkB,2CA2HpB"}
1
+ {"version":3,"file":"feature-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/feature-drawer.tsx"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGxE,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,aAAa,CAAC,EAC5B,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,UAAkB,GACnB,EAAE,kBAAkB,2CAmIpB"}
@@ -1,20 +1,23 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { XIcon, Loader2, Trash2 } from 'lucide-react';
3
+ import { XIcon, Loader2, Trash2, ExternalLink, GitCommitHorizontal } from 'lucide-react';
4
+ import { PrStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
4
5
  import { cn } from '../../../lib/utils.js';
5
6
  import { OpenActionMenu } from '../../common/open-action-menu/index.js';
6
7
  import { Drawer, DrawerContent, DrawerHeader, DrawerTitle, DrawerDescription, } from '../../ui/drawer.js';
7
8
  import { Button } from '../../ui/button.js';
9
+ import { Badge } from '../../ui/badge.js';
8
10
  import { Separator } from '../../ui/separator.js';
9
11
  import { CometSpinner } from '../../ui/comet-spinner.js';
10
12
  import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '../../ui/alert-dialog.js';
13
+ import { CiStatusBadge } from '../../common/ci-status-badge/index.js';
11
14
  import { featureNodeStateConfig, lifecycleDisplayLabels } from '../../common/feature-node/index.js';
12
15
  import { useFeatureActions } from './use-feature-actions.js';
13
16
  export function FeatureDrawer({ selectedNode, onClose, onDelete, isDeleting = false, }) {
14
17
  return (_jsx(Drawer, { direction: "right", modal: false, handleOnly: true, open: selectedNode !== null, onOpenChange: (open) => {
15
18
  if (!open)
16
19
  onClose();
17
- }, children: _jsx(DrawerContent, { direction: "right", className: "w-96", showCloseButton: false, children: selectedNode ? (_jsxs(_Fragment, { 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, { "data-testid": "feature-drawer-header", children: [_jsx(DrawerTitle, { children: selectedNode.name }), _jsx(DrawerDescription, { children: selectedNode.featureId })] }), selectedNode.repositoryPath && selectedNode.branch ? (_jsx(DrawerActions, { repositoryPath: selectedNode.repositoryPath, branch: selectedNode.branch, specPath: selectedNode.specPath })) : null, _jsx(Separator, {}), _jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[selectedNode.lifecycle] }), _jsx(StateBadge, { data: selectedNode }), selectedNode.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [selectedNode.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[selectedNode.state].progressClass), style: { width: `${selectedNode.progress}%` } }) })] })) : null] }), _jsx(Separator, {}), _jsx(DetailsSection, { data: selectedNode }), onDelete ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { "data-testid": "feature-drawer-delete", className: "p-4", children: _jsxs(AlertDialog, { children: [_jsx(AlertDialogTrigger, { asChild: true, children: _jsxs(Button, { variant: "destructive", className: "w-full", disabled: isDeleting, children: [_jsx(Trash2, { className: "mr-2 h-4 w-4" }), "Delete feature"] }) }), _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Delete feature?" }), _jsxs(AlertDialogDescription, { children: ["This will permanently delete ", _jsx("strong", { children: selectedNode.name }), " (", selectedNode.featureId, "). This action cannot be undone.", selectedNode.state === 'running' ? (_jsx(_Fragment, { children: " This feature has a running agent that will be stopped." })) : null] })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: isDeleting, children: "Cancel" }), _jsx(AlertDialogAction, { variant: "destructive", disabled: isDeleting, onClick: () => onDelete(selectedNode.featureId), children: isDeleting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Deleting\u2026"] })) : ('Delete') })] })] })] }) })] })) : null] })) : null }) }));
20
+ }, children: _jsx(DrawerContent, { direction: "right", className: "w-96", showCloseButton: false, children: selectedNode ? (_jsxs(_Fragment, { 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, { "data-testid": "feature-drawer-header", children: [_jsx(DrawerTitle, { children: selectedNode.name }), _jsx(DrawerDescription, { children: selectedNode.featureId })] }), selectedNode.repositoryPath && selectedNode.branch ? (_jsx(DrawerActions, { repositoryPath: selectedNode.repositoryPath, branch: selectedNode.branch, specPath: selectedNode.specPath })) : null, _jsx(Separator, {}), _jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[selectedNode.lifecycle] }), _jsx(StateBadge, { data: selectedNode }), selectedNode.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [selectedNode.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[selectedNode.state].progressClass), style: { width: `${selectedNode.progress}%` } }) })] })) : null] }), selectedNode.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx(PrInfoSection, { pr: selectedNode.pr })] })) : null, _jsx(Separator, {}), _jsx(DetailsSection, { data: selectedNode }), onDelete ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { "data-testid": "feature-drawer-delete", className: "p-4", children: _jsxs(AlertDialog, { children: [_jsx(AlertDialogTrigger, { asChild: true, children: _jsxs(Button, { variant: "destructive", className: "w-full", disabled: isDeleting, children: [_jsx(Trash2, { className: "mr-2 h-4 w-4" }), "Delete feature"] }) }), _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Delete feature?" }), _jsxs(AlertDialogDescription, { children: ["This will permanently delete ", _jsx("strong", { children: selectedNode.name }), " (", selectedNode.featureId, "). This action cannot be undone.", selectedNode.state === 'running' ? (_jsx(_Fragment, { children: " This feature has a running agent that will be stopped." })) : null] })] }), _jsxs(AlertDialogFooter, { children: [_jsx(AlertDialogCancel, { disabled: isDeleting, children: "Cancel" }), _jsx(AlertDialogAction, { variant: "destructive", disabled: isDeleting, onClick: () => onDelete(selectedNode.featureId), children: isDeleting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Deleting\u2026"] })) : ('Delete') })] })] })] }) })] })) : null] })) : null }) }));
18
21
  }
19
22
  function StateBadge({ data }) {
20
23
  const config = featureNodeStateConfig[data.state];
@@ -30,6 +33,14 @@ function DetailsSection({ data }) {
30
33
  function DetailRow({ label, value }) {
31
34
  return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: label }), _jsx("span", { className: "text-sm", children: value })] }));
32
35
  }
36
+ const prStatusStyles = {
37
+ [PrStatus.Open]: 'border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50',
38
+ [PrStatus.Merged]: 'border-transparent bg-purple-50 text-purple-700 hover:bg-purple-50',
39
+ [PrStatus.Closed]: 'border-transparent bg-red-50 text-red-700 hover:bg-red-50',
40
+ };
41
+ function PrInfoSection({ pr }) {
42
+ return (_jsx("div", { "data-testid": "feature-drawer-pr", className: "border-border mx-4 rounded-lg border", children: _jsxs("div", { className: "space-y-3 px-4 py-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("a", { href: pr.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2", children: ["PR #", pr.number, _jsx(ExternalLink, { className: "h-3.5 w-3.5" })] }), _jsx(Badge, { className: prStatusStyles[pr.status], children: pr.status })] }), pr.ciStatus ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "CI Status" }), _jsx(CiStatusBadge, { status: pr.ciStatus })] })) : null, pr.commitHash ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Commit" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("code", { className: "bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: pr.commitHash.slice(0, 7) })] })] })) : null] }) }));
43
+ }
33
44
  function DrawerActions({ repositoryPath, branch, specPath, }) {
34
45
  const actions = useFeatureActions({ repositoryPath, branch, specPath });
35
46
  return (_jsx("div", { className: "flex gap-2 px-4 pb-3", children: _jsx(OpenActionMenu, { actions: actions, repositoryPath: repositoryPath, showSpecs: !!specPath }) }));
@@ -30,4 +30,12 @@ export declare const WithDeleteButton: Story;
30
30
  export declare const DeletingState: Story;
31
31
  /** FeatureDrawer with a running agent showing the running-agent warning in the AlertDialog. */
32
32
  export declare const DeleteRunningAgent: Story;
33
+ /** Done feature with full PR card — number, status, CI, commit hash. */
34
+ export declare const DoneWithPr: Story;
35
+ /** Done feature with partial PR data — no CI status, no commit hash. */
36
+ export declare const DoneWithPartialPr: Story;
37
+ /** PR with Open status — blue badge. */
38
+ export declare const PrStatusOpen: Story;
39
+ /** PR with Merged status — purple badge. */
40
+ export declare const PrStatusMerged: Story;
33
41
  //# sourceMappingURL=feature-drawer.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/feature-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAOpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,aAAa,CAAC,CAAC;AAgG5C,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAMF,wEAAwE;AACxE,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,SAAS,EAAE,KAqBvB,CAAC;AAmEF,0DAA0D;AAC1D,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AA6CF,wDAAwD;AACxD,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAMF,qDAAqD;AACrD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAoCF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,kBAAkB,EAAE,KAEhC,CAAC"}
1
+ {"version":3,"file":"feature-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/feature-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKjD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAOpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,aAAa,CAAC,CAAC;AAgG5C,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAMF,wEAAwE;AACxE,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,SAAS,EAAE,KAqBvB,CAAC;AAmEF,0DAA0D;AAC1D,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AA6CF,wDAAwD;AACxD,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAMF,qDAAqD;AACrD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAoCF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,kBAAkB,EAAE,KAEhC,CAAC;AA0BF,wEAAwE;AACxE,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,YAAY,EAAE,KAU1B,CAAC;AAEF,4CAA4C;AAC5C,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useState } from 'react';
3
+ import { PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
3
4
  import { FeatureDrawer } from './feature-drawer.js';
4
5
  import { Button } from '../../ui/button.js';
5
6
  const meta = {
@@ -229,3 +230,43 @@ export const DeletingState = {
229
230
  export const DeleteRunningAgent = {
230
231
  render: () => _jsx(DrawerTriggerWithDelete, { data: runningData, label: "Open Running Agent Delete" }),
231
232
  };
233
+ /* ---------------------------------------------------------------------------
234
+ * PR info stories
235
+ * ------------------------------------------------------------------------- */
236
+ const doneWithPrData = {
237
+ ...doneData,
238
+ pr: {
239
+ url: 'https://github.com/org/repo/pull/42',
240
+ number: 42,
241
+ status: PrStatus.Merged,
242
+ ciStatus: CiStatus.Success,
243
+ commitHash: 'abc1234567890def',
244
+ },
245
+ };
246
+ const doneWithPartialPrData = {
247
+ ...doneData,
248
+ pr: {
249
+ url: 'https://github.com/org/repo/pull/99',
250
+ number: 99,
251
+ status: PrStatus.Merged,
252
+ },
253
+ };
254
+ /** Done feature with full PR card — number, status, CI, commit hash. */
255
+ export const DoneWithPr = {
256
+ render: () => _jsx(DrawerTrigger, { data: doneWithPrData, label: "Open Done + PR" }),
257
+ };
258
+ /** Done feature with partial PR data — no CI status, no commit hash. */
259
+ export const DoneWithPartialPr = {
260
+ render: () => _jsx(DrawerTrigger, { data: doneWithPartialPrData, label: "Open Done + Partial PR" }),
261
+ };
262
+ /** PR with Open status — blue badge. */
263
+ export const PrStatusOpen = {
264
+ render: () => (_jsx(DrawerTrigger, { data: {
265
+ ...doneWithPrData,
266
+ pr: { ...doneWithPrData.pr, status: PrStatus.Open, ciStatus: CiStatus.Pending },
267
+ }, label: "Open PR Status: Open" })),
268
+ };
269
+ /** PR with Merged status — purple badge. */
270
+ export const PrStatusMerged = {
271
+ render: () => _jsx(DrawerTrigger, { data: doneWithPrData, label: "Open PR Status: Merged" }),
272
+ };
@@ -1,5 +1,6 @@
1
1
  import { type LucideIcon } from 'lucide-react';
2
2
  import type { Node } from '@xyflow/react';
3
+ import type { PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
3
4
  import type { AgentTypeValue } from './agent-type-icons.js';
4
5
  export type FeatureNodeState = 'creating' | 'running' | 'action-required' | 'done' | 'blocked' | 'error';
5
6
  export type FeatureLifecyclePhase = 'requirements' | 'research' | 'implementation' | 'review' | 'deploy' | 'maintain';
@@ -29,6 +30,14 @@ export interface FeatureNodeData {
29
30
  errorMessage?: string;
30
31
  /** Agent executor type (e.g. "claude-code", "cursor"). */
31
32
  agentType?: AgentTypeValue;
33
+ /** PR metadata for features with an associated pull request */
34
+ pr?: {
35
+ url: string;
36
+ number: number;
37
+ status: PrStatus;
38
+ ciStatus?: CiStatus;
39
+ commitHash?: string;
40
+ };
32
41
  onAction?: () => void;
33
42
  onSettings?: () => void;
34
43
  showHandles?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmD,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,SAAS,GACT,iBAAiB,GACjB,MAAM,GACN,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,MAAM,qBAAqB,GAC7B,cAAc,GACd,UAAU,GACV,gBAAgB,GAChB,QAAQ,GACR,QAAQ,GACR,UAAU,CAAC;AAEf,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAOxE,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAOvE,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,qBAAqB,CAAC;IACjC,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CA6DnF,CAAC"}
1
+ {"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmD,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,MAAM,gBAAgB,GACxB,UAAU,GACV,SAAS,GACT,iBAAiB,GACjB,MAAM,GACN,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,MAAM,qBAAqB,GAC7B,cAAc,GACd,UAAU,GACV,gBAAgB,GAChB,QAAQ,GACR,QAAQ,GACR,UAAU,CAAC;AAEf,0DAA0D;AAC1D,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAOxE,CAAC;AAEF,gFAAgF;AAChF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAOvE,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,qBAAqB,CAAC;IACjC,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,+DAA+D;IAC/D,EAAE,CAAC,EAAE;QACH,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,QAAQ,CAAC;QACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AAEnE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CA6DnF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"merge-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,uBAAuB,CAAC;AA0DhF,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,YAAoB,EACpB,WAAmB,GACpB,EAAE,gBAAgB,2CA4IlB"}
1
+ {"version":3,"file":"merge-review.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/merge-review.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,gBAAgB,EAAoB,MAAM,uBAAuB,CAAC;AAgChF,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,YAAoB,EACpB,WAAmB,GACpB,EAAE,gBAAgB,2CA4IlB"}
@@ -1,19 +1,9 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { CheckCircle2, ExternalLink, GitMerge, Loader2, XCircle, AlertTriangle, FileDiff, GitCommitHorizontal, GitBranch, ArrowRight, Layers, } from 'lucide-react';
4
- import { CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
3
+ import { ExternalLink, GitMerge, Loader2, AlertTriangle, FileDiff, GitCommitHorizontal, GitBranch, ArrowRight, Layers, } from 'lucide-react';
5
4
  import { Badge } from '../../ui/badge.js';
5
+ import { CiStatusBadge } from '../../common/ci-status-badge/index.js';
6
6
  import { DrawerActionBar } from '../../common/drawer-action-bar/index.js';
7
- function CiStatusBadge({ status }) {
8
- switch (status) {
9
- case CiStatus.Success:
10
- return (_jsxs(Badge, { className: "border-transparent bg-green-50 text-green-700 hover:bg-green-50", children: [_jsx(CheckCircle2, { className: "mr-1 h-3.5 w-3.5" }), "Passing"] }));
11
- case CiStatus.Pending:
12
- return (_jsxs(Badge, { className: "border-transparent bg-yellow-50 text-yellow-700 hover:bg-yellow-50", children: [_jsx(Loader2, { className: "mr-1 h-3.5 w-3.5 animate-spin" }), "Pending"] }));
13
- case CiStatus.Failure:
14
- return (_jsxs(Badge, { className: "border-transparent bg-red-50 text-red-700 hover:bg-red-50", children: [_jsx(XCircle, { className: "mr-1 h-3.5 w-3.5" }), "Failing"] }));
15
- }
16
- }
17
7
  function PhaseList({ phases }) {
18
8
  return (_jsx("div", { className: "border-border rounded-lg border", children: _jsxs("div", { className: "px-4 py-3", children: [_jsxs("div", { className: "mb-3 flex items-center gap-2", children: [_jsx(Layers, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Implementation Phases" })] }), _jsx("ol", { className: "space-y-2", children: phases.map((phase, i) => (_jsxs("li", { className: "flex items-start gap-2.5", children: [_jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-emerald-100 text-[10px] font-bold text-emerald-700", children: i + 1 }), _jsxs("div", { className: "min-w-0", children: [_jsx("span", { className: "text-foreground text-xs font-medium", children: phase.name }), phase.description ? (_jsx("p", { className: "text-muted-foreground mt-0.5 text-[11px] leading-relaxed", children: phase.description })) : null] })] }, phase.id))) })] }) }));
19
9
  }