@shepai/cli 1.129.1 → 1.129.2-pr396.29a046b
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/apis/json-schema/RelatedLink.yaml +14 -0
- package/apis/json-schema/SpecArtifactBase.yaml +1 -1
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +73 -5
- 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 +6 -4
- package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts +28 -0
- package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.js +81 -0
- package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts +16 -0
- package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.js +43 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +14 -1
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +15 -0
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts +35 -0
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.js +66 -0
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts +42 -0
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.js +169 -0
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.js +2 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +6 -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 +134 -0
- package/dist/src/presentation/web/app/actions/rebase-feature.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/rebase-feature.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/rebase-feature.js +16 -0
- package/dist/src/presentation/web/app/actions/sync-repository.d.ts +5 -0
- package/dist/src/presentation/web/app/actions/sync-repository.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/sync-repository.js +16 -0
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +2 -1
- 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 +4 -0
- 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 +32 -1
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +4 -1
- 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 +4 -1
- 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 +8 -3
- package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +6 -0
- 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 +30 -0
- 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 +3 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.js +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +6 -0
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +96 -1
- package/dist/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/product-decisions-summary/product-decisions-summary.js +1 -1
- 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.js +1 -1
- package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts +4 -0
- 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 +11 -0
- 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 +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +63 -48
- 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/create/page/server-reference-manifest.json +63 -48
- 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 +90 -60
- 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 +90 -60
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +59 -44
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +63 -48
- 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 +90 -60
- 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 +90 -60
- 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 +59 -44
- package/web/.next/server/app/(dashboard)/page.js +1 -1
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +59 -44
- 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 +3 -3
- 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 +8 -8
- 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 +8 -8
- 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 +8 -8
- 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 +3 -3
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__dcd4f847._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_99e84975.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_99e84975.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/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_accb29f0.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_accb29f0.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6a57c3a1.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_6a57c3a1.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0005fa7f._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__c3ab8422._.js.map → [root-of-the-server]__0005fa7f._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2e4a6b80._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2e4a6b80._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2f886f77._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__30f59daf._.js +3 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__755cfe02._.js.map → [root-of-the-server]__30f59daf._.js.map} +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]__43f51aa6._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.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]__815546bd._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a21eef5a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c001183f._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c001183f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
- package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_4d0f7251._.js +3 -0
- package/web/.next/server/chunks/ssr/_4d0f7251._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_92acff95._.js → _54973759._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_92acff95._.js.map → _54973759._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
- package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
- package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
- package/web/.next/server/chunks/ssr/_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_16204651._.js +5 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_8e7fe0d1._.js.map → src_presentation_web_16204651._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_02d24048.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_02d24048.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_a1e81e83._.js +5 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_b9023017._.js.map → src_presentation_web_a1e81e83._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.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_efa91543._.js → src_presentation_web_ff4f5c85._.js} +2 -2
- package/web/.next/server/chunks/ssr/{src_presentation_web_efa91543._.js.map → src_presentation_web_ff4f5c85._.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 +410 -296
- package/web/.next/static/chunks/{4ee40070e69205bc.js → 175ca7ea02d97f30.js} +1 -1
- package/web/.next/static/chunks/{792cdceb624c561d.js → 419c19462c0cf858.js} +1 -1
- package/web/.next/static/chunks/{475b22f4bf14af2d.js → 41da6886a7e12ed0.js} +1 -1
- package/web/.next/static/chunks/{0a83031808867bca.js → 45aed33c09f2fa49.js} +1 -1
- package/web/.next/static/chunks/4b51f8f4e49665b8.js +1 -0
- package/web/.next/static/chunks/{e4ff24651224d4d2.js → 570ce910d5621970.js} +1 -1
- package/web/.next/static/chunks/6824f70fd5a25f49.js +2 -0
- package/web/.next/static/chunks/{cc974a8f14de58d0.js → 6865e7df610c998d.js} +1 -1
- package/web/.next/static/chunks/{5da0c2f16502fddd.js → 69a7f3e262affa5b.js} +1 -1
- package/web/.next/static/chunks/{2672ec79b6eb1b94.js → 727c77542ce6b900.js} +1 -1
- package/web/.next/static/chunks/{fd2ccf8f2022f2fb.js → 9b8cfca143672135.js} +1 -1
- package/web/.next/static/chunks/da484d44874006a2.css +1 -0
- package/web/.next/static/chunks/{5e11fe79741cd049.js → ebc8e49ca8e30930.js} +1 -1
- package/web/.next/static/chunks/{f84bbfe2662f35ed.js → f0cc9c9ee8a03ec6.js} +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +0 -3
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__755cfe02._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c3ab8422._.js +0 -3
- package/web/.next/server/chunks/ssr/_a11d42e8._.js +0 -3
- package/web/.next/server/chunks/ssr/_a11d42e8._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +0 -5
- package/web/.next/static/chunks/eb9841ec4d80af01.js +0 -1
- package/web/.next/static/chunks/f569a6dc0496430f.css +0 -1
- package/web/.next/static/chunks/fdff2d35956e7448.js +0 -2
- /package/web/.next/static/{yH8b83VvOS2P5F2XwxoFX → bAZScD4F_X6c2j5gmVUlR}/_buildManifest.js +0 -0
- /package/web/.next/static/{yH8b83VvOS2P5F2XwxoFX → bAZScD4F_X6c2j5gmVUlR}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{yH8b83VvOS2P5F2XwxoFX → bAZScD4F_X6c2j5gmVUlR}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conflict Resolution Service
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates agent-powered conflict resolution during git rebase.
|
|
5
|
+
* Follows the CI watch/fix loop pattern: detect conflict → invoke agent →
|
|
6
|
+
* validate resolution → stage files → continue rebase, with retry logic.
|
|
7
|
+
*/
|
|
8
|
+
import type { IAgentExecutorProvider } from '../../../../application/ports/output/agents/agent-executor-provider.interface.js';
|
|
9
|
+
import type { IGitPrService } from '../../../../application/ports/output/services/git-pr-service.interface.js';
|
|
10
|
+
export declare class ConflictResolutionService {
|
|
11
|
+
private readonly agentProvider;
|
|
12
|
+
private readonly gitPrService;
|
|
13
|
+
constructor(agentProvider: IAgentExecutorProvider, gitPrService: IGitPrService);
|
|
14
|
+
/**
|
|
15
|
+
* Resolve all conflicts during a rebase operation.
|
|
16
|
+
*
|
|
17
|
+
* Handles multi-commit rebases where each commit may introduce conflicts.
|
|
18
|
+
* For each conflicted commit: reads conflicted files, invokes agent to
|
|
19
|
+
* resolve, validates no remaining markers, stages resolved files, and
|
|
20
|
+
* continues the rebase. Retries up to MAX_RETRIES_PER_COMMIT times.
|
|
21
|
+
*
|
|
22
|
+
* If retries are exhausted, aborts the rebase and throws REBASE_CONFLICT.
|
|
23
|
+
*
|
|
24
|
+
* @param cwd - Working directory (repo root or worktree path)
|
|
25
|
+
* @param featureBranch - Feature branch being rebased
|
|
26
|
+
* @param baseBranch - Base branch being rebased onto
|
|
27
|
+
*/
|
|
28
|
+
resolve(cwd: string, featureBranch: string, baseBranch: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Read the contents of conflicted files from the working directory.
|
|
31
|
+
*/
|
|
32
|
+
private readConflictedFileContents;
|
|
33
|
+
/**
|
|
34
|
+
* Validate that no conflict markers remain in the previously-conflicted files.
|
|
35
|
+
*/
|
|
36
|
+
private validateResolution;
|
|
37
|
+
/**
|
|
38
|
+
* Build feedback about remaining conflict markers for retry attempts.
|
|
39
|
+
*/
|
|
40
|
+
private buildFeedbackFromRemainingMarkers;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=conflict-resolution.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-resolution.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wEAAwE,CAAC;AACrH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iEAAiE,CAAC;AAerG,qBACa,yBAAyB;IAGlC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFZ,aAAa,EAAE,sBAAsB,EAErC,YAAY,EAAE,aAAa;IAG9C;;;;;;;;;;;;;OAaG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkEpF;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAWlC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,OAAO,CAAC,iCAAiC;CAyB1C"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Conflict Resolution Service
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates agent-powered conflict resolution during git rebase.
|
|
5
|
+
* Follows the CI watch/fix loop pattern: detect conflict → invoke agent →
|
|
6
|
+
* validate resolution → stage files → continue rebase, with retry logic.
|
|
7
|
+
*/
|
|
8
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
9
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
10
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
11
|
+
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;
|
|
12
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
13
|
+
};
|
|
14
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
15
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
16
|
+
};
|
|
17
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
18
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
19
|
+
};
|
|
20
|
+
import { injectable, inject } from 'tsyringe';
|
|
21
|
+
import { readFileSync } from 'node:fs';
|
|
22
|
+
import { join } from 'node:path';
|
|
23
|
+
import { GitPrError, GitPrErrorCode, } from '../../../../application/ports/output/services/git-pr-service.interface.js';
|
|
24
|
+
import { buildConflictResolutionPrompt, } from './conflict-resolution.prompt.js';
|
|
25
|
+
const MAX_RETRIES_PER_COMMIT = 3;
|
|
26
|
+
/** Conflict markers that indicate unresolved conflicts */
|
|
27
|
+
const CONFLICT_MARKERS = ['<<<<<<<', '=======', '>>>>>>>'];
|
|
28
|
+
let ConflictResolutionService = class ConflictResolutionService {
|
|
29
|
+
agentProvider;
|
|
30
|
+
gitPrService;
|
|
31
|
+
constructor(agentProvider, gitPrService) {
|
|
32
|
+
this.agentProvider = agentProvider;
|
|
33
|
+
this.gitPrService = gitPrService;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Resolve all conflicts during a rebase operation.
|
|
37
|
+
*
|
|
38
|
+
* Handles multi-commit rebases where each commit may introduce conflicts.
|
|
39
|
+
* For each conflicted commit: reads conflicted files, invokes agent to
|
|
40
|
+
* resolve, validates no remaining markers, stages resolved files, and
|
|
41
|
+
* continues the rebase. Retries up to MAX_RETRIES_PER_COMMIT times.
|
|
42
|
+
*
|
|
43
|
+
* If retries are exhausted, aborts the rebase and throws REBASE_CONFLICT.
|
|
44
|
+
*
|
|
45
|
+
* @param cwd - Working directory (repo root or worktree path)
|
|
46
|
+
* @param featureBranch - Feature branch being rebased
|
|
47
|
+
* @param baseBranch - Base branch being rebased onto
|
|
48
|
+
*/
|
|
49
|
+
async resolve(cwd, featureBranch, baseBranch) {
|
|
50
|
+
const executor = await this.agentProvider.getExecutor();
|
|
51
|
+
// Outer loop: handle multi-commit rebases where rebaseContinue
|
|
52
|
+
// may reveal conflicts on the next commit
|
|
53
|
+
while (true) {
|
|
54
|
+
const conflictedFiles = await this.gitPrService.getConflictedFiles(cwd);
|
|
55
|
+
if (conflictedFiles.length === 0) {
|
|
56
|
+
return; // No conflicts — rebase is complete
|
|
57
|
+
}
|
|
58
|
+
// Inner loop: retry agent resolution for the current commit's conflicts
|
|
59
|
+
let resolved = false;
|
|
60
|
+
for (let attempt = 1; attempt <= MAX_RETRIES_PER_COMMIT; attempt++) {
|
|
61
|
+
const fileContents = this.readConflictedFileContents(cwd, conflictedFiles);
|
|
62
|
+
const previousFeedback = attempt > 1 ? this.buildFeedbackFromRemainingMarkers(cwd, conflictedFiles) : undefined;
|
|
63
|
+
const prompt = buildConflictResolutionPrompt({
|
|
64
|
+
conflictedFiles: fileContents,
|
|
65
|
+
featureBranch,
|
|
66
|
+
baseBranch,
|
|
67
|
+
attemptNumber: attempt,
|
|
68
|
+
maxAttempts: MAX_RETRIES_PER_COMMIT,
|
|
69
|
+
previousFeedback,
|
|
70
|
+
});
|
|
71
|
+
await executor.execute(prompt, { cwd });
|
|
72
|
+
// Validate: check no conflict markers remain
|
|
73
|
+
if (this.validateResolution(cwd, conflictedFiles)) {
|
|
74
|
+
resolved = true;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (!resolved) {
|
|
79
|
+
// Exhausted retries — abort and report
|
|
80
|
+
await this.gitPrService.rebaseAbort(cwd);
|
|
81
|
+
const remaining = conflictedFiles.join(', ');
|
|
82
|
+
throw new GitPrError(`Failed to resolve conflicts after ${MAX_RETRIES_PER_COMMIT} attempts. ` +
|
|
83
|
+
`Unresolved files: ${remaining}. The rebase has been aborted.`, GitPrErrorCode.REBASE_CONFLICT);
|
|
84
|
+
}
|
|
85
|
+
// Resolution succeeded — stage files and continue rebase
|
|
86
|
+
await this.gitPrService.stageFiles(cwd, conflictedFiles);
|
|
87
|
+
try {
|
|
88
|
+
await this.gitPrService.rebaseContinue(cwd);
|
|
89
|
+
// rebaseContinue succeeded — check if there are more conflicts
|
|
90
|
+
// from subsequent commits (loop continues)
|
|
91
|
+
return; // No more conflicts
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
if (error instanceof GitPrError && error.code === GitPrErrorCode.REBASE_CONFLICT) {
|
|
95
|
+
// Next commit has conflicts — loop back to resolve them
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
throw error; // Unexpected error
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Read the contents of conflicted files from the working directory.
|
|
104
|
+
*/
|
|
105
|
+
readConflictedFileContents(cwd, filePaths) {
|
|
106
|
+
return filePaths.map((filePath) => {
|
|
107
|
+
try {
|
|
108
|
+
const content = readFileSync(join(cwd, filePath), 'utf-8');
|
|
109
|
+
return { path: filePath, content };
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return { path: filePath, content: '(unable to read file)' };
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Validate that no conflict markers remain in the previously-conflicted files.
|
|
118
|
+
*/
|
|
119
|
+
validateResolution(cwd, filePaths) {
|
|
120
|
+
for (const filePath of filePaths) {
|
|
121
|
+
try {
|
|
122
|
+
const content = readFileSync(join(cwd, filePath), 'utf-8');
|
|
123
|
+
for (const marker of CONFLICT_MARKERS) {
|
|
124
|
+
if (content.includes(marker)) {
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Build feedback about remaining conflict markers for retry attempts.
|
|
137
|
+
*/
|
|
138
|
+
buildFeedbackFromRemainingMarkers(cwd, filePaths) {
|
|
139
|
+
const remaining = [];
|
|
140
|
+
for (const filePath of filePaths) {
|
|
141
|
+
try {
|
|
142
|
+
const content = readFileSync(join(cwd, filePath), 'utf-8');
|
|
143
|
+
const lines = content.split('\n');
|
|
144
|
+
const markerLines = [];
|
|
145
|
+
lines.forEach((line, index) => {
|
|
146
|
+
if (CONFLICT_MARKERS.some((marker) => line.includes(marker))) {
|
|
147
|
+
markerLines.push(index + 1);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
if (markerLines.length > 0) {
|
|
151
|
+
remaining.push(`- \`${filePath}\`: conflict markers remain on lines ${markerLines.join(', ')}`);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
remaining.push(`- \`${filePath}\`: unable to read file`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return remaining.length > 0
|
|
159
|
+
? remaining.join('\n')
|
|
160
|
+
: 'No specific markers found, but validation failed.';
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
ConflictResolutionService = __decorate([
|
|
164
|
+
injectable(),
|
|
165
|
+
__param(0, inject('IAgentExecutorProvider')),
|
|
166
|
+
__param(1, inject('IGitPrService')),
|
|
167
|
+
__metadata("design:paramtypes", [Object, Object])
|
|
168
|
+
], ConflictResolutionService);
|
|
169
|
+
export { ConflictResolutionService };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"research.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"research.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAsIpE"}
|
|
@@ -52,7 +52,8 @@ Use this YAML structure:
|
|
|
52
52
|
- (list all technologies evaluated or needed)
|
|
53
53
|
|
|
54
54
|
relatedLinks:
|
|
55
|
-
- (
|
|
55
|
+
- title: '(Human-readable title for the resource)'
|
|
56
|
+
url: '(URL to external documentation or reference)'
|
|
56
57
|
|
|
57
58
|
decisions:
|
|
58
59
|
- title: '(Decision Title — e.g., "Database Schema Design")'
|
|
@@ -45,5 +45,11 @@ 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>;
|
|
48
54
|
}
|
|
49
55
|
//# 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":"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
|
|
1
|
+
{"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -609,6 +609,14 @@ let GitPrService = class GitPrService {
|
|
|
609
609
|
parseGitError(error) {
|
|
610
610
|
const message = error instanceof Error ? error.message : String(error);
|
|
611
611
|
const cause = error instanceof Error ? error : undefined;
|
|
612
|
+
// Rebase-specific: detect "CONFLICT" during rebase operations
|
|
613
|
+
if (message.includes('CONFLICT') && message.includes('rebase')) {
|
|
614
|
+
return new GitPrError(message, GitPrErrorCode.REBASE_CONFLICT, cause);
|
|
615
|
+
}
|
|
616
|
+
// Sync-specific: non-fast-forward or diverged branch
|
|
617
|
+
if (message.includes('non-fast-forward') || message.includes('diverged')) {
|
|
618
|
+
return new GitPrError(message, GitPrErrorCode.SYNC_FAILED, cause);
|
|
619
|
+
}
|
|
612
620
|
if (message.includes('rejected') || message.includes('conflict')) {
|
|
613
621
|
return new GitPrError(message, GitPrErrorCode.MERGE_CONFLICT, cause);
|
|
614
622
|
}
|
|
@@ -649,6 +657,132 @@ let GitPrService = class GitPrService {
|
|
|
649
657
|
commitCount,
|
|
650
658
|
};
|
|
651
659
|
}
|
|
660
|
+
// --- Rebase & Sync operations ---
|
|
661
|
+
async syncMain(cwd, baseBranch) {
|
|
662
|
+
try {
|
|
663
|
+
// Detect current branch
|
|
664
|
+
const { stdout } = await this.execFile('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd });
|
|
665
|
+
const currentBranch = stdout.trim();
|
|
666
|
+
if (currentBranch === baseBranch) {
|
|
667
|
+
// On the base branch — use git pull --ff-only
|
|
668
|
+
await this.execFile('git', ['pull', '--ff-only', 'origin', baseBranch], { cwd });
|
|
669
|
+
}
|
|
670
|
+
else {
|
|
671
|
+
// On a different branch — fetch the remote ref only (updates origin/<baseBranch>).
|
|
672
|
+
// We intentionally do NOT update the local <baseBranch> ref because it may be
|
|
673
|
+
// checked out in another worktree, which causes git to refuse the update with:
|
|
674
|
+
// "fatal: refusing to fetch into branch 'refs/heads/main' checked out at ..."
|
|
675
|
+
await this.execFile('git', ['fetch', 'origin', 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') ||
|
|
682
|
+
message.includes('Not possible to fast-forward') ||
|
|
683
|
+
message.includes('diverged')) {
|
|
684
|
+
throw new GitPrError(`Cannot fast-forward '${baseBranch}': local branch has diverged from remote. ` +
|
|
685
|
+
`Resolve the divergence manually with 'git checkout ${baseBranch} && git reset --hard origin/${baseBranch}' ` +
|
|
686
|
+
`if you want to discard local changes on ${baseBranch}.`, GitPrErrorCode.SYNC_FAILED, cause);
|
|
687
|
+
}
|
|
688
|
+
throw new GitPrError(`Failed to sync '${baseBranch}' with remote: ${message}`, GitPrErrorCode.GIT_ERROR, cause);
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
async rebaseOnMain(cwd, featureBranch, baseBranch) {
|
|
692
|
+
// Check for dirty worktree before starting
|
|
693
|
+
const dirty = await this.hasUncommittedChanges(cwd);
|
|
694
|
+
if (dirty) {
|
|
695
|
+
throw new GitPrError(`Cannot rebase: working directory has uncommitted changes. ` +
|
|
696
|
+
`Please commit or stash your changes before rebasing.`, GitPrErrorCode.GIT_ERROR);
|
|
697
|
+
}
|
|
698
|
+
// Checkout the feature branch
|
|
699
|
+
try {
|
|
700
|
+
await this.execFile('git', ['checkout', featureBranch], { cwd });
|
|
701
|
+
}
|
|
702
|
+
catch (error) {
|
|
703
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
704
|
+
const cause = error instanceof Error ? error : undefined;
|
|
705
|
+
if (message.includes('did not match') ||
|
|
706
|
+
message.includes('not a commit') ||
|
|
707
|
+
message.includes('pathspec')) {
|
|
708
|
+
throw new GitPrError(`Branch '${featureBranch}' not found.`, GitPrErrorCode.BRANCH_NOT_FOUND, cause);
|
|
709
|
+
}
|
|
710
|
+
throw new GitPrError(`Failed to checkout '${featureBranch}': ${message}`, GitPrErrorCode.GIT_ERROR, cause);
|
|
711
|
+
}
|
|
712
|
+
// Rebase onto origin/<baseBranch> (the remote-tracking ref).
|
|
713
|
+
// We use origin/<baseBranch> rather than the local <baseBranch> because:
|
|
714
|
+
// 1. syncMain fetches origin/<baseBranch> — it's always up-to-date
|
|
715
|
+
// 2. The local <baseBranch> may be checked out in another worktree and stale
|
|
716
|
+
const rebaseTarget = `origin/${baseBranch}`;
|
|
717
|
+
try {
|
|
718
|
+
await this.execFile('git', ['rebase', rebaseTarget], { cwd });
|
|
719
|
+
}
|
|
720
|
+
catch (error) {
|
|
721
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
722
|
+
const cause = error instanceof Error ? error : undefined;
|
|
723
|
+
// Detect rebase conflict from git stderr/exit code
|
|
724
|
+
if (message.includes('CONFLICT') || message.includes('could not apply')) {
|
|
725
|
+
// Get the list of conflicted files to include in the error message
|
|
726
|
+
let conflictedFiles = [];
|
|
727
|
+
try {
|
|
728
|
+
conflictedFiles = await this.getConflictedFiles(cwd);
|
|
729
|
+
}
|
|
730
|
+
catch {
|
|
731
|
+
// Failed to get conflicted files — still report the conflict
|
|
732
|
+
}
|
|
733
|
+
const fileList = conflictedFiles.length > 0 ? ` Conflicted files: ${conflictedFiles.join(', ')}` : '';
|
|
734
|
+
throw new GitPrError(`Rebase of '${featureBranch}' onto '${baseBranch}' encountered conflicts.${fileList}`, GitPrErrorCode.REBASE_CONFLICT, cause);
|
|
735
|
+
}
|
|
736
|
+
throw new GitPrError(`Rebase of '${featureBranch}' onto '${baseBranch}' failed: ${message}`, GitPrErrorCode.GIT_ERROR, cause);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
async getConflictedFiles(cwd) {
|
|
740
|
+
try {
|
|
741
|
+
const { stdout } = await this.execFile('git', ['diff', '--name-only', '--diff-filter=U'], {
|
|
742
|
+
cwd,
|
|
743
|
+
});
|
|
744
|
+
return stdout
|
|
745
|
+
.trim()
|
|
746
|
+
.split('\n')
|
|
747
|
+
.filter((f) => f.length > 0)
|
|
748
|
+
.map((f) => f.replace(/\\/g, '/'));
|
|
749
|
+
}
|
|
750
|
+
catch (error) {
|
|
751
|
+
throw this.parseGitError(error);
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
async stageFiles(cwd, files) {
|
|
755
|
+
try {
|
|
756
|
+
await this.execFile('git', ['add', ...files], { cwd });
|
|
757
|
+
}
|
|
758
|
+
catch (error) {
|
|
759
|
+
throw this.parseGitError(error);
|
|
760
|
+
}
|
|
761
|
+
}
|
|
762
|
+
async rebaseContinue(cwd) {
|
|
763
|
+
try {
|
|
764
|
+
await this.execFile('git', ['rebase', '--continue'], {
|
|
765
|
+
cwd,
|
|
766
|
+
env: { ...process.env, GIT_EDITOR: 'true' },
|
|
767
|
+
});
|
|
768
|
+
}
|
|
769
|
+
catch (error) {
|
|
770
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
771
|
+
const cause = error instanceof Error ? error : undefined;
|
|
772
|
+
if (message.includes('CONFLICT') || message.includes('could not apply')) {
|
|
773
|
+
throw new GitPrError(`Rebase continue encountered new conflicts: ${message}`, GitPrErrorCode.REBASE_CONFLICT, cause);
|
|
774
|
+
}
|
|
775
|
+
throw this.parseGitError(error);
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
async rebaseAbort(cwd) {
|
|
779
|
+
try {
|
|
780
|
+
await this.execFile('git', ['rebase', '--abort'], { cwd });
|
|
781
|
+
}
|
|
782
|
+
catch (error) {
|
|
783
|
+
throw this.parseGitError(error);
|
|
784
|
+
}
|
|
785
|
+
}
|
|
652
786
|
};
|
|
653
787
|
GitPrService = __decorate([
|
|
654
788
|
injectable(),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rebase-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/rebase-feature.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
export async function rebaseFeature(featureId) {
|
|
4
|
+
if (!featureId?.trim()) {
|
|
5
|
+
return { success: false, error: 'Feature id is required' };
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
const useCase = resolve('RebaseFeatureOnMainUseCase');
|
|
9
|
+
await useCase.execute(featureId);
|
|
10
|
+
return { success: true };
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
const message = error instanceof Error ? error.message : 'Failed to rebase feature';
|
|
14
|
+
return { success: false, error: message };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/sync-repository.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
export async function syncRepository(repositoryId) {
|
|
4
|
+
if (!repositoryId?.trim()) {
|
|
5
|
+
return { success: false, error: 'Repository id is required' };
|
|
6
|
+
}
|
|
7
|
+
try {
|
|
8
|
+
const useCase = resolve('SyncRepositoryMainUseCase');
|
|
9
|
+
await useCase.execute(repositoryId);
|
|
10
|
+
return { success: true };
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
const message = error instanceof Error ? error.message : 'Failed to sync repository';
|
|
14
|
+
return { success: false, error: message };
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -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,2CA0kB1F"}
|
package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js
CHANGED
|
@@ -303,6 +303,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
|
|
|
303
303
|
// ── Hooks (always called unconditionally per Rules of Hooks) ──────────
|
|
304
304
|
const featureActionsInput = featureNode?.repositoryPath && featureNode?.branch
|
|
305
305
|
? {
|
|
306
|
+
featureId: featureNode.featureId,
|
|
306
307
|
repositoryPath: featureNode.repositoryPath,
|
|
307
308
|
branch: featureNode.branch,
|
|
308
309
|
specPath: featureNode.specPath,
|
|
@@ -346,7 +347,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
|
|
|
346
347
|
...(featureNode.state === 'error' && { onRetry: handleRetry }),
|
|
347
348
|
...(featureNode.state === 'pending' && { onStart: handleStart }),
|
|
348
349
|
};
|
|
349
|
-
body = (_jsx(FeatureDrawerTabs, { featureNode: enrichedNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, sseEvents: events, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
|
|
350
|
+
body = (_jsx(FeatureDrawerTabs, { featureNode: enrichedNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, sseEvents: events, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, onRebaseOnMain: featureActions.rebaseOnMain, rebaseLoading: featureActions.rebaseLoading, rebaseError: featureActions.rebaseError, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
|
|
350
351
|
}
|
|
351
352
|
return (_jsx(BaseDrawer, { open: isOpen, onClose: attemptClose, size: "md", modal: false, header: header, "data-testid": view.type === 'feature' ? 'feature-drawer' : 'repository-drawer', children: body }));
|
|
352
353
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/repository-drawer-client.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,2BAA2B,
|
|
1
|
+
{"version":3,"file":"repository-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/repository-drawer-client.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,2BAA2B,2CA2G3E"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import { useCallback } from 'react';
|
|
4
4
|
import { useRouter, usePathname } from 'next/navigation';
|
|
5
|
-
import { Code2, Terminal, FolderOpen } from 'lucide-react';
|
|
5
|
+
import { Code2, Terminal, FolderOpen, RefreshCw } from 'lucide-react';
|
|
6
6
|
import { BaseDrawer } from '../../common/base-drawer/index.js';
|
|
7
7
|
import { ActionButton } from '../../common/action-button/index.js';
|
|
8
8
|
import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
|
|
@@ -14,7 +14,7 @@ export function RepositoryDrawerClient({ data }) {
|
|
|
14
14
|
const router = useRouter();
|
|
15
15
|
const pathname = usePathname();
|
|
16
16
|
const isOpen = pathname.startsWith('/repository/');
|
|
17
|
-
const repoActions = useRepositoryActions(data.repositoryPath ? { repositoryPath: data.repositoryPath } : null);
|
|
17
|
+
const repoActions = useRepositoryActions(data.repositoryPath ? { repositoryId: data.id, repositoryPath: data.repositoryPath } : null);
|
|
18
18
|
const onClose = useCallback(() => {
|
|
19
19
|
router.push('/');
|
|
20
20
|
}, [router]);
|
|
@@ -26,5 +26,5 @@ export function RepositoryDrawerClient({ data }) {
|
|
|
26
26
|
}
|
|
27
27
|
: undefined;
|
|
28
28
|
const header = (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] }));
|
|
29
|
-
return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "md", modal: false, header: header, deployTarget: featureFlags.envDeploy ? repoDeployTarget : undefined, "data-testid": "repository-drawer", children: data.repositoryPath ? (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null }));
|
|
29
|
+
return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "md", modal: false, header: header, deployTarget: featureFlags.envDeploy ? repoDeployTarget : undefined, "data-testid": "repository-drawer", children: data.repositoryPath ? (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] }), data.id ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT OPERATIONS" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Sync Main", onClick: repoActions.syncMain, loading: repoActions.syncLoading, error: !!repoActions.syncError, icon: RefreshCw, variant: "outline", size: "sm" }), repoActions.syncError ? (_jsx("p", { className: "text-destructive text-xs", children: repoActions.syncError })) : null] })] })] })) : null] })) : null }));
|
|
30
30
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export interface FeatureActionsInput {
|
|
2
|
+
featureId: string;
|
|
2
3
|
repositoryPath: string;
|
|
3
4
|
branch: string;
|
|
4
5
|
specPath?: string;
|
|
@@ -7,12 +8,15 @@ export interface FeatureActionsState {
|
|
|
7
8
|
openInIde: () => Promise<void>;
|
|
8
9
|
openInShell: () => Promise<void>;
|
|
9
10
|
openSpecsFolder: () => Promise<void>;
|
|
11
|
+
rebaseOnMain: () => Promise<void>;
|
|
10
12
|
ideLoading: boolean;
|
|
11
13
|
shellLoading: boolean;
|
|
12
14
|
specsLoading: boolean;
|
|
15
|
+
rebaseLoading: boolean;
|
|
13
16
|
ideError: string | null;
|
|
14
17
|
shellError: string | null;
|
|
15
18
|
specsError: string | null;
|
|
19
|
+
rebaseError: string | null;
|
|
16
20
|
}
|
|
17
21
|
export declare function useFeatureActions(input: FeatureActionsInput | null): FeatureActionsState;
|
|
18
22
|
//# sourceMappingURL=use-feature-actions.d.ts.map
|
package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-feature-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/use-feature-actions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"use-feature-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/use-feature-actions.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,mBAAmB,CA6IxF"}
|
|
@@ -3,21 +3,25 @@ import { useState, useCallback, useRef, useEffect } from 'react';
|
|
|
3
3
|
import { openIde } from '../../../app/actions/open-ide.js';
|
|
4
4
|
import { openShell } from '../../../app/actions/open-shell.js';
|
|
5
5
|
import { openFolder } from '../../../app/actions/open-folder.js';
|
|
6
|
+
import { rebaseFeature } from '../../../app/actions/rebase-feature.js';
|
|
6
7
|
const ERROR_CLEAR_DELAY = 5000;
|
|
7
8
|
export function useFeatureActions(input) {
|
|
8
9
|
const [ideLoading, setIdeLoading] = useState(false);
|
|
9
10
|
const [shellLoading, setShellLoading] = useState(false);
|
|
10
11
|
const [specsLoading, setSpecsLoading] = useState(false);
|
|
12
|
+
const [rebaseLoading, setRebaseLoading] = useState(false);
|
|
11
13
|
const [ideError, setIdeError] = useState(null);
|
|
12
14
|
const [shellError, setShellError] = useState(null);
|
|
13
15
|
const [specsError, setSpecsError] = useState(null);
|
|
16
|
+
const [rebaseError, setRebaseError] = useState(null);
|
|
14
17
|
const ideTimerRef = useRef(null);
|
|
15
18
|
const shellTimerRef = useRef(null);
|
|
16
19
|
const specsTimerRef = useRef(null);
|
|
20
|
+
const rebaseTimerRef = useRef(null);
|
|
17
21
|
// Clear timers on unmount — read .current inside cleanup so we get the
|
|
18
22
|
// actual timer value at teardown time, not the always-null value at mount.
|
|
19
23
|
useEffect(() => {
|
|
20
|
-
const refs = [ideTimerRef, shellTimerRef, specsTimerRef];
|
|
24
|
+
const refs = [ideTimerRef, shellTimerRef, specsTimerRef, rebaseTimerRef];
|
|
21
25
|
return () => {
|
|
22
26
|
for (const ref of refs) {
|
|
23
27
|
if (ref.current)
|
|
@@ -79,15 +83,42 @@ export function useFeatureActions(input) {
|
|
|
79
83
|
setSpecsLoading(false);
|
|
80
84
|
}
|
|
81
85
|
}, [input, specsLoading]);
|
|
86
|
+
const handleRebaseOnMain = useCallback(async () => {
|
|
87
|
+
if (!input?.featureId || rebaseLoading)
|
|
88
|
+
return;
|
|
89
|
+
if (rebaseTimerRef.current)
|
|
90
|
+
clearTimeout(rebaseTimerRef.current);
|
|
91
|
+
setRebaseLoading(true);
|
|
92
|
+
setRebaseError(null);
|
|
93
|
+
try {
|
|
94
|
+
const result = await rebaseFeature(input.featureId);
|
|
95
|
+
if (!result.success) {
|
|
96
|
+
const errorMessage = result.error ?? 'An unexpected error occurred';
|
|
97
|
+
setRebaseError(errorMessage);
|
|
98
|
+
rebaseTimerRef.current = setTimeout(() => setRebaseError(null), ERROR_CLEAR_DELAY);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred';
|
|
103
|
+
setRebaseError(errorMessage);
|
|
104
|
+
rebaseTimerRef.current = setTimeout(() => setRebaseError(null), ERROR_CLEAR_DELAY);
|
|
105
|
+
}
|
|
106
|
+
finally {
|
|
107
|
+
setRebaseLoading(false);
|
|
108
|
+
}
|
|
109
|
+
}, [input, rebaseLoading]);
|
|
82
110
|
return {
|
|
83
111
|
openInIde: handleOpenIde,
|
|
84
112
|
openInShell: handleOpenShell,
|
|
85
113
|
openSpecsFolder: handleOpenSpecsFolder,
|
|
114
|
+
rebaseOnMain: handleRebaseOnMain,
|
|
86
115
|
ideLoading,
|
|
87
116
|
shellLoading,
|
|
88
117
|
specsLoading,
|
|
118
|
+
rebaseLoading,
|
|
89
119
|
ideError,
|
|
90
120
|
shellError,
|
|
91
121
|
specsError,
|
|
122
|
+
rebaseError,
|
|
92
123
|
};
|
|
93
124
|
}
|