@shepai/cli 1.127.3 → 1.129.0
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/EnvironmentConfig.yaml +3 -0
- package/apis/json-schema/FeatureFlags.yaml +5 -0
- package/apis/json-schema/Repository.yaml +3 -0
- package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +4 -0
- package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +118 -0
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.js +58 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +2 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/index.js +1 -0
- package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts +1 -0
- package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.js +46 -15
- package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts +31 -0
- package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.js +86 -0
- package/dist/packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.d.ts +13 -0
- package/dist/packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.js +35 -0
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +2 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +12 -0
- 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 +12 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js +2 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-add-repository-remote-url.d.ts +12 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-add-repository-remote-url.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-add-repository-remote-url.js +29 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/041-add-feature-flag-github-import.d.ts +11 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/041-add-feature-flag-github-import.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/041-add-feature-flag-github-import.js +17 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +3 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +38 -2
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +18 -0
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +171 -0
- package/dist/src/presentation/cli/commands/feat/del.command.d.ts +2 -1
- package/dist/src/presentation/cli/commands/feat/del.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/del.command.js +28 -2
- package/dist/src/presentation/cli/commands/repo/add.command.d.ts +13 -0
- package/dist/src/presentation/cli/commands/repo/add.command.d.ts.map +1 -0
- package/dist/src/presentation/cli/commands/repo/add.command.js +82 -0
- package/dist/src/presentation/cli/commands/repo/index.d.ts +1 -0
- package/dist/src/presentation/cli/commands/repo/index.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/repo/index.js +4 -1
- package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts +33 -0
- package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts.map +1 -0
- package/dist/src/presentation/tui/wizards/github-import.wizard.js +121 -0
- package/dist/src/presentation/web/app/actions/delete-feature.d.ts +1 -1
- package/dist/src/presentation/web/app/actions/delete-feature.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/delete-feature.js +3 -1
- package/dist/src/presentation/web/app/actions/import-github-repository.d.ts +11 -0
- package/dist/src/presentation/web/app/actions/import-github-repository.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/import-github-repository.js +27 -0
- package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts +11 -0
- package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/list-github-repositories.js +17 -0
- package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.d.ts +4 -3
- package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.js +22 -5
- 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 +3 -3
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog-config.d.ts +2 -1
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.d.ts +1 -1
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.js +12 -2
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.d.ts +3 -0
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.js +17 -0
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-node/feature-node.js +3 -3
- package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.d.ts +8 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.js +33 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.d.ts +10 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.js +26 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts +15 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js +52 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts +10 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.js +78 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.d.ts +7 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.js +46 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.stories.d.ts +10 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.stories.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.stories.js +29 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/index.d.ts +4 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/index.d.ts.map +1 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/index.js +3 -0
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +2 -2
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +9 -1
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +3 -0
- 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 +5 -0
- 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 +1 -0
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +56 -27
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +7 -1
- package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
- package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
- package/dist/src/presentation/web/hooks/use-graph-state.js +1 -1
- package/dist/src/presentation/web/lib/derive-graph.d.ts +1 -1
- package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
- package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
- package/dist/src/presentation/web/lib/feature-flags.js +5 -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 +2 -2
- package/web/.next/required-server-files.json +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +74 -44
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
- 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 +74 -44
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
- 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 +86 -56
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
- 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 +86 -56
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
- 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 +70 -40
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
- 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 +74 -44
- package/web/.next/server/app/(dashboard)/create/page.js +3 -3
- 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 +86 -56
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
- 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 +86 -56
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
- 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 +70 -40
- package/web/.next/server/app/(dashboard)/page.js +3 -3
- 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 +70 -40
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
- 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 +32 -2
- package/web/.next/server/app/_not-found/page.js +1 -1
- package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
- package/web/.next/server/app/api/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 +42 -12
- package/web/.next/server/app/settings/page.js +2 -2
- 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 +42 -12
- package/web/.next/server/app/skills/page.js +2 -1
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +42 -12
- package/web/.next/server/app/tools/page.js +2 -1
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +32 -2
- package/web/.next/server/app/version/page.js +2 -2
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__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_4e741df2.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.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/7f428_lucide-react_dist_esm_icons_8b618f7d._.js +3 -0
- package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_8b618f7d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +1 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +3 -0
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2f886f77._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__2f886f77._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js.map +1 -0
- 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]__6cc70784._.js → [root-of-the-server]__755cfe02._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__430169b6._.js.map → [root-of-the-server]__755cfe02._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__34323a67._.js → [root-of-the-server]__a21eef5a._.js} +2 -2
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a21eef5a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__1aa034e9._.js → [root-of-the-server]__a628fb91._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__e44ae5ca._.js.map → [root-of-the-server]__a628fb91._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__e44ae5ca._.js → [root-of-the-server]__bfba58e6._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__6cc70784._.js.map → [root-of-the-server]__bfba58e6._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__430169b6._.js → [root-of-the-server]__c3ab8422._.js} +2 -2
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__1aa034e9._.js.map → [root-of-the-server]__c3ab8422._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d61bd462._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__d61bd462._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_918887c5._.js → _0020fddd._.js} +2 -2
- package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_01046927._.js +9 -0
- package/web/.next/server/chunks/ssr/_01046927._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_2f6f48b8._.js → _02ec1aea._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_2f6f48b8._.js.map → _02ec1aea._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_04c9e229._.js +3 -0
- package/web/.next/server/chunks/ssr/_04c9e229._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_67104d9e._.js +3 -0
- package/web/.next/server/chunks/ssr/_67104d9e._.js.map +1 -0
- 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/_a37f5f18._.js +1 -1
- package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
- package/web/.next/server/chunks/ssr/{_4207f708._.js → _ade68272._.js} +2 -2
- package/web/.next/server/chunks/ssr/_ade68272._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_b4b8a636._.js +3 -0
- package/web/.next/server/chunks/ssr/_b4b8a636._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_d8575088._.js +3 -0
- package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -0
- 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/node_modules__pnpm_55c7a131._.js +3 -0
- package/web/.next/server/chunks/ssr/node_modules__pnpm_55c7a131._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_0f98f202._.js → src_presentation_web_12d7d3c5._.js} +2 -2
- package/web/.next/server/chunks/ssr/{src_presentation_web_0f98f202._.js.map → src_presentation_web_12d7d3c5._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +5 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_9db47db7._.js.map → src_presentation_web_8e7fe0d1._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +5 -0
- package/web/.next/server/chunks/ssr/{src_presentation_web_ede4a227._.js.map → src_presentation_web_b9023017._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js.map +1 -0
- 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/pages/500.html +2 -2
- package/web/.next/server/server-reference-manifest.js +1 -1
- package/web/.next/server/server-reference-manifest.json +520 -294
- package/web/.next/static/chunks/114347d98fd69f40.js +1 -0
- package/web/.next/static/chunks/20ff528aadba66aa.js +1 -0
- package/web/.next/static/chunks/278f99f8cc87ab17.js +1 -0
- package/web/.next/static/chunks/29535b9b36889453.js +1 -0
- package/web/.next/static/chunks/314b8314f77d6921.js +1 -0
- package/web/.next/static/chunks/3e1e0f9bde3530d2.js +1 -0
- package/web/.next/static/chunks/601d93593f5f664f.js +1 -0
- package/web/.next/static/chunks/{fa373c6f8139a712.js → 60464e75e7dff8f4.js} +2 -2
- package/web/.next/static/chunks/60fabfee2f9ae935.js +1 -0
- package/web/.next/static/chunks/688971d5bad5dc7c.js +1 -0
- package/web/.next/static/chunks/6c6ab4d42b07fb4b.js +1 -0
- package/web/.next/static/chunks/6cba93f351d29ae4.js +1 -0
- package/web/.next/static/chunks/{41c7cee55ef51fc8.js → 83ae4f574f3dee4d.js} +1 -1
- package/web/.next/static/chunks/{62a58d2f3cd5f35f.js → 98b6ea0af565042f.js} +2 -2
- package/web/.next/static/chunks/98dfbecc5ee30ce1.css +1 -0
- package/web/.next/static/chunks/ab3f7ac1960397d9.js +1 -0
- package/web/.next/static/chunks/c975a20b880c47ea.js +1 -0
- package/web/.next/static/chunks/d34a91958ca566fa.js +13 -0
- package/web/.next/static/chunks/f259386f4875e70c.js +1 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_fbb88113.js +0 -3
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_fbb88113.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_fdfbf5cc.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_fdfbf5cc.js.map +0 -1
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_d8fa0b5f.js +0 -3
- package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_d8fa0b5f.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__02c84e6b._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__02c84e6b._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__34323a67._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357de47c._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357de47c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__67fe07fe._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__67fe07fe._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a50a7e39._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a50a7e39._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1bb79fe8._.js +0 -3
- package/web/.next/server/chunks/ssr/_1bb79fe8._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_4207f708._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_583a83fb._.js +0 -3
- package/web/.next/server/chunks/ssr/_583a83fb._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_918887c5._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_9f56cf8f._.js +0 -3
- package/web/.next/server/chunks/ssr/_9f56cf8f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a187fd7e._.js +0 -3
- package/web/.next/server/chunks/ssr/_a187fd7e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a5aa6371._.js +0 -9
- package/web/.next/server/chunks/ssr/_a5aa6371._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_b730ac57._.js +0 -3
- package/web/.next/server/chunks/ssr/_b730ac57._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_fae9e550._.js +0 -3
- package/web/.next/server/chunks/ssr/_fae9e550._.js.map +0 -1
- package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js +0 -3
- package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js.map +0 -1
- package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js +0 -3
- package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_9db47db7._.js +0 -5
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f66cd328.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f66cd328.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js +0 -3
- package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js.map +0 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_ede4a227._.js +0 -5
- package/web/.next/static/chunks/01ba448cf76c6014.js +0 -1
- package/web/.next/static/chunks/05e9c71e5e4cf531.js +0 -1
- package/web/.next/static/chunks/33d2f67ad4814aba.css +0 -1
- package/web/.next/static/chunks/534e18ee1fbd8452.js +0 -1
- package/web/.next/static/chunks/8080c842b0358904.js +0 -1
- package/web/.next/static/chunks/9b2a23851096f1aa.js +0 -1
- package/web/.next/static/chunks/a67c9c6125c1aa32.js +0 -1
- package/web/.next/static/chunks/a8ba3f3e2b0f87aa.js +0 -1
- package/web/.next/static/chunks/abc3f71a05ccbdfe.js +0 -1
- package/web/.next/static/chunks/c1f3db103c2b226f.js +0 -1
- package/web/.next/static/chunks/cca0f5112a9260d8.js +0 -1
- package/web/.next/static/chunks/cd45aed9c46e1bf5.js +0 -11
- package/web/.next/static/chunks/d04de4be30ab78ca.js +0 -3
- package/web/.next/static/chunks/d47658be0870a4b9.js +0 -1
- package/web/.next/static/chunks/d8e86e8e5bb7cc0a.js +0 -1
- package/web/.next/static/chunks/f9667ee1e5b445b7.js +0 -1
- /package/web/.next/static/{hWrKuop_3FR0syZrFWLvn → _hAwvNHgk12VPT5IIxRV6}/_buildManifest.js +0 -0
- /package/web/.next/static/{hWrKuop_3FR0syZrFWLvn → _hAwvNHgk12VPT5IIxRV6}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{hWrKuop_3FR0syZrFWLvn → _hAwvNHgk12VPT5IIxRV6}/_ssgManifest.js +0 -0
|
@@ -14,6 +14,9 @@ properties:
|
|
|
14
14
|
$ref: TerminalType.yaml
|
|
15
15
|
default: system
|
|
16
16
|
description: Preferred terminal emulator
|
|
17
|
+
defaultCloneDirectory:
|
|
18
|
+
type: string
|
|
19
|
+
description: Default directory for cloning GitHub repositories (e.g. ~/repos)
|
|
17
20
|
required:
|
|
18
21
|
- defaultEditor
|
|
19
22
|
- shellPreference
|
|
@@ -14,6 +14,10 @@ properties:
|
|
|
14
14
|
type: boolean
|
|
15
15
|
default: false
|
|
16
16
|
description: Enable debug UI elements and verbose client-side logging
|
|
17
|
+
githubImport:
|
|
18
|
+
type: boolean
|
|
19
|
+
default: false
|
|
20
|
+
description: Enable GitHub repository import in the web UI
|
|
17
21
|
adoptBranch:
|
|
18
22
|
type: boolean
|
|
19
23
|
default: false
|
|
@@ -22,5 +26,6 @@ required:
|
|
|
22
26
|
- skills
|
|
23
27
|
- envDeploy
|
|
24
28
|
- debug
|
|
29
|
+
- githubImport
|
|
25
30
|
- adoptBranch
|
|
26
31
|
description: Feature flag toggles for runtime feature control
|
|
@@ -8,6 +8,9 @@ properties:
|
|
|
8
8
|
path:
|
|
9
9
|
type: string
|
|
10
10
|
description: Absolute file system path to the repository root (unique)
|
|
11
|
+
remoteUrl:
|
|
12
|
+
type: string
|
|
13
|
+
description: "Remote GitHub URL this repository was cloned from (normalized: lowercase, no .git suffix)"
|
|
11
14
|
required:
|
|
12
15
|
- name
|
|
13
16
|
- path
|
|
@@ -10,10 +10,14 @@ export interface IRepositoryRepository {
|
|
|
10
10
|
findByPath(path: string): Promise<Repository | null>;
|
|
11
11
|
/** Find by path including soft-deleted records (for re-activation). */
|
|
12
12
|
findByPathIncludingDeleted(path: string): Promise<Repository | null>;
|
|
13
|
+
/** Find a non-deleted repository by its remote URL (normalized: lowercase, no .git suffix). */
|
|
14
|
+
findByRemoteUrl(url: string): Promise<Repository | null>;
|
|
13
15
|
list(): Promise<Repository[]>;
|
|
14
16
|
remove(id: string): Promise<void>;
|
|
15
17
|
softDelete(id: string): Promise<void>;
|
|
16
18
|
/** Restore a soft-deleted repository by clearing deletedAt. */
|
|
17
19
|
restore(id: string): Promise<void>;
|
|
20
|
+
/** Update specific fields on an existing repository. */
|
|
21
|
+
update(id: string, fields: Partial<Pick<Repository, 'name' | 'path' | 'remoteUrl'>>): Promise<Repository>;
|
|
18
22
|
}
|
|
19
23
|
//# sourceMappingURL=repository-repository.interface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-repository.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/repositories/repository-repository.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrD,uEAAuE;IACvE,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrE,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"repository-repository.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/repositories/repository-repository.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrD,uEAAuE;IACvE,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrE,+FAA+F;IAC/F,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACzD,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,wDAAwD;IACxD,MAAM,CACJ,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,GAC/D,OAAO,CAAC,UAAU,CAAC,CAAC;CACxB"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Repository Service Interface
|
|
3
|
+
*
|
|
4
|
+
* Output port for GitHub repository operations via the gh CLI.
|
|
5
|
+
* Implementations manage authentication checks, repository cloning,
|
|
6
|
+
* user repository listing, and GitHub URL parsing.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Thrown when the GitHub CLI is not authenticated.
|
|
10
|
+
*/
|
|
11
|
+
export declare class GitHubAuthError extends Error {
|
|
12
|
+
constructor(message: string, cause?: Error);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Thrown when a `gh repo clone` operation fails.
|
|
16
|
+
*/
|
|
17
|
+
export declare class GitHubCloneError extends Error {
|
|
18
|
+
constructor(message: string, cause?: Error);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Thrown when a GitHub URL cannot be parsed into owner/repo.
|
|
22
|
+
*/
|
|
23
|
+
export declare class GitHubUrlParseError extends Error {
|
|
24
|
+
constructor(message: string, cause?: Error);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Thrown when listing the user's GitHub repositories fails.
|
|
28
|
+
*/
|
|
29
|
+
export declare class GitHubRepoListError extends Error {
|
|
30
|
+
constructor(message: string, cause?: Error);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A GitHub repository as returned by `gh repo list --json`.
|
|
34
|
+
*/
|
|
35
|
+
export interface GitHubRepo {
|
|
36
|
+
/** Repository name (e.g. "my-project") */
|
|
37
|
+
name: string;
|
|
38
|
+
/** Full owner/repo identifier (e.g. "octocat/my-project") */
|
|
39
|
+
nameWithOwner: string;
|
|
40
|
+
/** Repository description (may be empty string) */
|
|
41
|
+
description: string;
|
|
42
|
+
/** Whether the repository is private */
|
|
43
|
+
isPrivate: boolean;
|
|
44
|
+
/** ISO 8601 timestamp of the most recent push */
|
|
45
|
+
pushedAt: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Options for listing user repositories.
|
|
49
|
+
*/
|
|
50
|
+
export interface ListUserRepositoriesOptions {
|
|
51
|
+
/** Maximum number of repos to return (default: 30) */
|
|
52
|
+
limit?: number;
|
|
53
|
+
/** Filter repos by name substring */
|
|
54
|
+
search?: string;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Options for cloning a repository.
|
|
58
|
+
*/
|
|
59
|
+
export interface CloneOptions {
|
|
60
|
+
/** Callback invoked with stderr chunks during clone for progress display */
|
|
61
|
+
onProgress?: (data: string) => void;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Result of parsing a GitHub URL.
|
|
65
|
+
*/
|
|
66
|
+
export interface ParsedGitHubUrl {
|
|
67
|
+
/** Repository owner (e.g. "octocat") */
|
|
68
|
+
owner: string;
|
|
69
|
+
/** Repository name (e.g. "my-project") */
|
|
70
|
+
repo: string;
|
|
71
|
+
/** Combined owner/repo (e.g. "octocat/my-project") */
|
|
72
|
+
nameWithOwner: string;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Output port for GitHub repository operations.
|
|
76
|
+
*
|
|
77
|
+
* Implementations use the `gh` CLI for all GitHub interactions.
|
|
78
|
+
*/
|
|
79
|
+
export interface IGitHubRepositoryService {
|
|
80
|
+
/**
|
|
81
|
+
* Verify that the GitHub CLI is authenticated.
|
|
82
|
+
*
|
|
83
|
+
* @throws {GitHubAuthError} if `gh auth status` indicates the user is not logged in
|
|
84
|
+
*/
|
|
85
|
+
checkAuth(): Promise<void>;
|
|
86
|
+
/**
|
|
87
|
+
* Clone a GitHub repository to a local destination directory.
|
|
88
|
+
*
|
|
89
|
+
* @param nameWithOwner - Full owner/repo identifier (e.g. "octocat/my-project")
|
|
90
|
+
* @param destination - Absolute path to clone into
|
|
91
|
+
* @param options - Optional clone configuration (e.g. progress callback)
|
|
92
|
+
* @throws {GitHubCloneError} if the clone subprocess fails
|
|
93
|
+
*/
|
|
94
|
+
cloneRepository(nameWithOwner: string, destination: string, options?: CloneOptions): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* List the authenticated user's GitHub repositories.
|
|
97
|
+
*
|
|
98
|
+
* @param options - Optional filtering and pagination
|
|
99
|
+
* @returns Array of GitHub repositories sorted by most recently pushed
|
|
100
|
+
* @throws {GitHubRepoListError} if the list operation fails
|
|
101
|
+
*/
|
|
102
|
+
listUserRepositories(options?: ListUserRepositoriesOptions): Promise<GitHubRepo[]>;
|
|
103
|
+
/**
|
|
104
|
+
* Parse a GitHub URL or shorthand into its owner/repo components.
|
|
105
|
+
*
|
|
106
|
+
* Supported formats:
|
|
107
|
+
* - `https://github.com/owner/repo`
|
|
108
|
+
* - `https://github.com/owner/repo.git`
|
|
109
|
+
* - `git@github.com:owner/repo.git`
|
|
110
|
+
* - `owner/repo` (shorthand)
|
|
111
|
+
*
|
|
112
|
+
* @param url - The GitHub URL or shorthand to parse
|
|
113
|
+
* @returns Parsed owner, repo, and nameWithOwner
|
|
114
|
+
* @throws {GitHubUrlParseError} if the URL does not match any supported format
|
|
115
|
+
*/
|
|
116
|
+
parseGitHubUrl(url: string): ParsedGitHubUrl;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=github-repository-service.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-repository-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAMD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,SAAS,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;CACvB;AAMD;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3B;;;;;;;OAOG;IACH,eAAe,CACb,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;OAMG;IACH,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEnF;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC;CAC9C"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Repository Service Interface
|
|
3
|
+
*
|
|
4
|
+
* Output port for GitHub repository operations via the gh CLI.
|
|
5
|
+
* Implementations manage authentication checks, repository cloning,
|
|
6
|
+
* user repository listing, and GitHub URL parsing.
|
|
7
|
+
*/
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Error classes
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
/**
|
|
12
|
+
* Thrown when the GitHub CLI is not authenticated.
|
|
13
|
+
*/
|
|
14
|
+
export class GitHubAuthError extends Error {
|
|
15
|
+
constructor(message, cause) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.name = 'GitHubAuthError';
|
|
18
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
19
|
+
if (cause)
|
|
20
|
+
this.cause = cause;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Thrown when a `gh repo clone` operation fails.
|
|
25
|
+
*/
|
|
26
|
+
export class GitHubCloneError extends Error {
|
|
27
|
+
constructor(message, cause) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.name = 'GitHubCloneError';
|
|
30
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
31
|
+
if (cause)
|
|
32
|
+
this.cause = cause;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Thrown when a GitHub URL cannot be parsed into owner/repo.
|
|
37
|
+
*/
|
|
38
|
+
export class GitHubUrlParseError extends Error {
|
|
39
|
+
constructor(message, cause) {
|
|
40
|
+
super(message);
|
|
41
|
+
this.name = 'GitHubUrlParseError';
|
|
42
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
43
|
+
if (cause)
|
|
44
|
+
this.cause = cause;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Thrown when listing the user's GitHub repositories fails.
|
|
49
|
+
*/
|
|
50
|
+
export class GitHubRepoListError extends Error {
|
|
51
|
+
constructor(message, cause) {
|
|
52
|
+
super(message);
|
|
53
|
+
this.name = 'GitHubRepoListError';
|
|
54
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
55
|
+
if (cause)
|
|
56
|
+
this.cause = cause;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -17,4 +17,6 @@ export { GitPrError, GitPrErrorCode } from './git-pr-service.interface.js';
|
|
|
17
17
|
export type { IIdeLauncherService, LaunchIdeInput, LaunchIdeResult, LaunchIdeSuccess, LaunchIdeFailed, } from './ide-launcher-service.interface.js';
|
|
18
18
|
export type { IDaemonService, DaemonState } from './daemon-service.interface.js';
|
|
19
19
|
export type { IDeploymentService, DeploymentStatus } from './deployment-service.interface.js';
|
|
20
|
+
export type { IGitHubRepositoryService, GitHubRepo, ListUserRepositoriesOptions, CloneOptions, ParsedGitHubUrl, } from './github-repository-service.interface.js';
|
|
21
|
+
export { GitHubAuthError, GitHubCloneError, GitHubUrlParseError, GitHubRepoListError, } from './github-repository-service.interface.js';
|
|
20
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EACV,wBAAwB,EACxB,UAAU,EACV,2BAA2B,EAC3B,YAAY,EACZ,eAAe,GAChB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC"}
|
|
@@ -6,3 +6,4 @@
|
|
|
6
6
|
export { IssueFetcherError, IssueNotFoundError, IssueAuthenticationError, IssueServiceUnavailableError, } from './external-issue-fetcher.interface.js';
|
|
7
7
|
export { WorktreeError, WorktreeErrorCode } from './worktree-service.interface.js';
|
|
8
8
|
export { GitPrError, GitPrErrorCode } from './git-pr-service.interface.js';
|
|
9
|
+
export { GitHubAuthError, GitHubCloneError, GitHubUrlParseError, GitHubRepoListError, } from './github-repository-service.interface.js';
|
|
@@ -21,6 +21,7 @@ import type { IGitPrService } from '../../ports/output/services/git-pr-service.i
|
|
|
21
21
|
export interface DeleteFeatureOptions {
|
|
22
22
|
cleanup?: boolean;
|
|
23
23
|
cascadeDelete?: boolean;
|
|
24
|
+
closePr?: boolean;
|
|
24
25
|
}
|
|
25
26
|
export declare class DeleteFeatureUseCase {
|
|
26
27
|
private readonly featureRepo;
|
package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delete-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/delete-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"delete-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/delete-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBACa,oBAAoB;IAEC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAE5D,OAAO,CAAC,QAAQ,CAAC,cAAc;IACA,OAAO,CAAC,QAAQ,CAAC,OAAO;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBALP,WAAW,EAAE,kBAAkB,EACjC,eAAe,EAAE,gBAAgB,EAE7D,cAAc,EAAE,2BAA2B,EACZ,OAAO,EAAE,mBAAmB,EAClC,YAAY,EAAE,aAAa;IAGjE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IA8BlF,oGAAoG;YACtF,gBAAgB;IAW9B,0DAA0D;YAC5C,iBAAiB;IAQ/B,6DAA6D;YAC/C,yBAAyB;IAevC,sDAAsD;YACxC,sBAAsB;IAYpC,6EAA6E;YAC/D,oBAAoB;CA+EnC"}
|
|
@@ -25,7 +25,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
25
25
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
26
26
|
};
|
|
27
27
|
import { injectable, inject } from 'tsyringe';
|
|
28
|
-
import { AgentRunStatus, SdlcLifecycle } from '../../../domain/generated/output.js';
|
|
28
|
+
import { AgentRunStatus, PrStatus, SdlcLifecycle } from '../../../domain/generated/output.js';
|
|
29
29
|
let DeleteFeatureUseCase = class DeleteFeatureUseCase {
|
|
30
30
|
featureRepo;
|
|
31
31
|
worktreeService;
|
|
@@ -93,6 +93,10 @@ let DeleteFeatureUseCase = class DeleteFeatureUseCase {
|
|
|
93
93
|
});
|
|
94
94
|
// Soft-delete: sets deletedAt, hiding from normal queries
|
|
95
95
|
await this.featureRepo.softDelete(feature.id);
|
|
96
|
+
// Sync the in-memory feature object so subsequent update() calls
|
|
97
|
+
// (e.g. PR status update in cleanup) don't overwrite deleted_at back to null.
|
|
98
|
+
feature.lifecycle = SdlcLifecycle.Deleting;
|
|
99
|
+
feature.deletedAt = new Date();
|
|
96
100
|
}
|
|
97
101
|
/** Recursively cleanup all children (depth-first). */
|
|
98
102
|
async cascadeCleanupChildren(parentId, options) {
|
|
@@ -133,22 +137,49 @@ let DeleteFeatureUseCase = class DeleteFeatureUseCase {
|
|
|
133
137
|
}
|
|
134
138
|
const cleanup = options?.cleanup !== false;
|
|
135
139
|
if (cleanup) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
140
|
+
const shouldDeleteRemote = options?.closePr !== false;
|
|
141
|
+
// Delete local branch, and also remote if closePr is enabled.
|
|
142
|
+
// deleteBranch(cwd, branch, true) deletes local then remote in one call,
|
|
143
|
+
// so we must NOT delete local separately when also deleting remote.
|
|
144
|
+
if (shouldDeleteRemote) {
|
|
145
|
+
let remoteDeleted = false;
|
|
146
|
+
try {
|
|
147
|
+
const remoteExists = await this.worktreeService.remoteBranchExists(feature.repositoryPath, feature.branch);
|
|
148
|
+
if (remoteExists) {
|
|
149
|
+
// Delete local + remote in one call (deleteBranch does local first, then remote)
|
|
150
|
+
await this.gitPrService.deleteBranch(feature.repositoryPath, feature.branch, true);
|
|
151
|
+
remoteDeleted = true;
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
// No remote branch — just delete local
|
|
155
|
+
await this.gitPrService.deleteBranch(feature.repositoryPath, feature.branch);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
// Branch cleanup is best-effort
|
|
160
|
+
}
|
|
161
|
+
// Update pr.status to Closed after remote branch deletion (GitHub auto-closes the PR)
|
|
162
|
+
if (remoteDeleted && feature.pr?.status === PrStatus.Open) {
|
|
163
|
+
try {
|
|
164
|
+
await this.featureRepo.update({
|
|
165
|
+
...feature,
|
|
166
|
+
pr: { ...feature.pr, status: PrStatus.Closed },
|
|
167
|
+
updatedAt: new Date(),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
// PR status update is best-effort
|
|
172
|
+
}
|
|
148
173
|
}
|
|
149
174
|
}
|
|
150
|
-
|
|
151
|
-
//
|
|
175
|
+
else {
|
|
176
|
+
// closePr is false — only delete local branch, preserve remote (and the PR)
|
|
177
|
+
try {
|
|
178
|
+
await this.gitPrService.deleteBranch(feature.repositoryPath, feature.branch);
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Branch might not exist
|
|
182
|
+
}
|
|
152
183
|
}
|
|
153
184
|
}
|
|
154
185
|
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import GitHub Repository Use Case
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates importing a GitHub repository: validates the URL, checks auth,
|
|
5
|
+
* detects duplicates by remoteUrl, clones via IGitHubRepositoryService,
|
|
6
|
+
* delegates local registration to AddRepositoryUseCase, and updates the
|
|
7
|
+
* repository record with the normalized remoteUrl.
|
|
8
|
+
*/
|
|
9
|
+
import type { Repository } from '../../../domain/generated/output.js';
|
|
10
|
+
import type { IGitHubRepositoryService, CloneOptions } from '../../ports/output/services/github-repository-service.interface.js';
|
|
11
|
+
import type { IRepositoryRepository } from '../../ports/output/repositories/repository-repository.interface.js';
|
|
12
|
+
import { AddRepositoryUseCase } from './add-repository.use-case.js';
|
|
13
|
+
export interface ImportGitHubRepositoryInput {
|
|
14
|
+
/** GitHub URL or shorthand (e.g. "owner/repo") */
|
|
15
|
+
url: string;
|
|
16
|
+
/** Override clone destination directory */
|
|
17
|
+
dest?: string;
|
|
18
|
+
/** Default base directory for clones (from settings) */
|
|
19
|
+
defaultCloneDir?: string;
|
|
20
|
+
/** Options for the clone subprocess (e.g. progress callback) */
|
|
21
|
+
cloneOptions?: CloneOptions;
|
|
22
|
+
}
|
|
23
|
+
export declare class ImportGitHubRepositoryUseCase {
|
|
24
|
+
private readonly gitHubService;
|
|
25
|
+
private readonly repositoryRepo;
|
|
26
|
+
private readonly addRepositoryUseCase;
|
|
27
|
+
constructor(gitHubService: IGitHubRepositoryService, repositoryRepo: IRepositoryRepository, addRepositoryUseCase: AddRepositoryUseCase);
|
|
28
|
+
execute(input: ImportGitHubRepositoryInput): Promise<Repository>;
|
|
29
|
+
private resolveDestination;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=import-github-repository.use-case.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-github-repository.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/repositories/import-github-repository.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EACV,wBAAwB,EACxB,YAAY,EACb,MAAM,oEAAoE,CAAC;AAC5E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oEAAoE,CAAC;AAChH,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,WAAW,2BAA2B;IAC1C,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAUD,qBACa,6BAA6B;IAGtC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,oBAAoB;gBAJpB,aAAa,EAAE,wBAAwB,EAEvC,cAAc,EAAE,qBAAqB,EAErC,oBAAoB,EAAE,oBAAoB;IAGvD,OAAO,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,CAAC;IAoCtE,OAAO,CAAC,kBAAkB;CAW3B"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Import GitHub Repository Use Case
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates importing a GitHub repository: validates the URL, checks auth,
|
|
5
|
+
* detects duplicates by remoteUrl, clones via IGitHubRepositoryService,
|
|
6
|
+
* delegates local registration to AddRepositoryUseCase, and updates the
|
|
7
|
+
* repository record with the normalized remoteUrl.
|
|
8
|
+
*/
|
|
9
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
10
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
11
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
12
|
+
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;
|
|
13
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
14
|
+
};
|
|
15
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
16
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
17
|
+
};
|
|
18
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
19
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
20
|
+
};
|
|
21
|
+
import { injectable, inject } from 'tsyringe';
|
|
22
|
+
import { homedir } from 'node:os';
|
|
23
|
+
import { join } from 'node:path';
|
|
24
|
+
import { AddRepositoryUseCase } from './add-repository.use-case.js';
|
|
25
|
+
/**
|
|
26
|
+
* Normalizes a GitHub remote URL for storage and duplicate detection.
|
|
27
|
+
* Lowercases and strips trailing .git suffix.
|
|
28
|
+
*/
|
|
29
|
+
function normalizeRemoteUrl(nameWithOwner) {
|
|
30
|
+
return `https://github.com/${nameWithOwner.toLowerCase()}`;
|
|
31
|
+
}
|
|
32
|
+
let ImportGitHubRepositoryUseCase = class ImportGitHubRepositoryUseCase {
|
|
33
|
+
gitHubService;
|
|
34
|
+
repositoryRepo;
|
|
35
|
+
addRepositoryUseCase;
|
|
36
|
+
constructor(gitHubService, repositoryRepo, addRepositoryUseCase) {
|
|
37
|
+
this.gitHubService = gitHubService;
|
|
38
|
+
this.repositoryRepo = repositoryRepo;
|
|
39
|
+
this.addRepositoryUseCase = addRepositoryUseCase;
|
|
40
|
+
}
|
|
41
|
+
async execute(input) {
|
|
42
|
+
// 1. Validate URL — throws GitHubUrlParseError for invalid formats
|
|
43
|
+
const parsed = this.gitHubService.parseGitHubUrl(input.url);
|
|
44
|
+
// 2. Normalize the remote URL for storage and duplicate detection
|
|
45
|
+
const normalizedUrl = normalizeRemoteUrl(parsed.nameWithOwner);
|
|
46
|
+
// 3. Check for duplicate by remoteUrl — skip clone if already tracked
|
|
47
|
+
const existing = await this.repositoryRepo.findByRemoteUrl(normalizedUrl);
|
|
48
|
+
if (existing) {
|
|
49
|
+
return existing;
|
|
50
|
+
}
|
|
51
|
+
// 4. Check auth — throws GitHubAuthError if not authenticated
|
|
52
|
+
await this.gitHubService.checkAuth();
|
|
53
|
+
// 5. Resolve clone destination
|
|
54
|
+
const destination = this.resolveDestination(input, parsed.repo);
|
|
55
|
+
// 6. Clone the repository
|
|
56
|
+
await this.gitHubService.cloneRepository(parsed.nameWithOwner, destination, input.cloneOptions);
|
|
57
|
+
// 7. Register the cloned repo via AddRepositoryUseCase
|
|
58
|
+
const repository = await this.addRepositoryUseCase.execute({
|
|
59
|
+
path: destination,
|
|
60
|
+
name: parsed.repo,
|
|
61
|
+
});
|
|
62
|
+
// 8. Update with normalized remoteUrl
|
|
63
|
+
await this.repositoryRepo.update(repository.id, {
|
|
64
|
+
remoteUrl: normalizedUrl,
|
|
65
|
+
});
|
|
66
|
+
return { ...repository, remoteUrl: normalizedUrl };
|
|
67
|
+
}
|
|
68
|
+
resolveDestination(input, repoName) {
|
|
69
|
+
if (input.dest) {
|
|
70
|
+
return input.dest;
|
|
71
|
+
}
|
|
72
|
+
let baseDir = input.defaultCloneDir ?? join(homedir(), 'repos');
|
|
73
|
+
if (baseDir.startsWith('~/')) {
|
|
74
|
+
baseDir = join(homedir(), baseDir.slice(2));
|
|
75
|
+
}
|
|
76
|
+
return join(baseDir, repoName);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
ImportGitHubRepositoryUseCase = __decorate([
|
|
80
|
+
injectable(),
|
|
81
|
+
__param(0, inject('IGitHubRepositoryService')),
|
|
82
|
+
__param(1, inject('IRepositoryRepository')),
|
|
83
|
+
__param(2, inject(AddRepositoryUseCase)),
|
|
84
|
+
__metadata("design:paramtypes", [Object, Object, AddRepositoryUseCase])
|
|
85
|
+
], ImportGitHubRepositoryUseCase);
|
|
86
|
+
export { ImportGitHubRepositoryUseCase };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List GitHub Repositories Use Case
|
|
3
|
+
*
|
|
4
|
+
* Checks GitHub CLI auth, then fetches the authenticated user's repositories.
|
|
5
|
+
* Decouples presentation from the IGitHubRepositoryService infrastructure.
|
|
6
|
+
*/
|
|
7
|
+
import type { IGitHubRepositoryService, GitHubRepo, ListUserRepositoriesOptions } from '../../ports/output/services/github-repository-service.interface.js';
|
|
8
|
+
export declare class ListGitHubRepositoriesUseCase {
|
|
9
|
+
private readonly gitHubService;
|
|
10
|
+
constructor(gitHubService: IGitHubRepositoryService);
|
|
11
|
+
execute(options?: ListUserRepositoriesOptions): Promise<GitHubRepo[]>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=list-github-repositories.use-case.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-github-repositories.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,wBAAwB,EACxB,UAAU,EACV,2BAA2B,EAC5B,MAAM,oEAAoE,CAAC;AAE5E,qBACa,6BAA6B;IAGtC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,wBAAwB;IAGpD,OAAO,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAI5E"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List GitHub Repositories Use Case
|
|
3
|
+
*
|
|
4
|
+
* Checks GitHub CLI auth, then fetches the authenticated user's repositories.
|
|
5
|
+
* Decouples presentation from the IGitHubRepositoryService infrastructure.
|
|
6
|
+
*/
|
|
7
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
8
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
10
|
+
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;
|
|
11
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
12
|
+
};
|
|
13
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
14
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
15
|
+
};
|
|
16
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
17
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
18
|
+
};
|
|
19
|
+
import { injectable, inject } from 'tsyringe';
|
|
20
|
+
let ListGitHubRepositoriesUseCase = class ListGitHubRepositoriesUseCase {
|
|
21
|
+
gitHubService;
|
|
22
|
+
constructor(gitHubService) {
|
|
23
|
+
this.gitHubService = gitHubService;
|
|
24
|
+
}
|
|
25
|
+
async execute(options) {
|
|
26
|
+
await this.gitHubService.checkAuth();
|
|
27
|
+
return this.gitHubService.listUserRepositories(options);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
ListGitHubRepositoriesUseCase = __decorate([
|
|
31
|
+
injectable(),
|
|
32
|
+
__param(0, inject('IGitHubRepositoryService')),
|
|
33
|
+
__metadata("design:paramtypes", [Object])
|
|
34
|
+
], ListGitHubRepositoriesUseCase);
|
|
35
|
+
export { ListGitHubRepositoriesUseCase };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-defaults.factory.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/domain/factories/settings-defaults.factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,QAAQ,EAUT,MAAM,qBAAqB,CAAC;AA6C7B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,IAAI,QAAQ,
|
|
1
|
+
{"version":3,"file":"settings-defaults.factory.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/domain/factories/settings-defaults.factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,QAAQ,EAUT,MAAM,qBAAqB,CAAC;AA6C7B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,IAAI,QAAQ,CAkFhD"}
|
|
@@ -78,6 +78,7 @@ export function createDefaultSettings() {
|
|
|
78
78
|
defaultEditor: DEFAULT_EDITOR,
|
|
79
79
|
shellPreference: DEFAULT_SHELL,
|
|
80
80
|
terminalPreference: DEFAULT_TERMINAL,
|
|
81
|
+
defaultCloneDirectory: '~/repos',
|
|
81
82
|
};
|
|
82
83
|
const system = {
|
|
83
84
|
autoUpdate: true,
|
|
@@ -122,6 +123,7 @@ export function createDefaultSettings() {
|
|
|
122
123
|
skills: false,
|
|
123
124
|
envDeploy: true,
|
|
124
125
|
debug: false,
|
|
126
|
+
githubImport: false,
|
|
125
127
|
adoptBranch: false,
|
|
126
128
|
};
|
|
127
129
|
return {
|
|
@@ -284,6 +284,10 @@ export type EnvironmentConfig = {
|
|
|
284
284
|
* Preferred terminal emulator
|
|
285
285
|
*/
|
|
286
286
|
terminalPreference: TerminalType;
|
|
287
|
+
/**
|
|
288
|
+
* Default directory for cloning GitHub repositories (e.g. ~/repos)
|
|
289
|
+
*/
|
|
290
|
+
defaultCloneDirectory?: string;
|
|
287
291
|
};
|
|
288
292
|
/**
|
|
289
293
|
* System configuration
|
|
@@ -530,6 +534,10 @@ export type FeatureFlags = {
|
|
|
530
534
|
* Enable debug UI elements and verbose client-side logging
|
|
531
535
|
*/
|
|
532
536
|
debug: boolean;
|
|
537
|
+
/**
|
|
538
|
+
* Enable GitHub repository import in the web UI
|
|
539
|
+
*/
|
|
540
|
+
githubImport: boolean;
|
|
533
541
|
/**
|
|
534
542
|
* Enable adopt branch feature to import existing branches as tracked features
|
|
535
543
|
*/
|
|
@@ -1470,6 +1478,10 @@ export type Repository = SoftDeletableEntity & {
|
|
|
1470
1478
|
* Absolute file system path to the repository root (unique)
|
|
1471
1479
|
*/
|
|
1472
1480
|
path: string;
|
|
1481
|
+
/**
|
|
1482
|
+
* Remote GitHub URL this repository was cloned from (normalized: lowercase, no .git suffix)
|
|
1483
|
+
*/
|
|
1484
|
+
remoteUrl?: string;
|
|
1473
1485
|
};
|
|
1474
1486
|
/**
|
|
1475
1487
|
* Single installation suggestion for a tool
|