@shepai/cli 1.85.0 → 1.86.1
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/dist/packages/core/src/application/ports/output/services/worktree-service.interface.d.ts +2 -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/cleanup-feature-worktree.use-case.d.ts +22 -0
- package/dist/packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.js +76 -0
- package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts +7 -2
- package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.js +29 -15
- 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 +3 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts +2 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +3 -0
- package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts +1 -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 +6 -2
- package/dist/src/presentation/cli/commands/feat/del.command.d.ts +3 -1
- package/dist/src/presentation/cli/commands/feat/del.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/del.command.js +19 -2
- package/dist/src/presentation/web/app/actions/delete-feature.d.ts +1 -1
- package/dist/src/presentation/web/app/actions/delete-feature.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/delete-feature.js +4 -2
- package/dist/src/presentation/web/app/api/attachments/upload-from-path/route.d.ts +3 -0
- package/dist/src/presentation/web/app/api/attachments/upload-from-path/route.d.ts.map +1 -0
- package/dist/src/presentation/web/app/api/attachments/upload-from-path/route.js +120 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +5 -4
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog-config.d.ts +9 -0
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog-config.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog-config.js +1 -0
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.d.ts +3 -0
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.js +16 -0
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.d.ts +8 -0
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.js +25 -0
- package/dist/src/presentation/web/components/common/delete-feature-dialog/index.d.ts +3 -0
- package/dist/src/presentation/web/components/common/delete-feature-dialog/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/delete-feature-dialog/index.js +1 -0
- 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 +38 -13
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- 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 +5 -7
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -1
- 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 +2 -2
- package/dist/src/presentation/web/lib/derive-graph.d.ts +1 -1
- package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/app-path-routes-manifest.json +1 -0
- package/web/.next/build-manifest.json +2 -2
- 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/routes-manifest.json +6 -0
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +21 -21
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +18 -18
- package/web/.next/server/app/(dashboard)/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +21 -21
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/page.js +1 -1
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error/page.js +1 -1
- package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
- package/web/.next/server/app/_global-error/page_client-reference-manifest.js +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/server-reference-manifest.json +1 -1
- package/web/.next/server/app/_not-found/page.js +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/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/attachments/upload-from-path/route/app-paths-manifest.json +3 -0
- package/web/.next/server/app/api/attachments/upload-from-path/route/build-manifest.json +11 -0
- package/web/.next/server/app/api/attachments/upload-from-path/route/server-reference-manifest.json +4 -0
- package/web/.next/server/app/api/attachments/upload-from-path/route.js +7 -0
- package/web/.next/server/app/api/attachments/upload-from-path/route.js.map +5 -0
- package/web/.next/server/app/api/attachments/upload-from-path/route.js.nft.json +1 -0
- package/web/.next/server/app/api/attachments/upload-from-path/route_client-reference-manifest.js +2 -0
- package/web/.next/server/app/api/feature-logs/route.js +1 -1
- package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
- package/web/.next/server/app/settings/page.js +1 -1
- package/web/.next/server/app/settings/page.js.nft.json +1 -1
- package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/skills/page.js +1 -1
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/tools/page.js +1 -1
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
- package/web/.next/server/app/version/page.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/app-paths-manifest.json +1 -0
- package/web/.next/server/chunks/8ba4b_server_app_api_attachments_upload-from-path_route_actions_05020a44.js +3 -0
- package/web/.next/server/chunks/8ba4b_server_app_api_attachments_upload-from-path_route_actions_05020a44.js.map +1 -0
- package/web/.next/server/chunks/[root-of-the-server]__a5879003._.js +3 -0
- package/web/.next/server/chunks/[root-of-the-server]__a5879003._.js.map +1 -0
- package/web/.next/server/chunks/{[root-of-the-server]__52c318d1._.js → [root-of-the-server]__d8037e14._.js} +2 -2
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__8d9536c4._.js → [root-of-the-server]__248ee887._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4af0afe0._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__f8210f45._.js → [root-of-the-server]__9bc1434f._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__f1a05100._.js → [root-of-the-server]__b062b383._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +3 -0
- package/web/.next/server/chunks/ssr/{_63868199._.js.map → _135edb9c._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_5860e4e2._.js +3 -0
- package/web/.next/server/chunks/ssr/_5860e4e2._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_6bffa94a._.js → _61480424._.js} +2 -2
- package/web/.next/server/chunks/ssr/_61480424._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_752e01fd._.js +3 -0
- package/web/.next/server/chunks/ssr/_752e01fd._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
- package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a68d7e1c._.js +1 -1
- package/web/.next/server/chunks/ssr/_a68d7e1c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +3 -0
- package/web/.next/server/chunks/ssr/{_1e3cf73b._.js.map → _cc77a143._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_e6f2da4f._.js +7 -0
- package/web/.next/server/chunks/ssr/{_34fbed18._.js.map → _e6f2da4f._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
- package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.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 +28 -28
- package/web/.next/static/chunks/{5b707c839eafb404.js → 0b3852464455cb56.js} +2 -2
- package/web/.next/static/chunks/177579b39fd0f63a.js +1 -0
- package/web/.next/static/chunks/866566643c6aaecf.js +1 -0
- package/web/.next/static/chunks/8d82ff1402dcf377.js +1 -0
- package/web/.next/static/chunks/9d59d178a1e154b2.js +1 -0
- package/web/.next/static/chunks/c7a4303d3cf08477.js +1 -0
- package/web/.next/static/chunks/{31c1e96c4cfeb16b.js → dd6c69087923da49.js} +2 -2
- package/web/.next/static/chunks/dd6cd59c8f439583.js +1 -0
- package/web/.next/static/chunks/e1edce9ef55b5824.js +1 -0
- package/web/.next/static/chunks/{26f58bbf4766e1c4.js → f46a0078f2ee9c44.js} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b65f78cf._.js +0 -3
- package/web/.next/server/chunks/ssr/_1e3cf73b._.js +0 -3
- package/web/.next/server/chunks/ssr/_34fbed18._.js +0 -7
- package/web/.next/server/chunks/ssr/_63868199._.js +0 -3
- package/web/.next/server/chunks/ssr/_6bffa94a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_d42594dd._.js +0 -3
- package/web/.next/server/chunks/ssr/_d42594dd._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules__pnpm_d80c1060._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_d80c1060._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_80b5b4bc._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_components_80b5b4bc._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_82416b8f._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_components_82416b8f._.js.map +0 -1
- package/web/.next/static/chunks/79f610312f57dc66.js +0 -1
- package/web/.next/static/chunks/8fa4bf83842a3389.js +0 -1
- package/web/.next/static/chunks/c9333b53106c0ca9.js +0 -1
- package/web/.next/static/chunks/ce7a578a83924232.js +0 -1
- package/web/.next/static/chunks/d8e93250744112df.js +0 -1
- package/web/.next/static/chunks/da7d7608abd1032f.js +0 -1
- package/web/.next/static/chunks/df38705b7992b33f.js +0 -1
- /package/web/.next/server/chunks/{[root-of-the-server]__52c318d1._.js.map → [root-of-the-server]__d8037e14._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__8d9536c4._.js.map → [root-of-the-server]__248ee887._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__b65f78cf._.js.map → [root-of-the-server]__4af0afe0._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__f8210f45._.js.map → [root-of-the-server]__9bc1434f._.js.map} +0 -0
- /package/web/.next/server/chunks/ssr/{[root-of-the-server]__f1a05100._.js.map → [root-of-the-server]__b062b383._.js.map} +0 -0
- /package/web/.next/static/{Lf0zFNsMS4qCNRm_LSgya → T8HBuz_VR2eZQbNRNSohp}/_buildManifest.js +0 -0
- /package/web/.next/static/{Lf0zFNsMS4qCNRm_LSgya → T8HBuz_VR2eZQbNRNSohp}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{Lf0zFNsMS4qCNRm_LSgya → T8HBuz_VR2eZQbNRNSohp}/_ssgManifest.js +0 -0
package/dist/packages/core/src/application/ports/output/services/worktree-service.interface.d.ts
CHANGED
|
@@ -54,9 +54,10 @@ export interface IWorktreeService {
|
|
|
54
54
|
* Remove an existing worktree.
|
|
55
55
|
*
|
|
56
56
|
* @param worktreePath - Path to the worktree to remove
|
|
57
|
+
* @param force - When true, passes --force to git worktree remove (handles dirty worktrees)
|
|
57
58
|
* @throws WorktreeError if worktree not found or has uncommitted changes
|
|
58
59
|
*/
|
|
59
|
-
remove(worktreePath: string): Promise<void>;
|
|
60
|
+
remove(worktreePath: string, force?: boolean): Promise<void>;
|
|
60
61
|
/**
|
|
61
62
|
* List all worktrees in a repository.
|
|
62
63
|
*
|
package/dist/packages/core/src/application/ports/output/services/worktree-service.interface.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/worktree-service.interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,oBAAY,iBAAiB;IAC3B,cAAc,mBAAmB;IACjC,aAAa,kBAAkB;IAC/B,SAAS,cAAc;IACvB,cAAc,mBAAmB;IACjC,SAAS,cAAc;CACxB;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;aAGpB,IAAI,EAAE,iBAAiB;aACvB,KAAK,CAAC,EAAE,KAAK;gBAF7B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,iBAAiB,EACvB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;;OASG;IACH,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB
|
|
1
|
+
{"version":3,"file":"worktree-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/worktree-service.interface.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,8CAA8C;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,oBAAY,iBAAiB;IAC3B,cAAc,mBAAmB;IACjC,aAAa,kBAAkB;IAC/B,SAAS,cAAc;IACvB,cAAc,mBAAmB;IACjC,SAAS,cAAc;CACxB;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,KAAK;aAGpB,IAAI,EAAE,iBAAiB;aACvB,KAAK,CAAC,EAAE,KAAK;gBAF7B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,iBAAiB,EACvB,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;;;OASG;IACH,MAAM,CACJ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB;;;;;;OAMG;IACH,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7D;;;;;OAKG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEhD;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3D;;;;;;OAMG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEjE;;;;;;OAMG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEvE;;;;;;OAMG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAE1D;;;;;;;OAOG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtD"}
|
package/dist/packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cleanup Feature Worktree Use Case
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates post-merge cleanup after a feature reaches SdlcLifecycle.Maintain:
|
|
5
|
+
* - Unlinks the git worktree (preserving directory contents on disk)
|
|
6
|
+
* - Deletes the local feature branch
|
|
7
|
+
* - Deletes the remote feature branch (if it still exists)
|
|
8
|
+
*
|
|
9
|
+
* All cleanup steps are non-fatal: errors are caught and logged as warnings
|
|
10
|
+
* so that a cleanup failure never surfaces as a feature run failure.
|
|
11
|
+
*/
|
|
12
|
+
import type { IFeatureRepository } from '../../ports/output/repositories/feature-repository.interface.js';
|
|
13
|
+
import type { IWorktreeService } from '../../ports/output/services/worktree-service.interface.js';
|
|
14
|
+
import type { IGitPrService } from '../../ports/output/services/git-pr-service.interface.js';
|
|
15
|
+
export declare class CleanupFeatureWorktreeUseCase {
|
|
16
|
+
private readonly featureRepo;
|
|
17
|
+
private readonly worktreeService;
|
|
18
|
+
private readonly gitPrService;
|
|
19
|
+
constructor(featureRepo: IFeatureRepository, worktreeService: IWorktreeService, gitPrService: IGitPrService);
|
|
20
|
+
execute(featureId: string): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=cleanup-feature-worktree.use-case.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/packages/core/src/application/use-cases/features/cleanup-feature-worktree.use-case.js
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cleanup Feature Worktree Use Case
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates post-merge cleanup after a feature reaches SdlcLifecycle.Maintain:
|
|
5
|
+
* - Unlinks the git worktree (preserving directory contents on disk)
|
|
6
|
+
* - Deletes the local feature branch
|
|
7
|
+
* - Deletes the remote feature branch (if it still exists)
|
|
8
|
+
*
|
|
9
|
+
* All cleanup steps are non-fatal: errors are caught and logged as warnings
|
|
10
|
+
* so that a cleanup failure never surfaces as a feature run failure.
|
|
11
|
+
*/
|
|
12
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
13
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
14
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
15
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
16
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
17
|
+
};
|
|
18
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
19
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
20
|
+
};
|
|
21
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
22
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
23
|
+
};
|
|
24
|
+
import { injectable, inject } from 'tsyringe';
|
|
25
|
+
let CleanupFeatureWorktreeUseCase = class CleanupFeatureWorktreeUseCase {
|
|
26
|
+
featureRepo;
|
|
27
|
+
worktreeService;
|
|
28
|
+
gitPrService;
|
|
29
|
+
constructor(featureRepo, worktreeService, gitPrService) {
|
|
30
|
+
this.featureRepo = featureRepo;
|
|
31
|
+
this.worktreeService = worktreeService;
|
|
32
|
+
this.gitPrService = gitPrService;
|
|
33
|
+
}
|
|
34
|
+
async execute(featureId) {
|
|
35
|
+
const feature = await this.featureRepo.findById(featureId);
|
|
36
|
+
if (!feature)
|
|
37
|
+
return;
|
|
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);
|
|
47
|
+
}
|
|
48
|
+
// Step 2: Delete the local feature branch
|
|
49
|
+
try {
|
|
50
|
+
await this.gitPrService.deleteBranch(feature.repositoryPath, feature.branch);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
// eslint-disable-next-line no-console
|
|
54
|
+
console.warn('[CleanupFeatureWorktreeUseCase] local branch delete failed:', err);
|
|
55
|
+
}
|
|
56
|
+
// Step 3: Delete the remote feature branch if it still exists
|
|
57
|
+
try {
|
|
58
|
+
const remoteExists = await this.worktreeService.remoteBranchExists(feature.repositoryPath, feature.branch);
|
|
59
|
+
if (remoteExists) {
|
|
60
|
+
await this.gitPrService.deleteBranch(feature.repositoryPath, feature.branch, true);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
// eslint-disable-next-line no-console
|
|
65
|
+
console.warn('[CleanupFeatureWorktreeUseCase] remote branch delete failed:', err);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
CleanupFeatureWorktreeUseCase = __decorate([
|
|
70
|
+
injectable(),
|
|
71
|
+
__param(0, inject('IFeatureRepository')),
|
|
72
|
+
__param(1, inject('IWorktreeService')),
|
|
73
|
+
__param(2, inject('IGitPrService')),
|
|
74
|
+
__metadata("design:paramtypes", [Object, Object, Object])
|
|
75
|
+
], CleanupFeatureWorktreeUseCase);
|
|
76
|
+
export { CleanupFeatureWorktreeUseCase };
|
|
@@ -18,13 +18,18 @@ import type { IFeatureRepository } from '../../ports/output/repositories/feature
|
|
|
18
18
|
import type { IWorktreeService } from '../../ports/output/services/worktree-service.interface.js';
|
|
19
19
|
import type { IFeatureAgentProcessService } from '../../ports/output/agents/feature-agent-process.interface.js';
|
|
20
20
|
import type { IAgentRunRepository } from '../../ports/output/agents/agent-run-repository.interface.js';
|
|
21
|
+
import type { CleanupFeatureWorktreeUseCase } from './cleanup-feature-worktree.use-case.js';
|
|
22
|
+
export interface DeleteFeatureOptions {
|
|
23
|
+
cleanup?: boolean;
|
|
24
|
+
}
|
|
21
25
|
export declare class DeleteFeatureUseCase {
|
|
22
26
|
private readonly featureRepo;
|
|
23
27
|
private readonly worktreeService;
|
|
24
28
|
private readonly processService;
|
|
25
29
|
private readonly runRepo;
|
|
26
|
-
|
|
27
|
-
|
|
30
|
+
private readonly cleanupUseCase;
|
|
31
|
+
constructor(featureRepo: IFeatureRepository, worktreeService: IWorktreeService, processService: IFeatureAgentProcessService, runRepo: IAgentRunRepository, cleanupUseCase: Pick<CleanupFeatureWorktreeUseCase, 'execute'>);
|
|
32
|
+
execute(featureId: string, options?: DeleteFeatureOptions): Promise<Feature>;
|
|
28
33
|
private cascadeDeleteChildren;
|
|
29
34
|
private deleteSingleFeature;
|
|
30
35
|
}
|
package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/delete-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;
|
|
1
|
+
{"version":3,"file":"delete-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/delete-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AAE5F,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBACa,oBAAoB;IAEC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAE5D,OAAO,CAAC,QAAQ,CAAC,cAAc;IACA,OAAO,CAAC,QAAQ,CAAC,OAAO;IAEvD,OAAO,CAAC,QAAQ,CAAC,cAAc;gBANgB,WAAW,EAAE,kBAAkB,EACjC,eAAe,EAAE,gBAAgB,EAE7D,cAAc,EAAE,2BAA2B,EACZ,OAAO,EAAE,mBAAmB,EAE3D,cAAc,EAAE,IAAI,CAAC,6BAA6B,EAAE,SAAS,CAAC;IAG3E,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;YAkBpE,qBAAqB;YAYrB,mBAAmB;CA0ClC"}
|
|
@@ -32,13 +32,15 @@ let DeleteFeatureUseCase = class DeleteFeatureUseCase {
|
|
|
32
32
|
worktreeService;
|
|
33
33
|
processService;
|
|
34
34
|
runRepo;
|
|
35
|
-
|
|
35
|
+
cleanupUseCase;
|
|
36
|
+
constructor(featureRepo, worktreeService, processService, runRepo, cleanupUseCase) {
|
|
36
37
|
this.featureRepo = featureRepo;
|
|
37
38
|
this.worktreeService = worktreeService;
|
|
38
39
|
this.processService = processService;
|
|
39
40
|
this.runRepo = runRepo;
|
|
41
|
+
this.cleanupUseCase = cleanupUseCase;
|
|
40
42
|
}
|
|
41
|
-
async execute(featureId) {
|
|
43
|
+
async execute(featureId, options) {
|
|
42
44
|
// 1. Find feature (exact or prefix match)
|
|
43
45
|
const feature = (await this.featureRepo.findById(featureId)) ??
|
|
44
46
|
(await this.featureRepo.findByIdPrefix(featureId));
|
|
@@ -46,20 +48,20 @@ let DeleteFeatureUseCase = class DeleteFeatureUseCase {
|
|
|
46
48
|
throw new Error(`Feature not found: "${featureId}"`);
|
|
47
49
|
}
|
|
48
50
|
// 2. Cascade delete all sub-features (depth-first)
|
|
49
|
-
await this.cascadeDeleteChildren(feature.id);
|
|
51
|
+
await this.cascadeDeleteChildren(feature.id, options);
|
|
50
52
|
// 3. Delete the feature itself
|
|
51
|
-
await this.deleteSingleFeature(feature);
|
|
53
|
+
await this.deleteSingleFeature(feature, options);
|
|
52
54
|
return feature;
|
|
53
55
|
}
|
|
54
|
-
async cascadeDeleteChildren(parentId) {
|
|
56
|
+
async cascadeDeleteChildren(parentId, options) {
|
|
55
57
|
const children = await this.featureRepo.findByParentId(parentId);
|
|
56
58
|
for (const child of children) {
|
|
57
59
|
// Recurse into grandchildren first (depth-first)
|
|
58
|
-
await this.cascadeDeleteChildren(child.id);
|
|
59
|
-
await this.deleteSingleFeature(child);
|
|
60
|
+
await this.cascadeDeleteChildren(child.id, options);
|
|
61
|
+
await this.deleteSingleFeature(child, options);
|
|
60
62
|
}
|
|
61
63
|
}
|
|
62
|
-
async deleteSingleFeature(feature) {
|
|
64
|
+
async deleteSingleFeature(feature, options) {
|
|
63
65
|
// Cancel running/pending agent run if present
|
|
64
66
|
if (feature.agentRunId) {
|
|
65
67
|
const run = await this.runRepo.findById(feature.agentRunId);
|
|
@@ -75,13 +77,24 @@ let DeleteFeatureUseCase = class DeleteFeatureUseCase {
|
|
|
75
77
|
await this.runRepo.updateStatus(run.id, AgentRunStatus.cancelled);
|
|
76
78
|
}
|
|
77
79
|
}
|
|
78
|
-
//
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
// 4. Cleanup: either full cleanup (worktree + branches) or just worktree removal
|
|
81
|
+
const cleanup = options?.cleanup !== false;
|
|
82
|
+
if (cleanup) {
|
|
83
|
+
try {
|
|
84
|
+
await this.cleanupUseCase.execute(feature.id);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Cleanup is best-effort — don't block deletion
|
|
88
|
+
}
|
|
82
89
|
}
|
|
83
|
-
|
|
84
|
-
|
|
90
|
+
else {
|
|
91
|
+
const worktreePath = this.worktreeService.getWorktreePath(feature.repositoryPath, feature.branch);
|
|
92
|
+
try {
|
|
93
|
+
await this.worktreeService.remove(worktreePath);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
// Worktree might already be removed - that's fine
|
|
97
|
+
}
|
|
85
98
|
}
|
|
86
99
|
// Delete feature record
|
|
87
100
|
await this.featureRepo.delete(feature.id);
|
|
@@ -93,6 +106,7 @@ DeleteFeatureUseCase = __decorate([
|
|
|
93
106
|
__param(1, inject('IWorktreeService')),
|
|
94
107
|
__param(2, inject('IFeatureAgentProcessService')),
|
|
95
108
|
__param(3, inject('IAgentRunRepository')),
|
|
96
|
-
|
|
109
|
+
__param(4, inject('CleanupFeatureWorktreeUseCase')),
|
|
110
|
+
__metadata("design:paramtypes", [Object, Object, Object, Object, Object])
|
|
97
111
|
], DeleteFeatureUseCase);
|
|
98
112
|
export { DeleteFeatureUseCase };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAmHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAqRrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -77,6 +77,7 @@ import { ListRepositoriesUseCase } from '../../application/use-cases/repositorie
|
|
|
77
77
|
import { DeleteRepositoryUseCase } from '../../application/use-cases/repositories/delete-repository.use-case.js';
|
|
78
78
|
import { CheckAndUnblockFeaturesUseCase } from '../../application/use-cases/features/check-and-unblock-features.use-case.js';
|
|
79
79
|
import { UpdateFeatureLifecycleUseCase } from '../../application/use-cases/features/update/update-feature-lifecycle.use-case.js';
|
|
80
|
+
import { CleanupFeatureWorktreeUseCase } from '../../application/use-cases/features/cleanup-feature-worktree.use-case.js';
|
|
80
81
|
// Session listing
|
|
81
82
|
import { ClaudeCodeSessionRepository } from '../services/agents/sessions/claude-code-session.repository.js';
|
|
82
83
|
import { StubSessionRepository } from '../services/agents/sessions/stub-session.repository.js';
|
|
@@ -259,6 +260,7 @@ export async function initializeContainer() {
|
|
|
259
260
|
// because the latter injects the former via class token.
|
|
260
261
|
container.registerSingleton(CheckAndUnblockFeaturesUseCase);
|
|
261
262
|
container.registerSingleton(UpdateFeatureLifecycleUseCase);
|
|
263
|
+
container.registerSingleton(CleanupFeatureWorktreeUseCase);
|
|
262
264
|
// Session repositories (per-AgentType string tokens)
|
|
263
265
|
container.register(`IAgentSessionRepository:${AgentType.ClaudeCode}`, {
|
|
264
266
|
useFactory: () => new ClaudeCodeSessionRepository(),
|
|
@@ -334,6 +336,9 @@ export async function initializeContainer() {
|
|
|
334
336
|
container.register('UpdateSettingsUseCase', {
|
|
335
337
|
useFactory: (c) => c.resolve(UpdateSettingsUseCase),
|
|
336
338
|
});
|
|
339
|
+
container.register('CleanupFeatureWorktreeUseCase', {
|
|
340
|
+
useFactory: (c) => c.resolve(CleanupFeatureWorktreeUseCase),
|
|
341
|
+
});
|
|
337
342
|
_initialized = true;
|
|
338
343
|
return container;
|
|
339
344
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAe1B,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"feature-agent-worker.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,kBAAkB,CAAC;AAe1B,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAW9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAiE1D;AAgCD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAoP/D"}
|
package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js
CHANGED
|
@@ -24,6 +24,7 @@ import { setPhaseTimingContext, recordLifecycleEvent } from './phase-timing-cont
|
|
|
24
24
|
import { setLifecycleContext } from './lifecycle-context.js';
|
|
25
25
|
import { setLogPrefix, getLogPrefix } from './log-context.js';
|
|
26
26
|
import { UpdateFeatureLifecycleUseCase } from '../../../../application/use-cases/features/update/update-feature-lifecycle.use-case.js';
|
|
27
|
+
import { CleanupFeatureWorktreeUseCase } from '../../../../application/use-cases/features/cleanup-feature-worktree.use-case.js';
|
|
27
28
|
/**
|
|
28
29
|
* Parse CLI arguments into a WorkerArgs object.
|
|
29
30
|
* Throws if any required argument is missing.
|
|
@@ -167,6 +168,7 @@ export async function runWorker(args) {
|
|
|
167
168
|
// Resolve merge node dependencies
|
|
168
169
|
const gitPrService = container.resolve('IGitPrService');
|
|
169
170
|
const featureRepository = container.resolve('IFeatureRepository');
|
|
171
|
+
const cleanupFeatureWorktreeUseCase = container.resolve(CleanupFeatureWorktreeUseCase);
|
|
170
172
|
const graphDeps = {
|
|
171
173
|
executor,
|
|
172
174
|
mergeNodeDeps: {
|
|
@@ -176,6 +178,7 @@ export async function runWorker(args) {
|
|
|
176
178
|
verifyMerge: (cwd, featureBranch, baseBranch) => gitPrService.verifyMerge(cwd, featureBranch, baseBranch),
|
|
177
179
|
featureRepository,
|
|
178
180
|
gitPrService,
|
|
181
|
+
cleanupFeatureWorktreeUseCase,
|
|
179
182
|
},
|
|
180
183
|
};
|
|
181
184
|
// Use threadId for checkpoint path so resume runs share the same checkpoint DB.
|
|
@@ -16,6 +16,7 @@ import type { IAgentExecutor } from '../../../../../../application/ports/output/
|
|
|
16
16
|
import type { FeatureAgentState } from '../../state.js';
|
|
17
17
|
import type { IFeatureRepository } from '../../../../../../application/ports/output/repositories/feature-repository.interface.js';
|
|
18
18
|
import type { DiffSummary, IGitPrService } from '../../../../../../application/ports/output/services/git-pr-service.interface.js';
|
|
19
|
+
import type { CleanupFeatureWorktreeUseCase } from '../../../../../../application/use-cases/features/cleanup-feature-worktree.use-case.js';
|
|
19
20
|
export interface MergeNodeDeps {
|
|
20
21
|
executor: IAgentExecutor;
|
|
21
22
|
getDiffSummary: (cwd: string, baseBranch: string) => Promise<DiffSummary>;
|
|
@@ -28,6 +29,7 @@ export interface MergeNodeDeps {
|
|
|
28
29
|
*/
|
|
29
30
|
verifyMerge: (cwd: string, featureBranch: string, baseBranch: string) => Promise<boolean>;
|
|
30
31
|
gitPrService: IGitPrService;
|
|
32
|
+
cleanupFeatureWorktreeUseCase: Pick<CleanupFeatureWorktreeUseCase, 'execute'>;
|
|
31
33
|
}
|
|
32
34
|
/**
|
|
33
35
|
* Factory that creates the merge node function.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACd,MAAM,iEAAiE,CAAC;
|
|
1
|
+
{"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACd,MAAM,iEAAiE,CAAC;AAkBzE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,uEAAuE,CAAC;AAE3H,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IACnE;;;OAGG;IACH,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,YAAY,EAAE,aAAa,CAAC;IAC5B,6BAA6B,EAAE,IAAI,CAAC,6BAA6B,EAAE,SAAS,CAAC,CAAC;CAC/E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CA0Q7E"}
|
|
@@ -231,6 +231,9 @@ export function createMergeNode(deps) {
|
|
|
231
231
|
updatedAt: new Date(),
|
|
232
232
|
});
|
|
233
233
|
messages.push(`[merge] Feature lifecycle → ${newLifecycle}`);
|
|
234
|
+
if (merged) {
|
|
235
|
+
await deps.cleanupFeatureWorktreeUseCase.execute(feature.id);
|
|
236
|
+
}
|
|
234
237
|
}
|
|
235
238
|
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
236
239
|
await recordPhaseEnd(mergeTimingId, Date.now() - startTime);
|
|
@@ -18,7 +18,7 @@ export declare class WorktreeService implements IWorktreeService {
|
|
|
18
18
|
private readonly execFile;
|
|
19
19
|
constructor(execFile: ExecFunction);
|
|
20
20
|
create(repoPath: string, branch: string, worktreePath: string, startPoint?: string): Promise<WorktreeInfo>;
|
|
21
|
-
remove(worktreePath: string): Promise<void>;
|
|
21
|
+
remove(worktreePath: string, force?: boolean): Promise<void>;
|
|
22
22
|
list(repoPath: string): Promise<WorktreeInfo[]>;
|
|
23
23
|
exists(repoPath: string, branch: string): Promise<boolean>;
|
|
24
24
|
branchExists(repoPath: string, branch: string): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAOlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAqBlB,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAOlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAqBlB,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5D,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAU9B"}
|
|
@@ -48,9 +48,13 @@ let WorktreeService = class WorktreeService {
|
|
|
48
48
|
}
|
|
49
49
|
return created;
|
|
50
50
|
}
|
|
51
|
-
async remove(worktreePath) {
|
|
51
|
+
async remove(worktreePath, force) {
|
|
52
52
|
try {
|
|
53
|
-
|
|
53
|
+
const args = ['worktree', 'remove'];
|
|
54
|
+
if (force)
|
|
55
|
+
args.push('--force');
|
|
56
|
+
args.push(worktreePath);
|
|
57
|
+
await this.execFile('git', args, {});
|
|
54
58
|
}
|
|
55
59
|
catch (error) {
|
|
56
60
|
throw this.parseGitError(error);
|
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
* Feature Delete Command
|
|
3
3
|
*
|
|
4
4
|
* Deletes a feature, its worktree, and cancels any running agent.
|
|
5
|
+
* Optionally cleans up worktree and branches (local + remote).
|
|
5
6
|
*
|
|
6
|
-
* Usage: shep feat del <id> [--force]
|
|
7
|
+
* Usage: shep feat del <id> [--force] [--no-cleanup]
|
|
7
8
|
*
|
|
8
9
|
* @example
|
|
9
10
|
* $ shep feat del feat-123
|
|
10
11
|
* $ shep feat del feat-123 --force
|
|
12
|
+
* $ shep feat del feat-123 --force --no-cleanup
|
|
11
13
|
*/
|
|
12
14
|
import { Command } from 'commander';
|
|
13
15
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"del.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/del.command.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"del.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/del.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAmD1C"}
|
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
* Feature Delete Command
|
|
3
3
|
*
|
|
4
4
|
* Deletes a feature, its worktree, and cancels any running agent.
|
|
5
|
+
* Optionally cleans up worktree and branches (local + remote).
|
|
5
6
|
*
|
|
6
|
-
* Usage: shep feat del <id> [--force]
|
|
7
|
+
* Usage: shep feat del <id> [--force] [--no-cleanup]
|
|
7
8
|
*
|
|
8
9
|
* @example
|
|
9
10
|
* $ shep feat del feat-123
|
|
10
11
|
* $ shep feat del feat-123 --force
|
|
12
|
+
* $ shep feat del feat-123 --force --no-cleanup
|
|
11
13
|
*/
|
|
12
14
|
import { Command } from 'commander';
|
|
13
15
|
import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
|
|
@@ -23,6 +25,7 @@ export function createDelCommand() {
|
|
|
23
25
|
.description('Delete a feature')
|
|
24
26
|
.argument('<id>', 'Feature ID or prefix')
|
|
25
27
|
.option('-f, --force', 'Skip confirmation prompt')
|
|
28
|
+
.option('--no-cleanup', 'Skip worktree and branch cleanup')
|
|
26
29
|
.action(async (featureId, options) => {
|
|
27
30
|
try {
|
|
28
31
|
// First show what we're about to delete
|
|
@@ -38,12 +41,26 @@ export function createDelCommand() {
|
|
|
38
41
|
return;
|
|
39
42
|
}
|
|
40
43
|
}
|
|
44
|
+
// Determine cleanup preference
|
|
45
|
+
let cleanup = true;
|
|
46
|
+
if (options.cleanup === false) {
|
|
47
|
+
cleanup = false;
|
|
48
|
+
}
|
|
49
|
+
else if (!options.force) {
|
|
50
|
+
cleanup = await confirm({
|
|
51
|
+
message: 'Also clean up worktree and branches?',
|
|
52
|
+
default: true,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
41
55
|
const deleteUseCase = container.resolve(DeleteFeatureUseCase);
|
|
42
|
-
await deleteUseCase.execute(feature.id);
|
|
56
|
+
await deleteUseCase.execute(feature.id, { cleanup });
|
|
43
57
|
messages.newline();
|
|
44
58
|
messages.success('Feature deleted');
|
|
45
59
|
console.log(` ${colors.muted('Name:')} ${feature.name}`);
|
|
46
60
|
console.log(` ${colors.muted('Branch:')} ${feature.branch}`);
|
|
61
|
+
if (cleanup) {
|
|
62
|
+
console.log(` ${colors.muted('Cleanup:')} worktree, local branch, remote branch`);
|
|
63
|
+
}
|
|
47
64
|
messages.newline();
|
|
48
65
|
}
|
|
49
66
|
catch (error) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Feature } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
2
|
-
export declare function deleteFeature(featureId: string): Promise<{
|
|
2
|
+
export declare function deleteFeature(featureId: string, cleanup?: boolean): Promise<{
|
|
3
3
|
feature?: Feature;
|
|
4
4
|
error?: string;
|
|
5
5
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/delete-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAEpE,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"delete-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/delete-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAEpE,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,GAChB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBhD"}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
'use server';
|
|
2
2
|
import { resolve } from '../../lib/server-container.js';
|
|
3
|
-
export async function deleteFeature(featureId) {
|
|
3
|
+
export async function deleteFeature(featureId, cleanup) {
|
|
4
4
|
if (!featureId?.trim()) {
|
|
5
5
|
return { error: 'id is required' };
|
|
6
6
|
}
|
|
7
7
|
try {
|
|
8
8
|
const deleteFeatureUseCase = resolve('DeleteFeatureUseCase');
|
|
9
|
-
const feature =
|
|
9
|
+
const feature = cleanup !== undefined
|
|
10
|
+
? await deleteFeatureUseCase.execute(featureId, { cleanup })
|
|
11
|
+
: await deleteFeatureUseCase.execute(featureId);
|
|
10
12
|
return { feature };
|
|
11
13
|
}
|
|
12
14
|
catch (error) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/app/api/attachments/upload-from-path/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAoF3C,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAmDlE"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { NextResponse } from 'next/server';
|
|
2
|
+
import { readFile } from 'fs/promises';
|
|
3
|
+
import { extname, basename } from 'path';
|
|
4
|
+
import { resolve as resolvePath } from 'path';
|
|
5
|
+
import { resolve } from '../../../../lib/server-container.js';
|
|
6
|
+
const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB
|
|
7
|
+
const ALLOWED_EXTENSIONS = new Set([
|
|
8
|
+
'.png',
|
|
9
|
+
'.jpg',
|
|
10
|
+
'.jpeg',
|
|
11
|
+
'.gif',
|
|
12
|
+
'.webp',
|
|
13
|
+
'.svg',
|
|
14
|
+
'.bmp',
|
|
15
|
+
'.ico',
|
|
16
|
+
'.pdf',
|
|
17
|
+
'.doc',
|
|
18
|
+
'.docx',
|
|
19
|
+
'.xls',
|
|
20
|
+
'.xlsx',
|
|
21
|
+
'.ppt',
|
|
22
|
+
'.pptx',
|
|
23
|
+
'.txt',
|
|
24
|
+
'.md',
|
|
25
|
+
'.csv',
|
|
26
|
+
'.json',
|
|
27
|
+
'.yaml',
|
|
28
|
+
'.yml',
|
|
29
|
+
'.xml',
|
|
30
|
+
'.ts',
|
|
31
|
+
'.tsx',
|
|
32
|
+
'.js',
|
|
33
|
+
'.jsx',
|
|
34
|
+
'.py',
|
|
35
|
+
'.rb',
|
|
36
|
+
'.go',
|
|
37
|
+
'.rs',
|
|
38
|
+
'.java',
|
|
39
|
+
'.c',
|
|
40
|
+
'.cpp',
|
|
41
|
+
'.h',
|
|
42
|
+
'.hpp',
|
|
43
|
+
'.cs',
|
|
44
|
+
'.swift',
|
|
45
|
+
'.kt',
|
|
46
|
+
'.html',
|
|
47
|
+
'.css',
|
|
48
|
+
'.scss',
|
|
49
|
+
'.less',
|
|
50
|
+
'.sh',
|
|
51
|
+
'.bash',
|
|
52
|
+
'.zsh',
|
|
53
|
+
'.fish',
|
|
54
|
+
'.toml',
|
|
55
|
+
'.ini',
|
|
56
|
+
'.cfg',
|
|
57
|
+
'.conf',
|
|
58
|
+
'.env',
|
|
59
|
+
'.zip',
|
|
60
|
+
'.tar',
|
|
61
|
+
'.gz',
|
|
62
|
+
'.log',
|
|
63
|
+
]);
|
|
64
|
+
const MIME_MAP = {
|
|
65
|
+
'.png': 'image/png',
|
|
66
|
+
'.jpg': 'image/jpeg',
|
|
67
|
+
'.jpeg': 'image/jpeg',
|
|
68
|
+
'.gif': 'image/gif',
|
|
69
|
+
'.webp': 'image/webp',
|
|
70
|
+
'.svg': 'image/svg+xml',
|
|
71
|
+
'.bmp': 'image/bmp',
|
|
72
|
+
'.ico': 'image/x-icon',
|
|
73
|
+
'.pdf': 'application/pdf',
|
|
74
|
+
'.txt': 'text/plain',
|
|
75
|
+
'.md': 'text/markdown',
|
|
76
|
+
'.json': 'application/json',
|
|
77
|
+
'.yaml': 'text/yaml',
|
|
78
|
+
'.yml': 'text/yaml',
|
|
79
|
+
};
|
|
80
|
+
export async function POST(request) {
|
|
81
|
+
try {
|
|
82
|
+
const body = await request.json();
|
|
83
|
+
const { path, sessionId } = body;
|
|
84
|
+
if (!path || !sessionId) {
|
|
85
|
+
return NextResponse.json({ error: 'Missing required fields: path, sessionId' }, { status: 400 });
|
|
86
|
+
}
|
|
87
|
+
const ext = extname(path).toLowerCase();
|
|
88
|
+
if (ext && !ALLOWED_EXTENSIONS.has(ext)) {
|
|
89
|
+
return NextResponse.json({ error: `File type "${ext}" is not allowed` }, { status: 400 });
|
|
90
|
+
}
|
|
91
|
+
let buffer;
|
|
92
|
+
try {
|
|
93
|
+
buffer = await readFile(resolvePath(path));
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return NextResponse.json({ error: 'File not found or unreadable' }, { status: 404 });
|
|
97
|
+
}
|
|
98
|
+
if (buffer.length > MAX_FILE_SIZE) {
|
|
99
|
+
return NextResponse.json({
|
|
100
|
+
error: `File exceeds 10 MB limit (${(buffer.length / 1024 / 1024).toFixed(1)} MB)`,
|
|
101
|
+
}, { status: 413 });
|
|
102
|
+
}
|
|
103
|
+
const filename = basename(path);
|
|
104
|
+
const mimeType = MIME_MAP[ext] ?? 'application/octet-stream';
|
|
105
|
+
const service = resolve('AttachmentStorageService');
|
|
106
|
+
const attachment = service.store(buffer, filename, mimeType, sessionId);
|
|
107
|
+
return NextResponse.json({
|
|
108
|
+
id: attachment.id,
|
|
109
|
+
name: attachment.name,
|
|
110
|
+
size: Number(attachment.size),
|
|
111
|
+
mimeType: attachment.mimeType,
|
|
112
|
+
path: attachment.path,
|
|
113
|
+
createdAt: attachment.createdAt,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
const message = error instanceof Error ? error.message : 'Upload failed';
|
|
118
|
+
return NextResponse.json({ error: message }, { status: 500 });
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -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":"
|
|
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"}
|