@shepai/cli 1.85.0-pr167.6a51d2e → 1.85.0-pr167.980b2b5

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 (138) hide show
  1. package/dist/packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.d.ts.map +1 -1
  2. package/dist/packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.js +8 -8
  3. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  4. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +4 -5
  5. package/dist/tsconfig.build.tsbuildinfo +1 -1
  6. package/package.json +1 -1
  7. package/web/.next/BUILD_ID +1 -1
  8. package/web/.next/build-manifest.json +2 -2
  9. package/web/.next/fallback-build-manifest.json +2 -2
  10. package/web/.next/prerender-manifest.json +3 -3
  11. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
  12. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  13. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  14. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +21 -21
  15. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  16. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  17. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  18. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  19. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  20. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +18 -18
  21. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  22. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  23. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +21 -21
  24. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  25. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  26. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  27. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  28. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  29. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  30. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  31. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/_global-error.html +2 -2
  33. package/web/.next/server/app/_global-error.rsc +1 -1
  34. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  35. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  36. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  37. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  38. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  39. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  40. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  42. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  43. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  45. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  47. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  49. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  51. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  52. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_9751e686._.js +3 -0
  53. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_9751e686._.js.map +1 -0
  54. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  55. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  56. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  57. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  58. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  59. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  60. package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js +1 -1
  61. package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js.map +1 -1
  62. package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
  63. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  64. package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js +1 -1
  65. package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js.map +1 -1
  66. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  67. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  68. package/web/.next/server/chunks/ssr/[root-of-the-server]__ae824a5b._.js +3 -0
  69. package/web/.next/server/chunks/ssr/[root-of-the-server]__ae824a5b._.js.map +1 -0
  70. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js +1 -1
  71. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js.map +1 -1
  72. package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js +2 -2
  73. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  74. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  75. package/web/.next/server/chunks/ssr/{_f942df4a._.js → _0b848752._.js} +2 -2
  76. package/web/.next/server/chunks/ssr/{_f942df4a._.js.map → _0b848752._.js.map} +1 -1
  77. package/web/.next/server/chunks/ssr/_1e3cf73b._.js +1 -1
  78. package/web/.next/server/chunks/ssr/_1e3cf73b._.js.map +1 -1
  79. package/web/.next/server/chunks/ssr/_63868199._.js +1 -1
  80. package/web/.next/server/chunks/ssr/_63868199._.js.map +1 -1
  81. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  82. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  83. package/web/.next/server/chunks/ssr/_a68d7e1c._.js +1 -1
  84. package/web/.next/server/chunks/ssr/_a68d7e1c._.js.map +1 -1
  85. package/web/.next/server/chunks/ssr/_d42594dd._.js +1 -1
  86. package/web/.next/server/chunks/ssr/_d42594dd._.js.map +1 -1
  87. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  88. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/node_modules__pnpm_d80c1060._.js +3 -0
  90. package/web/.next/server/chunks/ssr/node_modules__pnpm_d80c1060._.js.map +1 -0
  91. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  92. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  93. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  94. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  95. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  96. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  97. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
  98. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
  99. package/web/.next/server/chunks/ssr/src_presentation_web_components_80b5b4bc._.js +3 -0
  100. package/web/.next/server/chunks/ssr/src_presentation_web_components_80b5b4bc._.js.map +1 -0
  101. package/web/.next/server/chunks/ssr/src_presentation_web_components_82416b8f._.js +3 -0
  102. package/web/.next/server/chunks/ssr/src_presentation_web_components_82416b8f._.js.map +1 -0
  103. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  104. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  105. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
  106. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +1 -1
  107. package/web/.next/server/pages/500.html +2 -2
  108. package/web/.next/server/server-reference-manifest.js +1 -1
  109. package/web/.next/server/server-reference-manifest.json +28 -28
  110. package/web/.next/static/chunks/{f56c201e14d8ddf6.js → 38fdde24a1515d32.js} +1 -1
  111. package/web/.next/static/chunks/{63626066e7086cbd.js → 39d023c65b97d443.js} +2 -2
  112. package/web/.next/static/chunks/3ac3cd1ace6df307.js +1 -0
  113. package/web/.next/static/chunks/{dde79813a9022aeb.js → 54b44bf36afd3700.js} +1 -1
  114. package/web/.next/static/chunks/809ff17e8e6716e2.js +1 -0
  115. package/web/.next/static/chunks/{90c7780bce73ecd2.js → 990156878e45adbf.js} +1 -1
  116. package/web/.next/static/chunks/9940c6562aedb301.js +1 -0
  117. package/web/.next/static/chunks/a1c2ecb710b44081.js +1 -0
  118. package/web/.next/static/chunks/b0092a380441d7ea.js +1 -0
  119. package/web/.next/static/chunks/{16fe11f10a119519.js → ce4baaa5b4d40f6c.js} +1 -1
  120. package/web/.next/static/chunks/{40b9e74b44955a46.js → d8b5b0720f70666e.js} +1 -1
  121. package/web/.next/server/chunks/ssr/[root-of-the-server]__7134fb85._.js +0 -3
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__7134fb85._.js.map +0 -1
  123. package/web/.next/server/chunks/ssr/_d2d64567._.js +0 -3
  124. package/web/.next/server/chunks/ssr/_d2d64567._.js.map +0 -1
  125. package/web/.next/server/chunks/ssr/_fa0c43f6._.js +0 -3
  126. package/web/.next/server/chunks/ssr/_fa0c43f6._.js.map +0 -1
  127. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +0 -3
  128. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +0 -1
  129. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +0 -3
  130. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +0 -1
  131. package/web/.next/static/chunks/2a8d259fc0cdff2d.js +0 -1
  132. package/web/.next/static/chunks/3e8563e1c30fa11d.js +0 -1
  133. package/web/.next/static/chunks/5c4f9fea532f70b7.js +0 -1
  134. package/web/.next/static/chunks/6973367e995e5687.js +0 -1
  135. package/web/.next/static/chunks/7948d121144c9676.js +0 -1
  136. /package/web/.next/static/{kHnKnlUMoFHN49jX7Vp6o → j0veE9VyiEGY-OKWxJdSw}/_buildManifest.js +0 -0
  137. /package/web/.next/static/{kHnKnlUMoFHN49jX7Vp6o → j0veE9VyiEGY-OKWxJdSw}/_clientMiddlewareManifest.json +0 -0
  138. /package/web/.next/static/{kHnKnlUMoFHN49jX7Vp6o → j0veE9VyiEGY-OKWxJdSw}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"cleanup-feature-worktree.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAE7F,qBACa,6BAA6B;IAER,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFP,WAAW,EAAE,kBAAkB,EACjC,eAAe,EAAE,gBAAgB,EACpC,YAAY,EAAE,aAAa;IAGjE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAqChD"}
1
+ {"version":3,"file":"cleanup-feature-worktree.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAE7F,qBACa,6BAA6B;IAER,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFP,WAAW,EAAE,kBAAkB,EACjC,eAAe,EAAE,gBAAgB,EACpC,YAAY,EAAE,aAAa;IAGjE,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAoChD"}
@@ -36,14 +36,14 @@ let CleanupFeatureWorktreeUseCase = class CleanupFeatureWorktreeUseCase {
36
36
  if (!feature)
37
37
  return;
38
38
  // Step 1: Unlink the git worktree (directory contents are preserved on disk)
39
- const worktreePath = feature.worktreePath ??
40
- this.worktreeService.getWorktreePath(feature.repositoryPath, feature.branch);
41
- try {
42
- await this.worktreeService.remove(worktreePath, true);
43
- }
44
- catch (err) {
45
- // eslint-disable-next-line no-console
46
- console.warn('[CleanupFeatureWorktreeUseCase] worktree remove failed:', err);
39
+ if (feature.worktreePath) {
40
+ try {
41
+ await this.worktreeService.remove(feature.worktreePath, true);
42
+ }
43
+ catch (err) {
44
+ // eslint-disable-next-line no-console
45
+ console.warn('[CleanupFeatureWorktreeUseCase] worktree remove failed:', err);
46
+ }
47
47
  }
48
48
  // Step 2: Delete the local feature branch
49
49
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAqCA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,wBAAwB,2CA6hBlF"}
1
+ {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,wBAAwB,2CAkjBlF"}
@@ -20,7 +20,7 @@ import { DeploymentStatusBadge } from '../../common/deployment-status-badge/inde
20
20
  import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
21
21
  import { Button } from '../../ui/button.js';
22
22
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
23
- import { DeleteFeatureDialog } from '../../common/delete-feature-dialog/index.js';
23
+ import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, } from '../../ui/alert-dialog.js';
24
24
  import { ActionButton } from '../../common/action-button/index.js';
25
25
  import { OpenActionMenu } from '../../common/open-action-menu/index.js';
26
26
  import { FeatureDrawerTabs } from '../../common/feature-drawer-tabs/index.js';
@@ -111,7 +111,6 @@ export function FeatureDrawerClient({ view: initialView }) {
111
111
  const [mergeData, setMergeData] = useState(null);
112
112
  // ── Delete state ───────────────────────────────────────────────────────
113
113
  const [isDeleting, setIsDeleting] = useState(false);
114
- const [deleteDialogOpen, setDeleteDialogOpen] = useState(false);
115
114
  // ── Shared reject state ────────────────────────────────────────────────
116
115
  const [isRejecting, setIsRejecting] = useState(false);
117
116
  const isRejectingRef = useRef(false);
@@ -262,10 +261,10 @@ export function FeatureDrawerClient({ view: initialView }) {
262
261
  }, [view, featureNode, prdData, prdSelections, onClose]);
263
262
  const handleTechApprove = useCallback(() => handleSimpleApprove('Plan'), [handleSimpleApprove]);
264
263
  const handleMergeApprove = useCallback(() => handleSimpleApprove('Merge'), [handleSimpleApprove]);
265
- const handleDelete = useCallback(async (featureId, cleanup) => {
264
+ const handleDelete = useCallback(async (featureId) => {
266
265
  setIsDeleting(true);
267
266
  try {
268
- const result = await deleteFeature(featureId, cleanup);
267
+ const result = await deleteFeature(featureId);
269
268
  if (result.error) {
270
269
  toast.error(result.error);
271
270
  return;
@@ -318,7 +317,7 @@ export function FeatureDrawerClient({ view: initialView }) {
318
317
  const repoName = featureNode.repositoryName ??
319
318
  featureNode.repositoryPath.split('/').filter(Boolean).at(-1) ??
320
319
  '';
321
- header = (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-header", children: [_jsx(DrawerTitle, { children: featureNode.name }), repoName ? (_jsxs("div", { className: "flex items-center gap-1.5 pt-0.5", children: [_jsx(Code2, { className: "text-muted-foreground size-3.5 shrink-0" }), featureNode.remoteUrl ? (_jsxs("a", { href: featureNode.remoteUrl, target: "_blank", rel: "noopener noreferrer", className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs transition-colors", "data-testid": "feature-drawer-repo-link", children: [repoName, _jsx(ExternalLink, { className: "size-3" })] })) : (_jsx("span", { className: "text-muted-foreground text-xs", children: repoName }))] })) : null, _jsx(DrawerDescription, { className: "sr-only", children: featureNode.name })] }), featureActionsInput ? (_jsxs("div", { className: "flex items-center gap-2 pt-2", "data-testid": "feature-drawer-actions", children: [_jsx(OpenActionMenu, { actions: featureActions, repositoryPath: featureActionsInput.repositoryPath, showSpecs: !!featureActionsInput.specPath }), featureFlags.envDeploy && featureDeployTarget ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isFeatureDeployActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isFeatureDeployActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isFeatureDeployActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: featureDeployTarget?.targetId })) : null] })) : null, _jsxs("div", { className: "ml-auto flex items-center gap-1.5", children: [_jsx("code", { className: "bg-muted text-muted-foreground rounded px-1.5 py-0.5 font-mono text-xs", children: shortId }), _jsx("button", { type: "button", onClick: handleCopyId, className: "text-muted-foreground hover:text-foreground inline-flex items-center rounded p-0.5 transition-colors", "aria-label": "Copy feature ID", "data-testid": "feature-drawer-copy-id", children: idCopied ? (_jsx(Check, { className: "size-3.5 text-green-600" })) : (_jsx(Copy, { className: "size-3.5" })) })] }), featureNode.featureId ? (_jsxs(_Fragment, { children: [_jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Delete feature", disabled: isDeleting, className: "text-muted-foreground hover:text-destructive", "data-testid": "feature-drawer-delete", onClick: () => setDeleteDialogOpen(true), children: isDeleting ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(Trash2, { className: "size-4" })) }), _jsx(DeleteFeatureDialog, { open: deleteDialogOpen, onOpenChange: setDeleteDialogOpen, onConfirm: (cleanup) => handleDelete(featureNode.featureId, cleanup), isDeleting: isDeleting, featureName: featureNode.name, featureId: featureNode.featureId })] })) : null] })) : null] }));
320
+ header = (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-header", children: [_jsx(DrawerTitle, { children: featureNode.name }), repoName ? (_jsxs("div", { className: "flex items-center gap-1.5 pt-0.5", children: [_jsx(Code2, { className: "text-muted-foreground size-3.5 shrink-0" }), featureNode.remoteUrl ? (_jsxs("a", { href: featureNode.remoteUrl, target: "_blank", rel: "noopener noreferrer", className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1 text-xs transition-colors", "data-testid": "feature-drawer-repo-link", children: [repoName, _jsx(ExternalLink, { className: "size-3" })] })) : (_jsx("span", { className: "text-muted-foreground text-xs", children: repoName }))] })) : null, _jsx(DrawerDescription, { className: "sr-only", children: featureNode.name })] }), featureActionsInput ? (_jsxs("div", { className: "flex items-center gap-2 pt-2", "data-testid": "feature-drawer-actions", children: [_jsx(OpenActionMenu, { actions: featureActions, repositoryPath: featureActionsInput.repositoryPath, showSpecs: !!featureActionsInput.specPath }), featureFlags.envDeploy && featureDeployTarget ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isFeatureDeployActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isFeatureDeployActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isFeatureDeployActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isFeatureDeployActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: featureDeployTarget?.targetId })) : null] })) : null, _jsxs("div", { className: "ml-auto flex items-center gap-1.5", children: [_jsx("code", { className: "bg-muted text-muted-foreground rounded px-1.5 py-0.5 font-mono text-xs", children: shortId }), _jsx("button", { type: "button", onClick: handleCopyId, className: "text-muted-foreground hover:text-foreground inline-flex items-center rounded p-0.5 transition-colors", "aria-label": "Copy feature ID", "data-testid": "feature-drawer-copy-id", children: idCopied ? (_jsx(Check, { className: "size-3.5 text-green-600" })) : (_jsx(Copy, { className: "size-3.5" })) })] }), featureNode.featureId ? (_jsxs(AlertDialog, { children: [_jsx(AlertDialogTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon-sm", "aria-label": "Delete feature", disabled: isDeleting, className: "text-muted-foreground hover:text-destructive", "data-testid": "feature-drawer-delete", children: isDeleting ? (_jsx(Loader2, { className: "size-4 animate-spin" })) : (_jsx(Trash2, { className: "size-4" })) }) }), _jsxs(AlertDialogContent, { children: [_jsxs(AlertDialogHeader, { children: [_jsx(AlertDialogTitle, { children: "Delete feature?" }), _jsxs(AlertDialogDescription, { children: ["This will permanently delete ", _jsx("strong", { children: featureNode.name }), " (", featureNode.featureId, "). This action cannot be undone.", featureNode.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: () => handleDelete(featureNode.featureId), children: isDeleting ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "mr-2 h-4 w-4 animate-spin" }), "Deleting\u2026"] })) : ('Delete') })] })] })] })) : null] })) : null] }));
322
321
  }
323
322
  // ── Body ──────────────────────────────────────────────────────────────
324
323
  let body = null;