@shepai/cli 1.176.0 → 1.177.0-pr538.aa9ace4
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/eslint.config.mjs +2 -0
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +15 -0
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/i-browser-opener.d.ts +28 -0
- package/dist/packages/core/src/application/ports/output/services/i-browser-opener.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/i-browser-opener.js +13 -0
- package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.d.ts +29 -0
- package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.js +13 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +2 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.d.ts +46 -3
- package/dist/packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.js +153 -5
- package/dist/packages/core/src/application/use-cases/features/reparent-feature.use-case.d.ts +31 -0
- package/dist/packages/core/src/application/use-cases/features/reparent-feature.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/reparent-feature.use-case.js +127 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +10 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.js +20 -6
- 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 +27 -4
- package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +53 -0
- package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts +1 -1
- package/dist/src/presentation/cli/commands/daemon/start-daemon.js +2 -3
- package/dist/src/presentation/cli/commands/ui.command.js +1 -2
- package/dist/src/presentation/web/app/actions/reparent-feature.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/reparent-feature.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/reparent-feature.js +16 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +2 -2
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -0
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +47 -4
- package/dist/src/presentation/web/components/features/features-canvas/dependency-edge.d.ts +1 -0
- package/dist/src/presentation/web/components/features/features-canvas/dependency-edge.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/dependency-edge.js +18 -6
- package/dist/src/presentation/web/components/features/features-canvas/dependency-edge.stories.d.ts +3 -0
- package/dist/src/presentation/web/components/features/features-canvas/dependency-edge.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/dependency-edge.stories.js +27 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts +2 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +14 -3
- package/dist/src/presentation/web/hooks/use-graph-state.d.ts +7 -0
- package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-graph-state.js +74 -0
- package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/derive-graph.js +5 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +10 -2
- package/web/.next/BUILD_ID +1 -1
- 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 +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +73 -58
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +69 -54
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +75 -60
- 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]/[tab]/page/server-reference-manifest.json +91 -76
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +91 -76
- 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]/[tab]/page/server-reference-manifest.json +71 -56
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +71 -56
- 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)/chat/page/server-reference-manifest.json +69 -54
- package/web/.next/server/app/(dashboard)/chat/page.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +75 -60
- 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]/[tab]/page/server-reference-manifest.json +91 -76
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +91 -76
- 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 +69 -54
- 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]/[tab]/page/server-reference-manifest.json +71 -56
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +71 -56
- 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.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 +6 -6
- 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/evidence/route.js.nft.json +1 -1
- package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
- package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
- package/web/.next/server/app/features/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/features/page.js.nft.json +1 -1
- package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
- 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 +13 -13
- 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 +11 -11
- 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 +6 -6
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__332c8d91._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__332c8d91._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4869a7bb.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4869a7bb.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_d92cb436.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_d92cb436.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_16dd74be.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_16dd74be.js.map +1 -0
- 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/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__a932cd3a._.js → [root-of-the-server]__000567d1._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__51ec77a8._.js.map → [root-of-the-server]__000567d1._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__23b5ca2c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__51ec77a8._.js → [root-of-the-server]__466d5d10._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__a932cd3a._.js.map → [root-of-the-server]__466d5d10._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__540c615f._.js +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__66047a1b._.js → [root-of-the-server]__60b640ad._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__aa72e794._.js.map → [root-of-the-server]__60b640ad._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7528eb6f._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__aa72e794._.js → [root-of-the-server]__e68e2b52._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__66047a1b._.js.map → [root-of-the-server]__e68e2b52._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_8f0d3f07._.js → _09bef7ab._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_8f0d3f07._.js.map → _09bef7ab._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_2b6293f3._.js +4 -0
- package/web/.next/server/chunks/ssr/{_388d1127._.js.map → _2b6293f3._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_4cbb7f95._.js +1 -1
- package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_6abfa39e._.js +1 -1
- package/web/.next/server/chunks/ssr/_6abfa39e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_ebb12cc5._.js +3 -0
- package/web/.next/server/chunks/ssr/{_98d94927._.js.map → _ebb12cc5._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_f8c55130._.js +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/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
- package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{src_presentation_web_807cba76._.js → src_presentation_web_06387c54._.js} +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_06387c54._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_e3a30e30._.js → src_presentation_web_1ccf607e._.js} +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_1ccf607e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_7b7b9e3b._.js → src_presentation_web_2c992e9f._.js} +3 -3
- package/web/.next/server/chunks/ssr/{src_presentation_web_7b7b9e3b._.js.map → src_presentation_web_2c992e9f._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{src_presentation_web_54b02639._.js → src_presentation_web_476ed91c._.js} +3 -3
- package/web/.next/server/chunks/ssr/{src_presentation_web_54b02639._.js.map → src_presentation_web_476ed91c._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{src_presentation_web_17d39233._.js → src_presentation_web_5b78146e._.js} +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_5b78146e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_e1cd1869._.js → src_presentation_web_796d2fd5._.js} +2 -2
- package/web/.next/server/chunks/ssr/src_presentation_web_796d2fd5._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_3a934437.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_3a934437.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
- 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_components_features_skills_8a174cac._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.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 +590 -484
- package/web/.next/static/chunks/{a20f2d6f76f469b7.css → 0cf210e5b787a08b.css} +1 -1
- package/web/.next/static/chunks/{0ffb3738269e15c3.js → 129ec6d253f86319.js} +1 -1
- package/web/.next/static/chunks/{afa7e5d2a48cabc7.js → 2fe9740f9397711d.js} +1 -1
- package/web/.next/static/chunks/{4ff21d16947ec853.js → 37035f72d4f041f4.js} +1 -1
- package/web/.next/static/chunks/{eda9ee3c22b71a69.js → 4a5e1ebbe4a3fd87.js} +1 -1
- package/web/.next/static/chunks/{476873a9bac35ec8.js → 7a0b03e168a882e6.js} +1 -1
- package/web/.next/static/chunks/8692d79a48d07b5c.js +3 -0
- package/web/.next/static/chunks/8c60a1781664e9f3.js +2 -0
- package/web/.next/static/chunks/96b30c2bf69bb538.js +1 -0
- package/web/.next/static/chunks/{2cfc6022d74e2716.js → a3c5ab40fc61b2c2.js} +3 -3
- package/web/.next/static/chunks/{f17d2d0279b8db35.js → abdbfb54cbb73702.js} +1 -1
- package/web/.next/static/chunks/{236744ff71b1aadf.js → bbb9fcc0697d77b8.js} +1 -1
- package/web/.next/static/chunks/{eab3d361f7a24510.js → eb612d2c2229399e.js} +1 -1
- package/web/.next/static/chunks/{885bb8fc631bf477.js → eccf3cd99bc580a4.js} +1 -1
- package/web/.next/static/chunks/{6304540c7cf2b46a.js → fa3bbfc6b0934358.js} +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js +0 -3
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js.map +0 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js +0 -3
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js.map +0 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.js +0 -3
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.js.map +0 -1
- package/web/.next/server/chunks/ssr/_388d1127._.js +0 -4
- package/web/.next/server/chunks/ssr/_98d94927._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_17d39233._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_807cba76._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e1cd1869._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e3a30e30._.js.map +0 -1
- package/web/.next/static/chunks/302f474e4978cc80.js +0 -3
- package/web/.next/static/chunks/626277ca9a4cc477.js +0 -1
- package/web/.next/static/chunks/71a07df9dcb42227.js +0 -2
- /package/web/.next/static/{36ONyC02R4wfFe7iWMQLU → pZ9nz6LLItDQ4YUlAE7tc}/_buildManifest.js +0 -0
- /package/web/.next/static/{36ONyC02R4wfFe7iWMQLU → pZ9nz6LLItDQ4YUlAE7tc}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{36ONyC02R4wfFe7iWMQLU → pZ9nz6LLItDQ4YUlAE7tc}/_ssgManifest.js +0 -0
package/dist/eslint.config.mjs
CHANGED
package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts
CHANGED
|
@@ -381,6 +381,21 @@ export interface IGitPrService {
|
|
|
381
381
|
* @throws GitPrError with BRANCH_NOT_FOUND code if a branch does not exist
|
|
382
382
|
*/
|
|
383
383
|
rebaseOnMain(cwd: string, featureBranch: string, baseBranch: string): Promise<void>;
|
|
384
|
+
/**
|
|
385
|
+
* Rebase the feature branch onto `origin/<targetBranch>`.
|
|
386
|
+
* Fetches the target branch from the remote first to ensure the
|
|
387
|
+
* remote-tracking ref is up-to-date, then rebases the feature branch
|
|
388
|
+
* onto it. Similar to {@link rebaseOnMain} but targets an arbitrary
|
|
389
|
+
* branch instead of the repository's default branch.
|
|
390
|
+
*
|
|
391
|
+
* @param cwd - Working directory path
|
|
392
|
+
* @param featureBranch - The feature branch to rebase
|
|
393
|
+
* @param targetBranch - The target branch name (rebase target will be origin/<targetBranch>)
|
|
394
|
+
* @throws GitPrError with GIT_ERROR code if the worktree is dirty
|
|
395
|
+
* @throws GitPrError with REBASE_CONFLICT code if conflicts are detected
|
|
396
|
+
* @throws GitPrError with BRANCH_NOT_FOUND code if a branch does not exist
|
|
397
|
+
*/
|
|
398
|
+
rebaseOnBranch(cwd: string, featureBranch: string, targetBranch: string): Promise<void>;
|
|
384
399
|
/**
|
|
385
400
|
* Get the list of files with unresolved conflicts (unmerged paths).
|
|
386
401
|
* Uses `git diff --name-only --diff-filter=U` to identify conflicted files.
|
package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-pr-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/git-pr-service.interface.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"git-pr-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/git-pr-service.interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Opener Interface
|
|
3
|
+
*
|
|
4
|
+
* Output port for opening URLs in the user's default browser.
|
|
5
|
+
* Infrastructure layer provides concrete implementations:
|
|
6
|
+
* - BrowserOpenerService — default, uses platform-specific commands (open, xdg-open, cmd start)
|
|
7
|
+
* - ElectronBrowserOpener — used when running inside Electron (focuses BrowserWindow or shell.openExternal)
|
|
8
|
+
*
|
|
9
|
+
* Following Clean Architecture:
|
|
10
|
+
* - Application layer depends on this interface
|
|
11
|
+
* - Infrastructure layer provides concrete implementations
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Port interface for opening URLs in the user's browser or app window.
|
|
15
|
+
*
|
|
16
|
+
* Implementations must:
|
|
17
|
+
* - Handle errors gracefully (log, never throw)
|
|
18
|
+
* - Degrade gracefully in non-interactive environments (CI, piped I/O)
|
|
19
|
+
*/
|
|
20
|
+
export interface IBrowserOpener {
|
|
21
|
+
/**
|
|
22
|
+
* Open a URL in the user's default browser or application window.
|
|
23
|
+
*
|
|
24
|
+
* @param url - The URL to open
|
|
25
|
+
*/
|
|
26
|
+
open(url: string): void;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=i-browser-opener.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i-browser-opener.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/i-browser-opener.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser Opener Interface
|
|
3
|
+
*
|
|
4
|
+
* Output port for opening URLs in the user's default browser.
|
|
5
|
+
* Infrastructure layer provides concrete implementations:
|
|
6
|
+
* - BrowserOpenerService — default, uses platform-specific commands (open, xdg-open, cmd start)
|
|
7
|
+
* - ElectronBrowserOpener — used when running inside Electron (focuses BrowserWindow or shell.openExternal)
|
|
8
|
+
*
|
|
9
|
+
* Following Clean Architecture:
|
|
10
|
+
* - Application layer depends on this interface
|
|
11
|
+
* - Infrastructure layer provides concrete implementations
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Desktop Notifier Interface
|
|
3
|
+
*
|
|
4
|
+
* Output port for sending native OS desktop notifications.
|
|
5
|
+
* Infrastructure layer provides concrete implementations:
|
|
6
|
+
* - DesktopNotifier (node-notifier) — default for CLI/web contexts
|
|
7
|
+
* - ElectronDesktopNotifier — used when running inside Electron
|
|
8
|
+
*
|
|
9
|
+
* Following Clean Architecture:
|
|
10
|
+
* - Application layer depends on this interface
|
|
11
|
+
* - Infrastructure layer provides concrete implementations
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Port interface for sending native OS desktop notifications.
|
|
15
|
+
*
|
|
16
|
+
* Implementations must:
|
|
17
|
+
* - Sanitize input to prevent injection (shell metacharacters, length limits)
|
|
18
|
+
* - Handle errors gracefully (log, never throw)
|
|
19
|
+
*/
|
|
20
|
+
export interface IDesktopNotifier {
|
|
21
|
+
/**
|
|
22
|
+
* Send a native OS desktop notification.
|
|
23
|
+
*
|
|
24
|
+
* @param title - Notification title
|
|
25
|
+
* @param body - Notification body text
|
|
26
|
+
*/
|
|
27
|
+
send(title: string, body: string): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=i-desktop-notifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i-desktop-notifier.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/i-desktop-notifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACzC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Desktop Notifier Interface
|
|
3
|
+
*
|
|
4
|
+
* Output port for sending native OS desktop notifications.
|
|
5
|
+
* Infrastructure layer provides concrete implementations:
|
|
6
|
+
* - DesktopNotifier (node-notifier) — default for CLI/web contexts
|
|
7
|
+
* - ElectronDesktopNotifier — used when running inside Electron
|
|
8
|
+
*
|
|
9
|
+
* Following Clean Architecture:
|
|
10
|
+
* - Application layer depends on this interface
|
|
11
|
+
* - Infrastructure layer provides concrete implementations
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
@@ -21,4 +21,6 @@ export type { IGitHubRepositoryService, GitHubRepo, GitHubOrganization, ListUser
|
|
|
21
21
|
export { GitHubAuthError, GitHubCloneError, GitHubUrlParseError, GitHubRepoListError, } from './github-repository-service.interface.js';
|
|
22
22
|
export type { IInteractiveSessionService, StreamChunk, UnsubscribeFn, ChatState, } from './interactive-session-service.interface.js';
|
|
23
23
|
export type { ISkillInjectorService, SkillInjectionResult } from './skill-injector.interface.js';
|
|
24
|
+
export type { IDesktopNotifier } from './i-desktop-notifier.js';
|
|
25
|
+
export type { IBrowserOpener } from './i-browser-opener.js';
|
|
24
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EACV,wBAAwB,EACxB,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,YAAY,EACZ,eAAe,GAChB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,0BAA0B,EAC1B,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,4CAA4C,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EACV,wBAAwB,EACxB,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,YAAY,EACZ,eAAe,GAChB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,0BAA0B,EAC1B,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,4CAA4C,CAAC;AACpD,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACjG,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* CheckAndUnblockFeaturesUseCase
|
|
3
3
|
*
|
|
4
4
|
* Evaluates whether blocked direct children of a parent feature are now
|
|
5
|
-
* eligible to start, and if so transitions them to Started
|
|
6
|
-
* agents.
|
|
5
|
+
* eligible to start, and if so transitions them to Started, rebases their
|
|
6
|
+
* branches onto the parent branch, and spawns their agents.
|
|
7
7
|
*
|
|
8
8
|
* Business Rules:
|
|
9
9
|
* - Only direct children of parentFeatureId are evaluated (no recursive traversal).
|
|
@@ -11,20 +11,63 @@
|
|
|
11
11
|
* - Gate: parent lifecycle must be in POST_IMPLEMENTATION (Implementation, Review, Maintain).
|
|
12
12
|
* - Idempotent: already-Started children are not touched; calling execute() twice is safe.
|
|
13
13
|
* - spawn() is skipped for children missing agentRunId or specPath (defensive guard).
|
|
14
|
+
* - Auto-rebase: each blocked child's branch is rebased onto the parent branch
|
|
15
|
+
* before spawning the agent. Rebase failures are isolated per-child and recorded
|
|
16
|
+
* in the activity timeline. Agent spawns regardless of rebase outcome.
|
|
17
|
+
* - NFR-3: rebase is skipped if the child has an active (running) agent run.
|
|
14
18
|
*
|
|
15
19
|
* Called from: UpdateFeatureLifecycleUseCase after every lifecycle transition.
|
|
16
20
|
*/
|
|
17
21
|
import type { IFeatureRepository } from '../../ports/output/repositories/feature-repository.interface.js';
|
|
18
22
|
import type { IFeatureAgentProcessService } from '../../ports/output/agents/feature-agent-process.interface.js';
|
|
23
|
+
import type { IGitPrService } from '../../ports/output/services/git-pr-service.interface.js';
|
|
24
|
+
import type { IWorktreeService } from '../../ports/output/services/worktree-service.interface.js';
|
|
25
|
+
import type { ConflictResolutionService } from '../../../infrastructure/services/agents/conflict-resolution/conflict-resolution.service.js';
|
|
26
|
+
import type { IAgentRunRepository } from '../../ports/output/agents/agent-run-repository.interface.js';
|
|
27
|
+
import type { IPhaseTimingRepository } from '../../ports/output/agents/phase-timing-repository.interface.js';
|
|
19
28
|
export declare class CheckAndUnblockFeaturesUseCase {
|
|
20
29
|
private readonly featureRepo;
|
|
21
30
|
private readonly agentProcess;
|
|
22
|
-
|
|
31
|
+
private readonly gitPrService;
|
|
32
|
+
private readonly worktreeService;
|
|
33
|
+
private readonly conflictResolutionService;
|
|
34
|
+
private readonly agentRunRepo;
|
|
35
|
+
private readonly phaseTimingRepo;
|
|
36
|
+
constructor(featureRepo: IFeatureRepository, agentProcess: IFeatureAgentProcessService, gitPrService: IGitPrService, worktreeService: IWorktreeService, conflictResolutionService: ConflictResolutionService, agentRunRepo: IAgentRunRepository, phaseTimingRepo: IPhaseTimingRepository);
|
|
23
37
|
/**
|
|
24
38
|
* Check and unblock direct children of the given parent feature.
|
|
25
39
|
*
|
|
26
40
|
* @param parentFeatureId - ID of the feature whose children should be evaluated.
|
|
27
41
|
*/
|
|
28
42
|
execute(parentFeatureId: string): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Rebase a child feature branch onto the parent feature branch.
|
|
45
|
+
*
|
|
46
|
+
* Creates an agent run + phase timing for activity timeline tracking.
|
|
47
|
+
* Stashes uncommitted changes before rebase and restores in finally block.
|
|
48
|
+
* Delegates to ConflictResolutionService on conflicts.
|
|
49
|
+
* Failures are recorded but do not prevent agent spawn.
|
|
50
|
+
*
|
|
51
|
+
* Skips rebase if the child has an active (running) agent run (NFR-3).
|
|
52
|
+
*/
|
|
53
|
+
private rebaseChildOntoParent;
|
|
54
|
+
/**
|
|
55
|
+
* Perform the rebase with conflict resolution.
|
|
56
|
+
*/
|
|
57
|
+
private performRebase;
|
|
58
|
+
/**
|
|
59
|
+
* Create a timeout promise that rejects after the specified duration.
|
|
60
|
+
*/
|
|
61
|
+
private createTimeout;
|
|
62
|
+
/**
|
|
63
|
+
* Complete the phase timing and update agent run status.
|
|
64
|
+
*/
|
|
65
|
+
private completeTiming;
|
|
66
|
+
/**
|
|
67
|
+
* Resolve the correct working directory for the child feature.
|
|
68
|
+
* Uses the worktree path if a worktree exists for this branch,
|
|
69
|
+
* otherwise falls back to the repository root.
|
|
70
|
+
*/
|
|
71
|
+
private resolveCwd;
|
|
29
72
|
}
|
|
30
73
|
//# sourceMappingURL=check-and-unblock-features.use-case.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-and-unblock-features.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"check-and-unblock-features.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAK7F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4FAA4F,CAAC;AAC5I,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gEAAgE,CAAC;AAM7G,qBACa,8BAA8B;IAET,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE1D,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAE1C,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAZe,WAAW,EAAE,kBAAkB,EAE7D,YAAY,EAAE,2BAA2B,EAEzC,YAAY,EAAE,aAAa,EAE3B,eAAe,EAAE,gBAAgB,EAEjC,yBAAyB,EAAE,yBAAyB,EAEpD,YAAY,EAAE,mBAAmB,EAEjC,eAAe,EAAE,sBAAsB;IAG1D;;;;OAIG;IACG,OAAO,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDrD;;;;;;;;;OASG;YACW,qBAAqB;IAwEnC;;OAEG;YACW,aAAa;IAiB3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;YACW,cAAc;IAwB5B;;;;OAIG;YACW,UAAU;CAOzB"}
|
package/dist/packages/core/src/application/use-cases/features/check-and-unblock-features.use-case.js
CHANGED
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* CheckAndUnblockFeaturesUseCase
|
|
3
3
|
*
|
|
4
4
|
* Evaluates whether blocked direct children of a parent feature are now
|
|
5
|
-
* eligible to start, and if so transitions them to Started
|
|
6
|
-
* agents.
|
|
5
|
+
* eligible to start, and if so transitions them to Started, rebases their
|
|
6
|
+
* branches onto the parent branch, and spawns their agents.
|
|
7
7
|
*
|
|
8
8
|
* Business Rules:
|
|
9
9
|
* - Only direct children of parentFeatureId are evaluated (no recursive traversal).
|
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
* - Gate: parent lifecycle must be in POST_IMPLEMENTATION (Implementation, Review, Maintain).
|
|
12
12
|
* - Idempotent: already-Started children are not touched; calling execute() twice is safe.
|
|
13
13
|
* - spawn() is skipped for children missing agentRunId or specPath (defensive guard).
|
|
14
|
+
* - Auto-rebase: each blocked child's branch is rebased onto the parent branch
|
|
15
|
+
* before spawning the agent. Rebase failures are isolated per-child and recorded
|
|
16
|
+
* in the activity timeline. Agent spawns regardless of rebase outcome.
|
|
17
|
+
* - NFR-3: rebase is skipped if the child has an active (running) agent run.
|
|
14
18
|
*
|
|
15
19
|
* Called from: UpdateFeatureLifecycleUseCase after every lifecycle transition.
|
|
16
20
|
*/
|
|
@@ -27,14 +31,28 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
27
31
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
28
32
|
};
|
|
29
33
|
import { injectable, inject } from 'tsyringe';
|
|
30
|
-
import {
|
|
34
|
+
import { randomUUID } from 'node:crypto';
|
|
35
|
+
import { SdlcLifecycle, AgentRunStatus, AgentType } from '../../../domain/generated/output.js';
|
|
36
|
+
import { GitPrError, GitPrErrorCode, } from '../../ports/output/services/git-pr-service.interface.js';
|
|
31
37
|
import { POST_IMPLEMENTATION } from '../../../domain/lifecycle-gates.js';
|
|
38
|
+
/** Maximum time (ms) to wait for a single child rebase before aborting. */
|
|
39
|
+
const REBASE_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
32
40
|
let CheckAndUnblockFeaturesUseCase = class CheckAndUnblockFeaturesUseCase {
|
|
33
41
|
featureRepo;
|
|
34
42
|
agentProcess;
|
|
35
|
-
|
|
43
|
+
gitPrService;
|
|
44
|
+
worktreeService;
|
|
45
|
+
conflictResolutionService;
|
|
46
|
+
agentRunRepo;
|
|
47
|
+
phaseTimingRepo;
|
|
48
|
+
constructor(featureRepo, agentProcess, gitPrService, worktreeService, conflictResolutionService, agentRunRepo, phaseTimingRepo) {
|
|
36
49
|
this.featureRepo = featureRepo;
|
|
37
50
|
this.agentProcess = agentProcess;
|
|
51
|
+
this.gitPrService = gitPrService;
|
|
52
|
+
this.worktreeService = worktreeService;
|
|
53
|
+
this.conflictResolutionService = conflictResolutionService;
|
|
54
|
+
this.agentRunRepo = agentRunRepo;
|
|
55
|
+
this.phaseTimingRepo = phaseTimingRepo;
|
|
38
56
|
}
|
|
39
57
|
/**
|
|
40
58
|
* Check and unblock direct children of the given parent feature.
|
|
@@ -58,6 +76,8 @@ let CheckAndUnblockFeaturesUseCase = class CheckAndUnblockFeaturesUseCase {
|
|
|
58
76
|
child.lifecycle = SdlcLifecycle.Started;
|
|
59
77
|
child.updatedAt = new Date();
|
|
60
78
|
await this.featureRepo.update(child);
|
|
79
|
+
// Rebase child branch onto parent branch (isolated per-child)
|
|
80
|
+
await this.rebaseChildOntoParent(child, parent);
|
|
61
81
|
// Spawn agent using fields set at feature creation time
|
|
62
82
|
if (child.agentRunId && child.specPath) {
|
|
63
83
|
this.agentProcess.spawn(child.id, child.agentRunId, child.repositoryPath, child.specPath, child.worktreePath, {
|
|
@@ -74,11 +94,139 @@ let CheckAndUnblockFeaturesUseCase = class CheckAndUnblockFeaturesUseCase {
|
|
|
74
94
|
}
|
|
75
95
|
}
|
|
76
96
|
}
|
|
97
|
+
/**
|
|
98
|
+
* Rebase a child feature branch onto the parent feature branch.
|
|
99
|
+
*
|
|
100
|
+
* Creates an agent run + phase timing for activity timeline tracking.
|
|
101
|
+
* Stashes uncommitted changes before rebase and restores in finally block.
|
|
102
|
+
* Delegates to ConflictResolutionService on conflicts.
|
|
103
|
+
* Failures are recorded but do not prevent agent spawn.
|
|
104
|
+
*
|
|
105
|
+
* Skips rebase if the child has an active (running) agent run (NFR-3).
|
|
106
|
+
*/
|
|
107
|
+
async rebaseChildOntoParent(child, parent) {
|
|
108
|
+
// NFR-3: skip rebase if child has an active agent run
|
|
109
|
+
if (child.agentRunId) {
|
|
110
|
+
const existingRun = await this.agentRunRepo.findById(child.agentRunId);
|
|
111
|
+
if (existingRun && existingRun.status === AgentRunStatus.running) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Create standalone agent run + phase timing for activity timeline
|
|
116
|
+
const now = new Date().toISOString();
|
|
117
|
+
const agentRunId = randomUUID();
|
|
118
|
+
const phaseTimingId = randomUUID();
|
|
119
|
+
await this.agentRunRepo.create({
|
|
120
|
+
id: agentRunId,
|
|
121
|
+
agentType: AgentType.ClaudeCode,
|
|
122
|
+
agentName: 'rebase',
|
|
123
|
+
status: AgentRunStatus.running,
|
|
124
|
+
prompt: `Rebase ${child.branch} onto parent ${parent.branch}`,
|
|
125
|
+
threadId: agentRunId,
|
|
126
|
+
startedAt: now,
|
|
127
|
+
featureId: child.id,
|
|
128
|
+
repositoryPath: child.repositoryPath,
|
|
129
|
+
createdAt: now,
|
|
130
|
+
updatedAt: now,
|
|
131
|
+
});
|
|
132
|
+
await this.phaseTimingRepo.save({
|
|
133
|
+
id: phaseTimingId,
|
|
134
|
+
agentRunId,
|
|
135
|
+
phase: 'rebase-on-parent',
|
|
136
|
+
startedAt: now,
|
|
137
|
+
createdAt: now,
|
|
138
|
+
updatedAt: now,
|
|
139
|
+
});
|
|
140
|
+
const startMs = Date.now();
|
|
141
|
+
try {
|
|
142
|
+
// Resolve CWD — worktree path if it exists, else repo root
|
|
143
|
+
const cwd = await this.resolveCwd(child.repositoryPath, child.branch);
|
|
144
|
+
// Stash uncommitted changes (smart rebase)
|
|
145
|
+
const didStash = await this.gitPrService.stash(cwd, 'shep-rebase: auto-stash before parent rebase');
|
|
146
|
+
try {
|
|
147
|
+
// Rebase child branch onto parent branch (with timeout)
|
|
148
|
+
await Promise.race([
|
|
149
|
+
this.performRebase(cwd, child.branch, parent.branch),
|
|
150
|
+
this.createTimeout(REBASE_TIMEOUT_MS, child.branch),
|
|
151
|
+
]);
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
// Restore stashed changes (regardless of rebase outcome)
|
|
155
|
+
if (didStash) {
|
|
156
|
+
await this.gitPrService.stashPop(cwd);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Rebase succeeded
|
|
160
|
+
await this.completeTiming(agentRunId, phaseTimingId, startMs, 'success');
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
// Record failure in activity timeline but do not throw —
|
|
164
|
+
// agent spawn proceeds regardless of rebase outcome
|
|
165
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
166
|
+
await this.completeTiming(agentRunId, phaseTimingId, startMs, 'error', message);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Perform the rebase with conflict resolution.
|
|
171
|
+
*/
|
|
172
|
+
async performRebase(cwd, childBranch, parentBranch) {
|
|
173
|
+
try {
|
|
174
|
+
await this.gitPrService.rebaseOnBranch(cwd, childBranch, parentBranch);
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
if (error instanceof GitPrError && error.code === GitPrErrorCode.REBASE_CONFLICT) {
|
|
178
|
+
// Delegate to agent-powered conflict resolution
|
|
179
|
+
await this.conflictResolutionService.resolve(cwd, childBranch, parentBranch);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
throw error;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Create a timeout promise that rejects after the specified duration.
|
|
188
|
+
*/
|
|
189
|
+
createTimeout(ms, childBranch) {
|
|
190
|
+
return new Promise((_, reject) => {
|
|
191
|
+
setTimeout(() => reject(new Error(`Rebase timeout: ${childBranch} exceeded ${ms}ms`)), ms);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Complete the phase timing and update agent run status.
|
|
196
|
+
*/
|
|
197
|
+
async completeTiming(agentRunId, phaseTimingId, startMs, exitCode, errorMessage) {
|
|
198
|
+
const completedAt = new Date().toISOString();
|
|
199
|
+
const durationMs = Date.now() - startMs;
|
|
200
|
+
await this.phaseTimingRepo.update(phaseTimingId, {
|
|
201
|
+
completedAt,
|
|
202
|
+
durationMs: BigInt(durationMs),
|
|
203
|
+
exitCode,
|
|
204
|
+
...(errorMessage && { errorMessage }),
|
|
205
|
+
});
|
|
206
|
+
await this.agentRunRepo.updateStatus(agentRunId, exitCode === 'success' ? AgentRunStatus.completed : AgentRunStatus.failed, { completedAt, ...(errorMessage && { error: errorMessage }) });
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Resolve the correct working directory for the child feature.
|
|
210
|
+
* Uses the worktree path if a worktree exists for this branch,
|
|
211
|
+
* otherwise falls back to the repository root.
|
|
212
|
+
*/
|
|
213
|
+
async resolveCwd(repositoryPath, branch) {
|
|
214
|
+
const hasWorktree = await this.worktreeService.exists(repositoryPath, branch);
|
|
215
|
+
if (hasWorktree) {
|
|
216
|
+
return this.worktreeService.getWorktreePath(repositoryPath, branch);
|
|
217
|
+
}
|
|
218
|
+
return repositoryPath;
|
|
219
|
+
}
|
|
77
220
|
};
|
|
78
221
|
CheckAndUnblockFeaturesUseCase = __decorate([
|
|
79
222
|
injectable(),
|
|
80
223
|
__param(0, inject('IFeatureRepository')),
|
|
81
224
|
__param(1, inject('IFeatureAgentProcessService')),
|
|
82
|
-
|
|
225
|
+
__param(2, inject('IGitPrService')),
|
|
226
|
+
__param(3, inject('IWorktreeService')),
|
|
227
|
+
__param(4, inject('ConflictResolutionService')),
|
|
228
|
+
__param(5, inject('IAgentRunRepository')),
|
|
229
|
+
__param(6, inject('IPhaseTimingRepository')),
|
|
230
|
+
__metadata("design:paramtypes", [Object, Object, Object, Object, Function, Object, Object])
|
|
83
231
|
], CheckAndUnblockFeaturesUseCase);
|
|
84
232
|
export { CheckAndUnblockFeaturesUseCase };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReparentFeatureUseCase
|
|
3
|
+
*
|
|
4
|
+
* Updates a feature's parent dependency (or clears it). Performs validation:
|
|
5
|
+
* - Same-repository constraint (child and parent must share repositoryPath)
|
|
6
|
+
* - Cycle detection via upward ancestor walk
|
|
7
|
+
* - Lifecycle guards (cannot reparent completed/archived/deleting features)
|
|
8
|
+
* - Lifecycle state adjustment based on new parent's lifecycle
|
|
9
|
+
*
|
|
10
|
+
* After reparenting, if the new parent is post-implementation, calls
|
|
11
|
+
* CheckAndUnblockFeaturesUseCase to trigger the unblock+rebase flow
|
|
12
|
+
* for any Blocked children of the reparented feature.
|
|
13
|
+
*/
|
|
14
|
+
import type { IFeatureRepository } from '../../ports/output/repositories/feature-repository.interface.js';
|
|
15
|
+
import { CheckAndUnblockFeaturesUseCase } from './check-and-unblock-features.use-case.js';
|
|
16
|
+
export interface ReparentFeatureInput {
|
|
17
|
+
featureId: string;
|
|
18
|
+
parentId: string | null;
|
|
19
|
+
}
|
|
20
|
+
export declare class ReparentFeatureUseCase {
|
|
21
|
+
private readonly featureRepo;
|
|
22
|
+
private readonly checkAndUnblock;
|
|
23
|
+
constructor(featureRepo: IFeatureRepository, checkAndUnblock: CheckAndUnblockFeaturesUseCase);
|
|
24
|
+
execute(input: ReparentFeatureInput): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Walk the ancestor chain from the proposed parent upward.
|
|
27
|
+
* If the child feature ID is found in the chain, a cycle exists.
|
|
28
|
+
*/
|
|
29
|
+
private detectCycle;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=reparent-feature.use-case.d.ts.map
|
package/dist/packages/core/src/application/use-cases/features/reparent-feature.use-case.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reparent-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/reparent-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAE1G,OAAO,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAC;AAS1F,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,qBACa,sBAAsB;IAG/B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAFf,WAAW,EAAE,kBAAkB,EAE/B,eAAe,EAAE,8BAA8B;IAG5D,OAAO,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0EzD;;;OAGG;YACW,WAAW;CAgB1B"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ReparentFeatureUseCase
|
|
3
|
+
*
|
|
4
|
+
* Updates a feature's parent dependency (or clears it). Performs validation:
|
|
5
|
+
* - Same-repository constraint (child and parent must share repositoryPath)
|
|
6
|
+
* - Cycle detection via upward ancestor walk
|
|
7
|
+
* - Lifecycle guards (cannot reparent completed/archived/deleting features)
|
|
8
|
+
* - Lifecycle state adjustment based on new parent's lifecycle
|
|
9
|
+
*
|
|
10
|
+
* After reparenting, if the new parent is post-implementation, calls
|
|
11
|
+
* CheckAndUnblockFeaturesUseCase to trigger the unblock+rebase flow
|
|
12
|
+
* for any Blocked children of the reparented feature.
|
|
13
|
+
*/
|
|
14
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
15
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
16
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
17
|
+
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;
|
|
18
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
19
|
+
};
|
|
20
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
21
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
22
|
+
};
|
|
23
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
24
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
25
|
+
};
|
|
26
|
+
import { injectable, inject } from 'tsyringe';
|
|
27
|
+
import { SdlcLifecycle } from '../../../domain/generated/output.js';
|
|
28
|
+
import { POST_IMPLEMENTATION } from '../../../domain/lifecycle-gates.js';
|
|
29
|
+
import { CheckAndUnblockFeaturesUseCase } from './check-and-unblock-features.use-case.js';
|
|
30
|
+
/** Lifecycle states that cannot be reparented. */
|
|
31
|
+
const NON_REPARENTABLE_STATES = new Set([
|
|
32
|
+
SdlcLifecycle.Maintain,
|
|
33
|
+
SdlcLifecycle.Archived,
|
|
34
|
+
SdlcLifecycle.Deleting,
|
|
35
|
+
]);
|
|
36
|
+
let ReparentFeatureUseCase = class ReparentFeatureUseCase {
|
|
37
|
+
featureRepo;
|
|
38
|
+
checkAndUnblock;
|
|
39
|
+
constructor(featureRepo, checkAndUnblock) {
|
|
40
|
+
this.featureRepo = featureRepo;
|
|
41
|
+
this.checkAndUnblock = checkAndUnblock;
|
|
42
|
+
}
|
|
43
|
+
async execute(input) {
|
|
44
|
+
const { featureId, parentId } = input;
|
|
45
|
+
// Self-reparent guard
|
|
46
|
+
if (parentId !== null && featureId === parentId) {
|
|
47
|
+
throw new Error('A feature cannot be set as parent of itself.');
|
|
48
|
+
}
|
|
49
|
+
// Load child feature
|
|
50
|
+
const child = await this.featureRepo.findById(featureId);
|
|
51
|
+
if (!child) {
|
|
52
|
+
throw new Error(`Feature not found: ${featureId}`);
|
|
53
|
+
}
|
|
54
|
+
// Lifecycle guard — reject completed/terminal features
|
|
55
|
+
if (NON_REPARENTABLE_STATES.has(child.lifecycle)) {
|
|
56
|
+
throw new Error(`Cannot reparent feature "${child.name}": lifecycle is ${child.lifecycle}. ` +
|
|
57
|
+
'Only active features can be reparented.');
|
|
58
|
+
}
|
|
59
|
+
// Unparent case
|
|
60
|
+
if (parentId === null) {
|
|
61
|
+
const newLifecycle = child.lifecycle === SdlcLifecycle.Blocked ? SdlcLifecycle.Started : child.lifecycle;
|
|
62
|
+
await this.featureRepo.update({
|
|
63
|
+
...child,
|
|
64
|
+
parentId: undefined,
|
|
65
|
+
lifecycle: newLifecycle,
|
|
66
|
+
updatedAt: new Date(),
|
|
67
|
+
});
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
// Load parent feature
|
|
71
|
+
const parent = await this.featureRepo.findById(parentId);
|
|
72
|
+
if (!parent) {
|
|
73
|
+
throw new Error(`Parent feature not found: ${parentId}`);
|
|
74
|
+
}
|
|
75
|
+
// Same-repository constraint
|
|
76
|
+
if (child.repositoryPath !== parent.repositoryPath) {
|
|
77
|
+
throw new Error('Features must be in the same repository to form a dependency.');
|
|
78
|
+
}
|
|
79
|
+
// Cycle detection — walk from proposed parent upward
|
|
80
|
+
await this.detectCycle(featureId, parentId);
|
|
81
|
+
// Determine lifecycle adjustment based on new parent's lifecycle
|
|
82
|
+
let newLifecycle = child.lifecycle;
|
|
83
|
+
if (parent.lifecycle === SdlcLifecycle.Blocked || !POST_IMPLEMENTATION.has(parent.lifecycle)) {
|
|
84
|
+
// Parent is pre-implementation or Blocked — child should be Blocked
|
|
85
|
+
if (child.lifecycle !== SdlcLifecycle.Blocked && child.lifecycle !== SdlcLifecycle.Pending) {
|
|
86
|
+
newLifecycle = SdlcLifecycle.Blocked;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// Persist the reparent
|
|
90
|
+
await this.featureRepo.update({
|
|
91
|
+
...child,
|
|
92
|
+
parentId,
|
|
93
|
+
lifecycle: newLifecycle,
|
|
94
|
+
updatedAt: new Date(),
|
|
95
|
+
});
|
|
96
|
+
// If new parent is post-implementation, trigger unblock flow for the
|
|
97
|
+
// reparented feature's own children (the feature itself may now be a parent
|
|
98
|
+
// of Blocked children that should be unblocked)
|
|
99
|
+
if (POST_IMPLEMENTATION.has(parent.lifecycle)) {
|
|
100
|
+
await this.checkAndUnblock.execute(featureId);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Walk the ancestor chain from the proposed parent upward.
|
|
105
|
+
* If the child feature ID is found in the chain, a cycle exists.
|
|
106
|
+
*/
|
|
107
|
+
async detectCycle(childId, parentId) {
|
|
108
|
+
const visited = new Set([childId]);
|
|
109
|
+
let cursor = parentId;
|
|
110
|
+
while (cursor) {
|
|
111
|
+
if (visited.has(cursor)) {
|
|
112
|
+
throw new Error(`Cycle detected in feature dependency chain. ` +
|
|
113
|
+
`Setting ${parentId} as parent of ${childId} would create a circular dependency.`);
|
|
114
|
+
}
|
|
115
|
+
visited.add(cursor);
|
|
116
|
+
const ancestor = await this.featureRepo.findById(cursor);
|
|
117
|
+
cursor = ancestor?.parentId ?? undefined;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
ReparentFeatureUseCase = __decorate([
|
|
122
|
+
injectable(),
|
|
123
|
+
__param(0, inject('IFeatureRepository')),
|
|
124
|
+
__param(1, inject(CheckAndUnblockFeaturesUseCase)),
|
|
125
|
+
__metadata("design:paramtypes", [Object, CheckAndUnblockFeaturesUseCase])
|
|
126
|
+
], ReparentFeatureUseCase);
|
|
127
|
+
export { ReparentFeatureUseCase };
|
|
@@ -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;AA4JrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAgdrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
|