@shepai/cli 1.124.0-pr396.2dd2ae6 → 1.124.0-pr402.06ada70
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/deployment-service.interface.d.ts +13 -2
- package/dist/packages/core/src/application/ports/output/services/deployment-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +5 -68
- 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/git-pr-service.interface.js +4 -6
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +2 -15
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-create-dev-servers-table.d.ts +21 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-create-dev-servers-table.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-create-dev-servers-table.js +32 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/ci-watch-fix-loop.js +9 -0
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts +24 -14
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +203 -31
- package/dist/packages/core/src/infrastructure/services/deployment/parse-port.d.ts +0 -6
- package/dist/packages/core/src/infrastructure/services/deployment/parse-port.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/deployment/parse-port.js +6 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +0 -6
- 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 +7 -127
- package/dist/src/presentation/web/app/actions/deploy-feature.js +1 -1
- package/dist/src/presentation/web/app/actions/deploy-repository.js +1 -1
- 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 +1 -2
- package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +4 -4
- package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts +0 -4
- package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.js +1 -32
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +1 -4
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +2 -2
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts +1 -4
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +3 -8
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +0 -6
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +0 -30
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.js +0 -3
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +3 -3
- package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/repository-node.js +8 -5
- package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts +0 -4
- package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.js +0 -11
- 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 +12 -3
- package/dist/src/presentation/web/components/features/settings/notification-settings-section.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/notification-settings-section.js +4 -8
- package/dist/src/presentation/web/components/features/settings/notification-settings-section.stories.js +3 -3
- package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.js +12 -37
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +2 -3
- package/dist/src/presentation/web/hooks/use-deploy-action.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-deploy-action.js +69 -10
- package/dist/src/presentation/web/lib/layout-with-dagre.js +3 -3
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +1 -1
- package/web/.next/required-server-files.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +48 -63
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
- 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 +60 -90
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
- 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 +60 -90
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
- 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 +44 -59
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
- 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 +48 -63
- package/web/.next/server/app/(dashboard)/create/page.js +2 -2
- 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 +60 -90
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
- 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 +60 -90
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
- 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 +44 -59
- package/web/.next/server/app/(dashboard)/page.js +2 -2
- 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 +44 -59
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
- 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 +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/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/settings/page/server-reference-manifest.json +6 -6
- 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 -2
- 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 -2
- 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.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
- package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.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_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_fdfbf5cc.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_fdfbf5cc.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_d8fa0b5f.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_d8fa0b5f.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__248b9fc3._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__248b9fc3._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357de47c._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357de47c._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56ecbe40._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56ecbe40._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__67fe07fe._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__67fe07fe._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a50a7e39._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a50a7e39._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__dfc367f2._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__7a715c73._.js.map → [root-of-the-server]__dfc367f2._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e7f61cc6._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__a32640a5._.js.map → [root-of-the-server]__e7f61cc6._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fe48d2dc._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__fe48d2dc._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_2f6f48b8._.js +1 -1
- package/web/.next/server/chunks/ssr/_2f6f48b8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js +3 -0
- package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_0e506641._.js → _918887c5._.js} +2 -2
- package/web/.next/server/chunks/ssr/_918887c5._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_a2eff93a._.js +3 -0
- package/web/.next/server/chunks/ssr/_a2eff93a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_1bb131c4._.js → _d4b20e29._.js} +2 -2
- package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_e2638d5f._.js → _d7f927ec._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_e2638d5f._.js.map → _d7f927ec._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_e9703421._.js +1 -1
- package/web/.next/server/chunks/ssr/_e9703421._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f39a1adb._.js +3 -0
- package/web/.next/server/chunks/ssr/{_135edb9c._.js.map → _f39a1adb._.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/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_073917db._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_073917db._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_9db47db7._.js +5 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_e4e3c09b._.js.map → src_presentation_web_9db47db7._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f66cd328.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f66cd328.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.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_ede4a227._.js +5 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_d1d40a09._.js.map → src_presentation_web_ede4a227._.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 +285 -392
- package/web/.next/static/chunks/01ba448cf76c6014.js +1 -0
- package/web/.next/static/chunks/{80f9e0cade7d717b.js → 04f47be1504521fc.js} +1 -1
- package/web/.next/static/chunks/0a514695ca5fabc3.js +2 -0
- package/web/.next/static/chunks/1be7ac7a24009333.css +1 -0
- package/web/.next/static/chunks/28f1dddebda55af2.js +1 -0
- package/web/.next/static/chunks/2ee4a1a94f6001ea.js +1 -0
- package/web/.next/static/chunks/{8b87caa5e8e72539.js → 33d7958650742d27.js} +1 -1
- package/web/.next/static/chunks/37ada233462bcaec.js +11 -0
- package/web/.next/static/chunks/469f49ae02e8a1f6.js +1 -0
- package/web/.next/static/chunks/54481c140fd8761a.js +1 -0
- package/web/.next/static/chunks/{0a25d970e4abd189.js → b609272225ffb749.js} +1 -1
- package/web/.next/static/chunks/b70dd4985a814b27.js +1 -0
- package/web/.next/static/chunks/e651e1ec05e5a806.js +1 -0
- package/web/.next/static/chunks/eb9841ec4d80af01.js +1 -0
- package/web/.next/static/chunks/f2c96db74a878fa1.js +1 -0
- package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts +0 -28
- package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts.map +0 -1
- package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.js +0 -81
- package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts +0 -16
- package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts.map +0 -1
- package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.js +0 -43
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts +0 -35
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.js +0 -66
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts +0 -42
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.js +0 -169
- package/dist/src/presentation/web/app/actions/rebase-feature.d.ts +0 -5
- package/dist/src/presentation/web/app/actions/rebase-feature.d.ts.map +0 -1
- package/dist/src/presentation/web/app/actions/rebase-feature.js +0 -16
- package/dist/src/presentation/web/app/actions/sync-repository.d.ts +0 -5
- package/dist/src/presentation/web/app/actions/sync-repository.d.ts.map +0 -1
- package/dist/src/presentation/web/app/actions/sync-repository.js +0 -16
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_9efdd752.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_9efdd752.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6ce19942.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6ce19942.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__14664e9b._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__14664e9b._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__16a547fc._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__16a547fc._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4993a47c._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4993a47c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__545792ab._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7a715c73._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a32640a5._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a7de2711._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c94704d6._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c94704d6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_0e506641._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_135edb9c._.js +0 -3
- package/web/.next/server/chunks/ssr/_1bb131c4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_966c4532._.js +0 -3
- package/web/.next/server/chunks/ssr/_966c4532._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_cc77a143._.js +0 -3
- package/web/.next/server/chunks/ssr/_cc77a143._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_883074bc.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_883074bc.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_d1d40a09._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_e4e3c09b._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web_f6b57368._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_f6b57368._.js.map +0 -1
- package/web/.next/static/chunks/11fbcb908d07e234.js +0 -1
- package/web/.next/static/chunks/3925626b99dcd57a.css +0 -1
- package/web/.next/static/chunks/4b51f8f4e49665b8.js +0 -1
- package/web/.next/static/chunks/513b719e49ca003a.js +0 -11
- package/web/.next/static/chunks/77304c4f9c5bb158.js +0 -1
- package/web/.next/static/chunks/9b7dbb75030aac3e.js +0 -1
- package/web/.next/static/chunks/ac7251026c1e2cdf.js +0 -1
- package/web/.next/static/chunks/cd008e10baaeae9a.js +0 -1
- package/web/.next/static/chunks/d71ce7044ed5a85a.js +0 -2
- package/web/.next/static/chunks/db8d50abcf46d8b3.js +0 -1
- package/web/.next/static/chunks/e2ef95d904c360f3.js +0 -1
- /package/web/.next/static/{MpP2wa-zjPqcZxmpuDBjj → FXJ9jqgleHlSoq4JKo32G}/_buildManifest.js +0 -0
- /package/web/.next/static/{MpP2wa-zjPqcZxmpuDBjj → FXJ9jqgleHlSoq4JKo32G}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{MpP2wa-zjPqcZxmpuDBjj → FXJ9jqgleHlSoq4JKo32G}/_ssgManifest.js +0 -0
|
@@ -2,13 +2,20 @@
|
|
|
2
2
|
* Deployment Service
|
|
3
3
|
*
|
|
4
4
|
* Infrastructure service that manages local dev server deployments.
|
|
5
|
-
* Holds an in-memory Map of active deployments keyed by targetId
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* Holds an in-memory Map of active deployments keyed by targetId AND
|
|
6
|
+
* persists deployment records to the `dev_servers` SQLite table so that
|
|
7
|
+
* running dev servers survive page reloads and server restarts.
|
|
8
|
+
*
|
|
9
|
+
* On startup, call `recoverAll()` to reconcile the DB with actual
|
|
10
|
+
* process state (clean up dead PIDs, re-adopt live ones).
|
|
8
11
|
*/
|
|
9
12
|
import { spawn } from 'node:child_process';
|
|
10
13
|
import { EventEmitter } from 'node:events';
|
|
11
|
-
|
|
14
|
+
// NOTE: We intentionally do NOT use tree-kill here. tree-kill traverses
|
|
15
|
+
// /proc to find child processes which can accidentally kill parent processes
|
|
16
|
+
// (including the Shep web UI). Instead, we use process.kill(-pid) to send
|
|
17
|
+
// signals to the process GROUP (since we spawn with detached: true, the
|
|
18
|
+
// child gets its own process group via setsid()).
|
|
12
19
|
import { DeploymentState } from '../../../domain/generated/output.js';
|
|
13
20
|
import { detectDevScript } from './detect-dev-script.js';
|
|
14
21
|
import { createDeploymentLogger } from './deployment-logger.js';
|
|
@@ -20,7 +27,22 @@ const MAX_WAIT_MS = 5000;
|
|
|
20
27
|
const defaultDeps = {
|
|
21
28
|
spawn,
|
|
22
29
|
detectDevScript,
|
|
23
|
-
kill: (pid, signal) =>
|
|
30
|
+
kill: (pid, signal) => {
|
|
31
|
+
try {
|
|
32
|
+
// Kill the entire process group (negative PID) — safe because
|
|
33
|
+
// detached: true puts the child in its own group via setsid().
|
|
34
|
+
process.kill(-pid, signal);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// Fallback: kill just the process itself
|
|
38
|
+
try {
|
|
39
|
+
process.kill(pid, signal);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// Process already dead
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
},
|
|
24
46
|
isAlive: (pid) => {
|
|
25
47
|
try {
|
|
26
48
|
process.kill(pid, 0);
|
|
@@ -35,14 +57,65 @@ export class DeploymentService {
|
|
|
35
57
|
deployments = new Map();
|
|
36
58
|
deps;
|
|
37
59
|
emitter = new EventEmitter();
|
|
60
|
+
db = null;
|
|
38
61
|
constructor(deps = {}) {
|
|
39
62
|
this.deps = { ...defaultDeps, ...deps };
|
|
40
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Inject the database connection. Called from DI container after DB is ready.
|
|
66
|
+
*/
|
|
67
|
+
setDatabase(db) {
|
|
68
|
+
this.db = db;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Recover dev servers from the database on startup.
|
|
72
|
+
* Validates each PID is still alive; removes dead rows.
|
|
73
|
+
*/
|
|
74
|
+
recoverAll() {
|
|
75
|
+
if (!this.db)
|
|
76
|
+
return;
|
|
77
|
+
let rows;
|
|
78
|
+
try {
|
|
79
|
+
const stmt = this.db.prepare('SELECT * FROM dev_servers');
|
|
80
|
+
rows = stmt.all() ?? [];
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
log.info('dev_servers table not ready — skipping recovery');
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
if (!rows || rows.length === 0) {
|
|
87
|
+
log.info('No dev servers to recover from database');
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
log.info(`Recovering ${rows.length} dev server(s) from database`);
|
|
91
|
+
for (const row of rows) {
|
|
92
|
+
if (this.deps.isAlive(row.pid)) {
|
|
93
|
+
log.info(`Recovered "${row.target_id}" (pid=${row.pid}, state=${row.state}, url=${row.url})`);
|
|
94
|
+
const entry = {
|
|
95
|
+
pid: row.pid,
|
|
96
|
+
child: null, // orphan — we don't have the ChildProcess handle
|
|
97
|
+
state: row.state,
|
|
98
|
+
url: row.url,
|
|
99
|
+
targetId: row.target_id,
|
|
100
|
+
targetPath: row.target_path,
|
|
101
|
+
targetType: row.target_type,
|
|
102
|
+
stdoutBuffer: '',
|
|
103
|
+
stderrBuffer: '',
|
|
104
|
+
logs: new LogRingBuffer(),
|
|
105
|
+
};
|
|
106
|
+
this.deployments.set(row.target_id, entry);
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
log.info(`Stale dev server "${row.target_id}" (pid=${row.pid}) — removing from DB`);
|
|
110
|
+
this.dbDelete(row.target_id);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
41
114
|
/**
|
|
42
115
|
* Start a deployment for the given target.
|
|
43
116
|
* If a deployment already exists for this target, it is stopped first.
|
|
44
117
|
*/
|
|
45
|
-
start(targetId, targetPath) {
|
|
118
|
+
start(targetId, targetPath, targetType = 'repository') {
|
|
46
119
|
log.info(`start() called — targetId="${targetId}", targetPath="${targetPath}"`);
|
|
47
120
|
// Stop any existing deployment for this target
|
|
48
121
|
const existing = this.deployments.get(targetId);
|
|
@@ -50,6 +123,7 @@ export class DeploymentService {
|
|
|
50
123
|
log.info(`Stopping existing deployment for "${targetId}" (pid=${existing.pid})`);
|
|
51
124
|
this.killProcess(existing);
|
|
52
125
|
this.deployments.delete(targetId);
|
|
126
|
+
this.dbDelete(targetId);
|
|
53
127
|
}
|
|
54
128
|
// Detect the dev script
|
|
55
129
|
const detection = this.deps.detectDevScript(targetPath);
|
|
@@ -78,11 +152,14 @@ export class DeploymentService {
|
|
|
78
152
|
state: DeploymentState.Booting,
|
|
79
153
|
url: null,
|
|
80
154
|
targetId,
|
|
155
|
+
targetPath,
|
|
156
|
+
targetType,
|
|
81
157
|
stdoutBuffer: '',
|
|
82
158
|
stderrBuffer: '',
|
|
83
159
|
logs: new LogRingBuffer(),
|
|
84
160
|
};
|
|
85
161
|
this.deployments.set(targetId, entry);
|
|
162
|
+
this.dbUpsert(entry);
|
|
86
163
|
// Attach stdout/stderr listeners for port detection
|
|
87
164
|
this.attachOutputListener(entry, 'stdout');
|
|
88
165
|
this.attachOutputListener(entry, 'stderr');
|
|
@@ -91,6 +168,7 @@ export class DeploymentService {
|
|
|
91
168
|
log.error(`Child process error for "${targetId}" (pid=${entry.pid}): ${err.message}`);
|
|
92
169
|
entry.state = DeploymentState.Stopped;
|
|
93
170
|
this.deployments.delete(targetId);
|
|
171
|
+
this.dbDelete(targetId);
|
|
94
172
|
});
|
|
95
173
|
// Clean up on process exit
|
|
96
174
|
child.on('exit', (code, signal) => {
|
|
@@ -100,20 +178,52 @@ export class DeploymentService {
|
|
|
100
178
|
log.warn('Process exited while still in Booting state — dev server likely crashed on startup. Check stderr output above.');
|
|
101
179
|
}
|
|
102
180
|
this.deployments.delete(targetId);
|
|
181
|
+
this.dbDelete(targetId);
|
|
103
182
|
});
|
|
104
183
|
}
|
|
105
184
|
/**
|
|
106
185
|
* Get the current deployment status for a target.
|
|
107
|
-
*
|
|
186
|
+
* Checks in-memory Map first, then falls back to DB for recovered deployments.
|
|
187
|
+
* Validates PID liveness — cleans up if dead.
|
|
108
188
|
*/
|
|
109
189
|
getStatus(targetId) {
|
|
110
190
|
const entry = this.deployments.get(targetId);
|
|
111
|
-
if (
|
|
112
|
-
|
|
113
|
-
|
|
191
|
+
if (entry) {
|
|
192
|
+
// Validate the process is still alive (handles orphan crashes)
|
|
193
|
+
if (!this.deps.isAlive(entry.pid)) {
|
|
194
|
+
log.info(`getStatus("${targetId}") — pid=${entry.pid} is dead, cleaning up`);
|
|
195
|
+
this.deployments.delete(targetId);
|
|
196
|
+
this.dbDelete(targetId);
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
log.debug(`getStatus("${targetId}") — state=${entry.state}, url=${entry.url}, pid=${entry.pid}`);
|
|
200
|
+
return { state: entry.state, url: entry.url };
|
|
114
201
|
}
|
|
115
|
-
|
|
116
|
-
|
|
202
|
+
// Check DB for entries not yet in memory (e.g., after hook re-mount)
|
|
203
|
+
const row = this.dbFind(targetId);
|
|
204
|
+
if (row) {
|
|
205
|
+
if (this.deps.isAlive(row.pid)) {
|
|
206
|
+
// Re-adopt into memory
|
|
207
|
+
const recovered = {
|
|
208
|
+
pid: row.pid,
|
|
209
|
+
child: null,
|
|
210
|
+
state: row.state,
|
|
211
|
+
url: row.url,
|
|
212
|
+
targetId: row.target_id,
|
|
213
|
+
targetPath: row.target_path,
|
|
214
|
+
targetType: row.target_type,
|
|
215
|
+
stdoutBuffer: '',
|
|
216
|
+
stderrBuffer: '',
|
|
217
|
+
logs: new LogRingBuffer(),
|
|
218
|
+
};
|
|
219
|
+
this.deployments.set(targetId, recovered);
|
|
220
|
+
return { state: recovered.state, url: recovered.url };
|
|
221
|
+
}
|
|
222
|
+
// Dead — clean up
|
|
223
|
+
this.dbDelete(targetId);
|
|
224
|
+
}
|
|
225
|
+
log.debug(`getStatus("${targetId}") — no deployment found`);
|
|
226
|
+
return null;
|
|
117
227
|
}
|
|
118
228
|
/**
|
|
119
229
|
* Stop a deployment gracefully: SIGTERM → poll → SIGKILL.
|
|
@@ -121,7 +231,19 @@ export class DeploymentService {
|
|
|
121
231
|
async stop(targetId) {
|
|
122
232
|
const entry = this.deployments.get(targetId);
|
|
123
233
|
if (!entry) {
|
|
124
|
-
|
|
234
|
+
// Check DB in case it's a recovered orphan
|
|
235
|
+
const row = this.dbFind(targetId);
|
|
236
|
+
if (row && this.deps.isAlive(row.pid)) {
|
|
237
|
+
log.info(`stop("${targetId}") — killing orphan process (pid=${row.pid})`);
|
|
238
|
+
try {
|
|
239
|
+
this.deps.kill(row.pid, 'SIGKILL');
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
// already dead
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
this.dbDelete(targetId);
|
|
246
|
+
log.info(`stop("${targetId}") — no in-memory deployment found, cleaned DB`);
|
|
125
247
|
return;
|
|
126
248
|
}
|
|
127
249
|
log.info(`stop("${targetId}") — sending SIGTERM to process tree (pid=${entry.pid})`);
|
|
@@ -133,13 +255,13 @@ export class DeploymentService {
|
|
|
133
255
|
catch {
|
|
134
256
|
log.info(`stop("${targetId}") — process already dead on SIGTERM`);
|
|
135
257
|
this.deployments.delete(targetId);
|
|
258
|
+
this.dbDelete(targetId);
|
|
136
259
|
return;
|
|
137
260
|
}
|
|
138
261
|
// Wait for the process to exit
|
|
139
262
|
const died = await this.pollUntilDead(entry.pid, MAX_WAIT_MS, POLL_INTERVAL_MS);
|
|
140
263
|
if (!died) {
|
|
141
264
|
log.warn(`stop("${targetId}") — process did not exit after ${MAX_WAIT_MS}ms, escalating to SIGKILL`);
|
|
142
|
-
// Escalate to SIGKILL
|
|
143
265
|
try {
|
|
144
266
|
this.deps.kill(entry.pid, 'SIGKILL');
|
|
145
267
|
}
|
|
@@ -150,8 +272,13 @@ export class DeploymentService {
|
|
|
150
272
|
else {
|
|
151
273
|
log.info(`stop("${targetId}") — process exited gracefully`);
|
|
152
274
|
}
|
|
153
|
-
// Wait for the exit event to clean up the map
|
|
154
|
-
|
|
275
|
+
// Wait for the exit event to clean up the map (only if we have a ChildProcess handle)
|
|
276
|
+
if (entry.child) {
|
|
277
|
+
await this.waitForExit(entry.child);
|
|
278
|
+
}
|
|
279
|
+
// Ensure cleanup
|
|
280
|
+
this.deployments.delete(targetId);
|
|
281
|
+
this.dbDelete(targetId);
|
|
155
282
|
}
|
|
156
283
|
/**
|
|
157
284
|
* Force-stop all tracked deployments immediately (for daemon shutdown).
|
|
@@ -161,6 +288,15 @@ export class DeploymentService {
|
|
|
161
288
|
entry.logs.clear();
|
|
162
289
|
this.killProcess(entry);
|
|
163
290
|
}
|
|
291
|
+
// Also clean DB
|
|
292
|
+
if (this.db) {
|
|
293
|
+
try {
|
|
294
|
+
this.db.prepare('DELETE FROM dev_servers').run();
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// table might not exist yet
|
|
298
|
+
}
|
|
299
|
+
}
|
|
164
300
|
}
|
|
165
301
|
/**
|
|
166
302
|
* Get the accumulated log buffer for a deployment.
|
|
@@ -183,9 +319,54 @@ export class DeploymentService {
|
|
|
183
319
|
off(event, handler) {
|
|
184
320
|
this.emitter.off(event, handler);
|
|
185
321
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
322
|
+
// ─── Database helpers ───────────────────────────────────────────────
|
|
323
|
+
dbUpsert(entry) {
|
|
324
|
+
if (!this.db)
|
|
325
|
+
return;
|
|
326
|
+
try {
|
|
327
|
+
this.db
|
|
328
|
+
.prepare(`INSERT OR REPLACE INTO dev_servers
|
|
329
|
+
(target_id, target_type, pid, state, url, target_path, started_at)
|
|
330
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`)
|
|
331
|
+
.run(entry.targetId, entry.targetType, entry.pid, entry.state, entry.url, entry.targetPath, Date.now());
|
|
332
|
+
}
|
|
333
|
+
catch (err) {
|
|
334
|
+
log.warn(`dbUpsert failed for "${entry.targetId}": ${err}`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
dbUpdateState(targetId, state, url) {
|
|
338
|
+
if (!this.db)
|
|
339
|
+
return;
|
|
340
|
+
try {
|
|
341
|
+
this.db
|
|
342
|
+
.prepare('UPDATE dev_servers SET state = ?, url = ? WHERE target_id = ?')
|
|
343
|
+
.run(state, url, targetId);
|
|
344
|
+
}
|
|
345
|
+
catch (err) {
|
|
346
|
+
log.warn(`dbUpdateState failed for "${targetId}": ${err}`);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
dbDelete(targetId) {
|
|
350
|
+
if (!this.db)
|
|
351
|
+
return;
|
|
352
|
+
try {
|
|
353
|
+
this.db.prepare('DELETE FROM dev_servers WHERE target_id = ?').run(targetId);
|
|
354
|
+
}
|
|
355
|
+
catch (err) {
|
|
356
|
+
log.warn(`dbDelete failed for "${targetId}": ${err}`);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
dbFind(targetId) {
|
|
360
|
+
if (!this.db)
|
|
361
|
+
return null;
|
|
362
|
+
try {
|
|
363
|
+
return (this.db.prepare('SELECT * FROM dev_servers WHERE target_id = ?').get(targetId) ?? null);
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
// ─── Process helpers ────────────────────────────────────────────────
|
|
189
370
|
killProcess(entry) {
|
|
190
371
|
try {
|
|
191
372
|
this.deps.kill(entry.pid, 'SIGKILL');
|
|
@@ -200,24 +381,20 @@ export class DeploymentService {
|
|
|
200
381
|
*/
|
|
201
382
|
attachOutputListener(entry, stream) {
|
|
202
383
|
const bufferKey = stream === 'stdout' ? 'stdoutBuffer' : 'stderrBuffer';
|
|
203
|
-
const childStream = entry.child[stream];
|
|
384
|
+
const childStream = entry.child?.[stream];
|
|
204
385
|
if (!childStream) {
|
|
205
386
|
log.warn(`[${entry.targetId}] No ${stream} stream available — cannot attach listener`);
|
|
206
387
|
return;
|
|
207
388
|
}
|
|
208
389
|
childStream.on('data', (chunk) => {
|
|
209
390
|
const text = chunk.toString();
|
|
210
|
-
// Append chunk to buffer
|
|
211
391
|
entry[bufferKey] += text;
|
|
212
|
-
// Process complete lines
|
|
213
392
|
const lines = entry[bufferKey].split('\n');
|
|
214
|
-
// Keep the last element (incomplete line) in the buffer
|
|
215
393
|
entry[bufferKey] = lines.pop() ?? '';
|
|
216
394
|
for (const line of lines) {
|
|
217
395
|
if (!line.trim())
|
|
218
396
|
continue;
|
|
219
397
|
log.debug(`[${entry.targetId}] ${stream}: ${line}`);
|
|
220
|
-
// Accumulate in log buffer and emit event
|
|
221
398
|
const logEntry = {
|
|
222
399
|
targetId: entry.targetId,
|
|
223
400
|
stream,
|
|
@@ -233,12 +410,12 @@ export class DeploymentService {
|
|
|
233
410
|
log.info(`[${entry.targetId}] Port detected — url="${url}" (from ${stream})`);
|
|
234
411
|
entry.state = DeploymentState.Ready;
|
|
235
412
|
entry.url = url;
|
|
413
|
+
this.dbUpdateState(entry.targetId, entry.state, entry.url);
|
|
236
414
|
}
|
|
237
415
|
}
|
|
238
416
|
}
|
|
239
417
|
});
|
|
240
418
|
childStream.on('end', () => {
|
|
241
|
-
// Flush remaining buffer content
|
|
242
419
|
const remaining = entry[bufferKey].trim();
|
|
243
420
|
if (remaining) {
|
|
244
421
|
log.debug(`[${entry.targetId}] ${stream} (flush): ${remaining}`);
|
|
@@ -248,6 +425,7 @@ export class DeploymentService {
|
|
|
248
425
|
log.info(`[${entry.targetId}] Port detected in flushed buffer — url="${url}"`);
|
|
249
426
|
entry.state = DeploymentState.Ready;
|
|
250
427
|
entry.url = url;
|
|
428
|
+
this.dbUpdateState(entry.targetId, entry.state, entry.url);
|
|
251
429
|
}
|
|
252
430
|
}
|
|
253
431
|
entry[bufferKey] = '';
|
|
@@ -255,9 +433,6 @@ export class DeploymentService {
|
|
|
255
433
|
log.debug(`[${entry.targetId}] ${stream} stream ended`);
|
|
256
434
|
});
|
|
257
435
|
}
|
|
258
|
-
/**
|
|
259
|
-
* Poll until a process is dead or timeout expires.
|
|
260
|
-
*/
|
|
261
436
|
async pollUntilDead(pid, maxMs, intervalMs) {
|
|
262
437
|
const deadline = Date.now() + maxMs;
|
|
263
438
|
while (Date.now() < deadline) {
|
|
@@ -268,9 +443,6 @@ export class DeploymentService {
|
|
|
268
443
|
}
|
|
269
444
|
return false;
|
|
270
445
|
}
|
|
271
|
-
/**
|
|
272
|
-
* Wait for a child process to emit 'exit', with a short timeout.
|
|
273
|
-
*/
|
|
274
446
|
waitForExit(child) {
|
|
275
447
|
return new Promise((resolve) => {
|
|
276
448
|
const timeout = setTimeout(() => resolve(), 1000);
|
|
@@ -5,11 +5,5 @@
|
|
|
5
5
|
* dev server stdout/stderr output. Handles common patterns from Next.js,
|
|
6
6
|
* Vite, Express, and generic servers.
|
|
7
7
|
*/
|
|
8
|
-
/**
|
|
9
|
-
* Parse a line of stdout/stderr output for a localhost URL or port.
|
|
10
|
-
*
|
|
11
|
-
* @param line - A single line of process output
|
|
12
|
-
* @returns The detected URL string, or null if no URL/port was found
|
|
13
|
-
*/
|
|
14
8
|
export declare function parsePort(line: string): string | null;
|
|
15
9
|
//# sourceMappingURL=parse-port.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse-port.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/deployment/parse-port.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"parse-port.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/deployment/parse-port.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA4CH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBrD"}
|
|
@@ -38,12 +38,17 @@ const PORT_PATTERNS = [
|
|
|
38
38
|
* @param line - A single line of process output
|
|
39
39
|
* @returns The detected URL string, or null if no URL/port was found
|
|
40
40
|
*/
|
|
41
|
+
// Strip ANSI escape codes (colors, cursor movement, etc.)
|
|
42
|
+
// eslint-disable-next-line no-control-regex
|
|
43
|
+
const ANSI_REGEX = /\x1b\[[0-9;]*[a-zA-Z]/g;
|
|
41
44
|
export function parsePort(line) {
|
|
42
45
|
if (!line?.trim()) {
|
|
43
46
|
return null;
|
|
44
47
|
}
|
|
48
|
+
// Strip ANSI escape codes before matching — dev servers often emit colored output
|
|
49
|
+
const clean = line.replace(ANSI_REGEX, '');
|
|
45
50
|
for (const { regex, extract } of PORT_PATTERNS) {
|
|
46
|
-
const match =
|
|
51
|
+
const match = clean.match(regex);
|
|
47
52
|
if (match) {
|
|
48
53
|
return extract(match);
|
|
49
54
|
}
|
|
@@ -45,11 +45,5 @@ export declare class GitPrService implements IGitPrService {
|
|
|
45
45
|
private parseGhError;
|
|
46
46
|
private parsePrNumberFromUrl;
|
|
47
47
|
private parseDiffStat;
|
|
48
|
-
syncMain(cwd: string, baseBranch: string): Promise<void>;
|
|
49
|
-
rebaseOnMain(cwd: string, featureBranch: string, baseBranch: string): Promise<void>;
|
|
50
|
-
getConflictedFiles(cwd: string): Promise<string[]>;
|
|
51
|
-
stageFiles(cwd: string, files: string[]): Promise<void>;
|
|
52
|
-
rebaseContinue(cwd: string): Promise<void>;
|
|
53
|
-
rebaseAbort(cwd: string): Promise<void>;
|
|
54
48
|
}
|
|
55
49
|
//# sourceMappingURL=git-pr.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EAGd,WAAW,EACX,QAAQ,EACR,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,wEAAwE,CAAC;AAUhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,YAAa,YAAW,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBjD,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgF9C,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKnD,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuClE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;YA6BjF,eAAe;IASvB,gBAAgB,CACpB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,SAAS,UAAQ,GAChB,OAAO,CAAC,IAAI,CAAC;IA4EV,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAsBjE,OAAO,CACX,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAC5G,OAAO,KAAK,EACV,cAAc,EAGd,WAAW,EACX,QAAQ,EACR,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,wEAAwE,CAAC;AAUhF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,qBACa,YAAa,YAAW,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBjD,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAgF9C,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKnD,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWxD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAYvE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAuClE,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAE,aAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;YA6BjF,eAAe;IASvB,gBAAgB,CACpB,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,SAAS,UAAQ,GAChB,OAAO,CAAC,IAAI,CAAC;IA4EV,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUnF,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAsBjE,OAAO,CACX,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,cAAc,CAAC;IAiEpB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWhF,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAevE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAaxE,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,aAAa;IAmFf,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoCpD,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAc/E,WAAW,CACf,GAAG,EAAE,MAAM,EACX,aAAa,EAAE,MAAM,EACrB,UAAU,EAAE,MAAM,EAClB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,OAAO,CAAC;IA6CnB;;;OAGG;YACW,UAAU;IAmBlB,cAAc,CAClB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,WAAW,SAAS,GACnB,OAAO,CAAC,MAAM,CAAC;IAWlB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,YAAY;IAepB,OAAO,CAAC,oBAAoB;IAK5B,OAAO,CAAC,aAAa;CAiBtB"}
|
|
@@ -308,15 +308,19 @@ let GitPrService = class GitPrService {
|
|
|
308
308
|
}
|
|
309
309
|
}
|
|
310
310
|
async watchCi(cwd, branch, timeoutMs, intervalSeconds) {
|
|
311
|
+
// Resolve the latest run for the branch BEFORE the try/catch so the
|
|
312
|
+
// runUrl is available in both success and failure return paths.
|
|
313
|
+
let runUrl;
|
|
311
314
|
try {
|
|
312
315
|
// gh run watch requires a run ID — it does not support --branch.
|
|
313
316
|
// First, resolve the latest run ID for the branch via gh run list.
|
|
314
|
-
const { stdout: listOut } = await this.execFile('gh', ['run', 'list', '--branch', branch, '--json', 'databaseId', '--limit', '1'], { cwd });
|
|
317
|
+
const { stdout: listOut } = await this.execFile('gh', ['run', 'list', '--branch', branch, '--json', 'databaseId,url', '--limit', '1'], { cwd });
|
|
315
318
|
const runs = JSON.parse(listOut);
|
|
316
319
|
if (runs.length === 0 || !runs[0].databaseId) {
|
|
317
320
|
return { status: 'pending' };
|
|
318
321
|
}
|
|
319
322
|
const runId = String(runs[0].databaseId);
|
|
323
|
+
runUrl = runs[0].url;
|
|
320
324
|
const interval = intervalSeconds ?? 30;
|
|
321
325
|
const args = [
|
|
322
326
|
'run',
|
|
@@ -335,6 +339,7 @@ let GitPrService = class GitPrService {
|
|
|
335
339
|
// If we reach here (no exception), CI passed — no need for fragile stdout parsing.
|
|
336
340
|
return {
|
|
337
341
|
status: 'success',
|
|
342
|
+
runUrl,
|
|
338
343
|
logExcerpt: stdout.trim(),
|
|
339
344
|
};
|
|
340
345
|
}
|
|
@@ -356,7 +361,7 @@ let GitPrService = class GitPrService {
|
|
|
356
361
|
// Build a useful log excerpt from stdout/stderr if available
|
|
357
362
|
const errObj = error;
|
|
358
363
|
const parts = [errObj.stdout, errObj.stderr, message].filter(Boolean);
|
|
359
|
-
return { status: 'failure', logExcerpt: parts.join('\n').trim() };
|
|
364
|
+
return { status: 'failure', runUrl, logExcerpt: parts.join('\n').trim() };
|
|
360
365
|
}
|
|
361
366
|
throw new GitPrError(message, GitPrErrorCode.GIT_ERROR, cause);
|
|
362
367
|
}
|
|
@@ -612,14 +617,6 @@ let GitPrService = class GitPrService {
|
|
|
612
617
|
parseGitError(error) {
|
|
613
618
|
const message = error instanceof Error ? error.message : String(error);
|
|
614
619
|
const cause = error instanceof Error ? error : undefined;
|
|
615
|
-
// Rebase-specific: detect "CONFLICT" during rebase operations
|
|
616
|
-
if (message.includes('CONFLICT') && message.includes('rebase')) {
|
|
617
|
-
return new GitPrError(message, GitPrErrorCode.REBASE_CONFLICT, cause);
|
|
618
|
-
}
|
|
619
|
-
// Sync-specific: non-fast-forward or diverged branch
|
|
620
|
-
if (message.includes('non-fast-forward') || message.includes('diverged')) {
|
|
621
|
-
return new GitPrError(message, GitPrErrorCode.SYNC_FAILED, cause);
|
|
622
|
-
}
|
|
623
620
|
if (message.includes('rejected') || message.includes('conflict')) {
|
|
624
621
|
return new GitPrError(message, GitPrErrorCode.MERGE_CONFLICT, cause);
|
|
625
622
|
}
|
|
@@ -660,123 +657,6 @@ let GitPrService = class GitPrService {
|
|
|
660
657
|
commitCount,
|
|
661
658
|
};
|
|
662
659
|
}
|
|
663
|
-
// --- Rebase & Sync operations ---
|
|
664
|
-
async syncMain(cwd, baseBranch) {
|
|
665
|
-
try {
|
|
666
|
-
// Detect current branch
|
|
667
|
-
const { stdout } = await this.execFile('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd });
|
|
668
|
-
const currentBranch = stdout.trim();
|
|
669
|
-
if (currentBranch === baseBranch) {
|
|
670
|
-
// On the base branch — use git pull --ff-only
|
|
671
|
-
await this.execFile('git', ['pull', '--ff-only', 'origin', baseBranch], { cwd });
|
|
672
|
-
}
|
|
673
|
-
else {
|
|
674
|
-
// On a different branch — use git fetch to update the base branch ref without switching
|
|
675
|
-
await this.execFile('git', ['fetch', 'origin', `${baseBranch}:${baseBranch}`], { cwd });
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
catch (error) {
|
|
679
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
680
|
-
const cause = error instanceof Error ? error : undefined;
|
|
681
|
-
if (message.includes('non-fast-forward') || message.includes('diverged')) {
|
|
682
|
-
throw new GitPrError(`Cannot fast-forward '${baseBranch}': local branch has diverged from remote. ` +
|
|
683
|
-
`Resolve the divergence manually with 'git checkout ${baseBranch} && git reset --hard origin/${baseBranch}' ` +
|
|
684
|
-
`if you want to discard local changes on ${baseBranch}.`, GitPrErrorCode.SYNC_FAILED, cause);
|
|
685
|
-
}
|
|
686
|
-
throw new GitPrError(`Failed to sync '${baseBranch}' with remote: ${message}`, GitPrErrorCode.GIT_ERROR, cause);
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
async rebaseOnMain(cwd, featureBranch, baseBranch) {
|
|
690
|
-
// Check for dirty worktree before starting
|
|
691
|
-
const dirty = await this.hasUncommittedChanges(cwd);
|
|
692
|
-
if (dirty) {
|
|
693
|
-
throw new GitPrError(`Cannot rebase: working directory has uncommitted changes. ` +
|
|
694
|
-
`Please commit or stash your changes before rebasing.`, GitPrErrorCode.GIT_ERROR);
|
|
695
|
-
}
|
|
696
|
-
// Checkout the feature branch
|
|
697
|
-
try {
|
|
698
|
-
await this.execFile('git', ['checkout', featureBranch], { cwd });
|
|
699
|
-
}
|
|
700
|
-
catch (error) {
|
|
701
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
702
|
-
const cause = error instanceof Error ? error : undefined;
|
|
703
|
-
if (message.includes('did not match') ||
|
|
704
|
-
message.includes('not a commit') ||
|
|
705
|
-
message.includes('pathspec')) {
|
|
706
|
-
throw new GitPrError(`Branch '${featureBranch}' not found.`, GitPrErrorCode.BRANCH_NOT_FOUND, cause);
|
|
707
|
-
}
|
|
708
|
-
throw new GitPrError(`Failed to checkout '${featureBranch}': ${message}`, GitPrErrorCode.GIT_ERROR, cause);
|
|
709
|
-
}
|
|
710
|
-
// Rebase onto the base branch
|
|
711
|
-
try {
|
|
712
|
-
await this.execFile('git', ['rebase', baseBranch], { cwd });
|
|
713
|
-
}
|
|
714
|
-
catch (error) {
|
|
715
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
716
|
-
const cause = error instanceof Error ? error : undefined;
|
|
717
|
-
// Detect rebase conflict from git stderr/exit code
|
|
718
|
-
if (message.includes('CONFLICT') || message.includes('could not apply')) {
|
|
719
|
-
// Get the list of conflicted files to include in the error message
|
|
720
|
-
let conflictedFiles = [];
|
|
721
|
-
try {
|
|
722
|
-
conflictedFiles = await this.getConflictedFiles(cwd);
|
|
723
|
-
}
|
|
724
|
-
catch {
|
|
725
|
-
// Failed to get conflicted files — still report the conflict
|
|
726
|
-
}
|
|
727
|
-
const fileList = conflictedFiles.length > 0 ? ` Conflicted files: ${conflictedFiles.join(', ')}` : '';
|
|
728
|
-
throw new GitPrError(`Rebase of '${featureBranch}' onto '${baseBranch}' encountered conflicts.${fileList}`, GitPrErrorCode.REBASE_CONFLICT, cause);
|
|
729
|
-
}
|
|
730
|
-
throw new GitPrError(`Rebase of '${featureBranch}' onto '${baseBranch}' failed: ${message}`, GitPrErrorCode.GIT_ERROR, cause);
|
|
731
|
-
}
|
|
732
|
-
}
|
|
733
|
-
async getConflictedFiles(cwd) {
|
|
734
|
-
try {
|
|
735
|
-
const { stdout } = await this.execFile('git', ['diff', '--name-only', '--diff-filter=U'], {
|
|
736
|
-
cwd,
|
|
737
|
-
});
|
|
738
|
-
return stdout
|
|
739
|
-
.trim()
|
|
740
|
-
.split('\n')
|
|
741
|
-
.filter((f) => f.length > 0)
|
|
742
|
-
.map((f) => f.replace(/\\/g, '/'));
|
|
743
|
-
}
|
|
744
|
-
catch (error) {
|
|
745
|
-
throw this.parseGitError(error);
|
|
746
|
-
}
|
|
747
|
-
}
|
|
748
|
-
async stageFiles(cwd, files) {
|
|
749
|
-
try {
|
|
750
|
-
await this.execFile('git', ['add', ...files], { cwd });
|
|
751
|
-
}
|
|
752
|
-
catch (error) {
|
|
753
|
-
throw this.parseGitError(error);
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
async rebaseContinue(cwd) {
|
|
757
|
-
try {
|
|
758
|
-
await this.execFile('git', ['rebase', '--continue'], {
|
|
759
|
-
cwd,
|
|
760
|
-
env: { ...process.env, GIT_EDITOR: 'true' },
|
|
761
|
-
});
|
|
762
|
-
}
|
|
763
|
-
catch (error) {
|
|
764
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
765
|
-
const cause = error instanceof Error ? error : undefined;
|
|
766
|
-
if (message.includes('CONFLICT') || message.includes('could not apply')) {
|
|
767
|
-
throw new GitPrError(`Rebase continue encountered new conflicts: ${message}`, GitPrErrorCode.REBASE_CONFLICT, cause);
|
|
768
|
-
}
|
|
769
|
-
throw this.parseGitError(error);
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
async rebaseAbort(cwd) {
|
|
773
|
-
try {
|
|
774
|
-
await this.execFile('git', ['rebase', '--abort'], { cwd });
|
|
775
|
-
}
|
|
776
|
-
catch (error) {
|
|
777
|
-
throw this.parseGitError(error);
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
660
|
};
|
|
781
661
|
GitPrService = __decorate([
|
|
782
662
|
injectable(),
|
|
@@ -27,7 +27,7 @@ export async function deployFeature(featureId) {
|
|
|
27
27
|
}
|
|
28
28
|
log.info('worktree path exists, calling deploymentService.start()');
|
|
29
29
|
const deploymentService = resolve('IDeploymentService');
|
|
30
|
-
deploymentService.start(featureId, worktreePath);
|
|
30
|
+
deploymentService.start(featureId, worktreePath, 'feature');
|
|
31
31
|
log.info('start() returned successfully — state=Booting');
|
|
32
32
|
return { success: true, state: DeploymentState.Booting };
|
|
33
33
|
}
|
|
@@ -18,7 +18,7 @@ export async function deployRepository(repositoryPath) {
|
|
|
18
18
|
}
|
|
19
19
|
log.info('directory exists, calling deploymentService.start()');
|
|
20
20
|
const deploymentService = resolve('IDeploymentService');
|
|
21
|
-
deploymentService.start(repositoryPath, repositoryPath);
|
|
21
|
+
deploymentService.start(repositoryPath, repositoryPath, 'repository');
|
|
22
22
|
log.info('start() returned successfully — state=Booting');
|
|
23
23
|
return { success: true, state: DeploymentState.Booting };
|
|
24
24
|
}
|
|
@@ -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":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,
|
|
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":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAqkB1F"}
|