@shepai/cli 1.127.3 → 1.128.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/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/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/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/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/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/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/_087a3e78._.js +3 -0
- package/web/.next/server/chunks/ssr/_087a3e78._.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/_b4b8a636._.js +3 -0
- package/web/.next/server/chunks/ssr/_b4b8a636._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_4207f708._.js → _c2314ba5._.js} +2 -2
- package/web/.next/server/chunks/ssr/_c2314ba5._.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_39dc6c69._.js} +2 -2
- package/web/.next/server/chunks/ssr/{src_presentation_web_0f98f202._.js.map → src_presentation_web_39dc6c69._.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/1ccaceb64fe9084f.js +1 -0
- package/web/.next/static/chunks/314b8314f77d6921.js +1 -0
- package/web/.next/static/chunks/3c0cef220743905a.js +1 -0
- package/web/.next/static/chunks/3d5d625e02456fab.js +1 -0
- package/web/.next/static/chunks/3e1e0f9bde3530d2.js +1 -0
- package/web/.next/static/chunks/4b9ea85ea5fbc162.js +1 -0
- package/web/.next/static/chunks/601d93593f5f664f.js +1 -0
- package/web/.next/static/chunks/688971d5bad5dc7c.js +1 -0
- package/web/.next/static/chunks/6d8be29584ad0fdd.js +1 -0
- package/web/.next/static/chunks/{62a58d2f3cd5f35f.js → 776e7f0d6b402430.js} +2 -2
- package/web/.next/static/chunks/822ed01254f97121.js +1 -0
- package/web/.next/static/chunks/8f979abfe5512674.js +1 -0
- package/web/.next/static/chunks/98dfbecc5ee30ce1.css +1 -0
- package/web/.next/static/chunks/{fa373c6f8139a712.js → c1537a58c2e5625b.js} +2 -2
- package/web/.next/static/chunks/d34a91958ca566fa.js +13 -0
- package/web/.next/static/chunks/{41c7cee55ef51fc8.js → d534a122561e6231.js} +1 -1
- package/web/.next/static/chunks/e22192217a4fc0d4.js +1 -0
- package/web/.next/static/chunks/eea5d09deb8afd9a.js +1 -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 → aZANFTRivKlrY7NZ-ovtr}/_buildManifest.js +0 -0
- /package/web/.next/static/{hWrKuop_3FR0syZrFWLvn → aZANFTRivKlrY7NZ-ovtr}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{hWrKuop_3FR0syZrFWLvn → aZANFTRivKlrY7NZ-ovtr}/_ssgManifest.js +0 -0
|
@@ -9,10 +9,12 @@
|
|
|
9
9
|
* Subcommands:
|
|
10
10
|
* shep repo ls List tracked repositories
|
|
11
11
|
* shep repo show <id> Display details of a tracked repository
|
|
12
|
+
* shep repo add Import a GitHub repository
|
|
12
13
|
*/
|
|
13
14
|
import { Command } from 'commander';
|
|
14
15
|
import { createShowCommand } from './show.command.js';
|
|
15
16
|
import { createLsCommand } from './ls.command.js';
|
|
17
|
+
import { createAddCommand } from './add.command.js';
|
|
16
18
|
/**
|
|
17
19
|
* Create the repo command with all subcommands
|
|
18
20
|
*/
|
|
@@ -20,6 +22,7 @@ export function createRepoCommand() {
|
|
|
20
22
|
const repo = new Command('repo')
|
|
21
23
|
.description('Manage tracked repositories')
|
|
22
24
|
.addCommand(createLsCommand())
|
|
23
|
-
.addCommand(createShowCommand())
|
|
25
|
+
.addCommand(createShowCommand())
|
|
26
|
+
.addCommand(createAddCommand());
|
|
24
27
|
return repo;
|
|
25
28
|
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Import Wizard
|
|
3
|
+
*
|
|
4
|
+
* Interactive TUI wizard that guides users through importing a GitHub repository.
|
|
5
|
+
* Offers two paths: paste a GitHub URL or browse the user's repositories.
|
|
6
|
+
* Returns the selected URL/nameWithOwner and optional destination override.
|
|
7
|
+
*/
|
|
8
|
+
import type { IGitHubRepositoryService } from '../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
|
|
9
|
+
import type { ListGitHubRepositoriesUseCase } from '../../../../packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.js';
|
|
10
|
+
/**
|
|
11
|
+
* Result returned by the GitHub import wizard.
|
|
12
|
+
*/
|
|
13
|
+
export interface GitHubImportWizardResult {
|
|
14
|
+
/** GitHub URL or owner/repo shorthand */
|
|
15
|
+
url: string;
|
|
16
|
+
/** Optional override for clone destination directory */
|
|
17
|
+
dest?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Runs the interactive GitHub import wizard.
|
|
21
|
+
*
|
|
22
|
+
* Steps:
|
|
23
|
+
* 1. Choose import method (URL input or browse repos)
|
|
24
|
+
* 2a. If URL: prompt for URL, validate with parseGitHubUrl
|
|
25
|
+
* 2b. If browse: fetch repos via listUseCase, display select list
|
|
26
|
+
* 3. Optionally prompt for destination directory override
|
|
27
|
+
*
|
|
28
|
+
* @param gitHubService - Service for URL validation
|
|
29
|
+
* @param listUseCase - Use case for listing user repos
|
|
30
|
+
* @returns The selected import target and optional destination
|
|
31
|
+
*/
|
|
32
|
+
export declare function githubImportWizard(gitHubService: IGitHubRepositoryService, listUseCase: ListGitHubRepositoriesUseCase): Promise<GitHubImportWizardResult>;
|
|
33
|
+
//# sourceMappingURL=github-import.wizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-import.wizard.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/tui/wizards/github-import.wizard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,wBAAwB,EAEzB,MAAM,4EAA4E,CAAC;AAEpF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2EAA2E,CAAC;AAG/H;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAoBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,wBAAwB,EACvC,WAAW,EAAE,6BAA6B,GACzC,OAAO,CAAC,wBAAwB,CAAC,CAoCnC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Import Wizard
|
|
3
|
+
*
|
|
4
|
+
* Interactive TUI wizard that guides users through importing a GitHub repository.
|
|
5
|
+
* Offers two paths: paste a GitHub URL or browse the user's repositories.
|
|
6
|
+
* Returns the selected URL/nameWithOwner and optional destination override.
|
|
7
|
+
*/
|
|
8
|
+
import { select, input } from '@inquirer/prompts';
|
|
9
|
+
import { GitHubUrlParseError } from '../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
|
|
10
|
+
import { shepTheme } from '../themes/shep.theme.js';
|
|
11
|
+
/**
|
|
12
|
+
* Format a GitHub repo for display in the select list.
|
|
13
|
+
* Shows name, visibility badge, and truncated description.
|
|
14
|
+
*/
|
|
15
|
+
function formatRepoChoice(repo) {
|
|
16
|
+
const visibility = repo.isPrivate ? ' (private)' : '';
|
|
17
|
+
return {
|
|
18
|
+
name: `${repo.nameWithOwner}${visibility}`,
|
|
19
|
+
value: repo.nameWithOwner,
|
|
20
|
+
description: repo.description || undefined,
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Runs the interactive GitHub import wizard.
|
|
25
|
+
*
|
|
26
|
+
* Steps:
|
|
27
|
+
* 1. Choose import method (URL input or browse repos)
|
|
28
|
+
* 2a. If URL: prompt for URL, validate with parseGitHubUrl
|
|
29
|
+
* 2b. If browse: fetch repos via listUseCase, display select list
|
|
30
|
+
* 3. Optionally prompt for destination directory override
|
|
31
|
+
*
|
|
32
|
+
* @param gitHubService - Service for URL validation
|
|
33
|
+
* @param listUseCase - Use case for listing user repos
|
|
34
|
+
* @returns The selected import target and optional destination
|
|
35
|
+
*/
|
|
36
|
+
export async function githubImportWizard(gitHubService, listUseCase) {
|
|
37
|
+
// Step 1: Choose import method
|
|
38
|
+
const method = await select({
|
|
39
|
+
message: 'How would you like to add a GitHub repository?',
|
|
40
|
+
choices: [
|
|
41
|
+
{
|
|
42
|
+
name: 'Paste a GitHub URL',
|
|
43
|
+
value: 'url',
|
|
44
|
+
description: 'Enter a GitHub repository URL or owner/repo shorthand',
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Browse my repositories',
|
|
48
|
+
value: 'browse',
|
|
49
|
+
description: 'Search and select from your GitHub repositories',
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
theme: shepTheme,
|
|
53
|
+
});
|
|
54
|
+
let url;
|
|
55
|
+
if (method === 'url') {
|
|
56
|
+
url = await promptForUrl(gitHubService);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
url = await promptForBrowse(listUseCase);
|
|
60
|
+
}
|
|
61
|
+
// Step 3: Optional destination override
|
|
62
|
+
const dest = await promptForDestination();
|
|
63
|
+
const result = { url };
|
|
64
|
+
if (dest) {
|
|
65
|
+
result.dest = dest;
|
|
66
|
+
}
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Prompt the user for a GitHub URL and validate it.
|
|
71
|
+
* Re-prompts on invalid input until a valid URL is provided.
|
|
72
|
+
*/
|
|
73
|
+
async function promptForUrl(gitHubService) {
|
|
74
|
+
const url = await input({
|
|
75
|
+
message: 'Enter a GitHub repository URL or owner/repo',
|
|
76
|
+
validate: (value) => {
|
|
77
|
+
if (!value.trim()) {
|
|
78
|
+
return 'URL is required';
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
gitHubService.parseGitHubUrl(value.trim());
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
if (error instanceof GitHubUrlParseError) {
|
|
86
|
+
return error.message;
|
|
87
|
+
}
|
|
88
|
+
return 'Invalid GitHub URL format. Use https://github.com/owner/repo or owner/repo';
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
theme: shepTheme,
|
|
92
|
+
});
|
|
93
|
+
return url.trim();
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Prompt the user to browse and select from their GitHub repositories.
|
|
97
|
+
* Fetches repos via the list use case and displays them in a select prompt.
|
|
98
|
+
*/
|
|
99
|
+
async function promptForBrowse(listUseCase) {
|
|
100
|
+
const repos = await listUseCase.execute({ limit: 30 });
|
|
101
|
+
if (repos.length === 0) {
|
|
102
|
+
throw new Error('No repositories found. Make sure you have repositories on GitHub.');
|
|
103
|
+
}
|
|
104
|
+
const choices = repos.map(formatRepoChoice);
|
|
105
|
+
const selected = await select({
|
|
106
|
+
message: 'Select a repository to import',
|
|
107
|
+
choices,
|
|
108
|
+
theme: shepTheme,
|
|
109
|
+
});
|
|
110
|
+
return selected;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Optionally prompt for a custom clone destination directory.
|
|
114
|
+
*/
|
|
115
|
+
async function promptForDestination() {
|
|
116
|
+
const dest = await input({
|
|
117
|
+
message: 'Clone destination (leave empty for default)',
|
|
118
|
+
theme: shepTheme,
|
|
119
|
+
});
|
|
120
|
+
return dest.trim() || undefined;
|
|
121
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Repository } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
2
|
+
interface ImportGitHubRepositoryInput {
|
|
3
|
+
url: string;
|
|
4
|
+
dest?: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function importGitHubRepository(input: ImportGitHubRepositoryInput): Promise<{
|
|
7
|
+
repository?: Repository;
|
|
8
|
+
error?: string;
|
|
9
|
+
}>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=import-github-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"import-github-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/import-github-repository.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAOvE,UAAU,2BAA2B;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBtD"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
import { GitHubAuthError, GitHubUrlParseError, GitHubCloneError, } from '../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
|
|
4
|
+
export async function importGitHubRepository(input) {
|
|
5
|
+
const { url, dest } = input;
|
|
6
|
+
if (!url?.trim()) {
|
|
7
|
+
return { error: 'GitHub URL is required' };
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
const useCase = resolve('ImportGitHubRepositoryUseCase');
|
|
11
|
+
const repository = await useCase.execute({ url, dest });
|
|
12
|
+
return { repository };
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (error instanceof GitHubAuthError) {
|
|
16
|
+
return { error: 'GitHub CLI is not authenticated. Run `gh auth login` to sign in.' };
|
|
17
|
+
}
|
|
18
|
+
if (error instanceof GitHubUrlParseError) {
|
|
19
|
+
return { error: `Invalid GitHub URL: ${error.message}` };
|
|
20
|
+
}
|
|
21
|
+
if (error instanceof GitHubCloneError) {
|
|
22
|
+
return { error: `Clone failed: ${error.message}` };
|
|
23
|
+
}
|
|
24
|
+
const message = error instanceof Error ? error.message : 'Failed to import repository';
|
|
25
|
+
return { error: message };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GitHubRepo } from '../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
|
|
2
|
+
interface ListGitHubRepositoriesInput {
|
|
3
|
+
search?: string;
|
|
4
|
+
limit?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare function listGitHubRepositories(input?: ListGitHubRepositoriesInput): Promise<{
|
|
7
|
+
repos?: GitHubRepo[];
|
|
8
|
+
error?: string;
|
|
9
|
+
}>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=list-github-repositories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-github-repositories.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/list-github-repositories.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oFAAoF,CAAC;AAGrH,UAAU,2BAA2B;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,CAAC,EAAE,2BAA2B,GAClC,OAAO,CAAC;IAAE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAYnD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
import { GitHubAuthError } from '../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
|
|
4
|
+
export async function listGitHubRepositories(input) {
|
|
5
|
+
try {
|
|
6
|
+
const useCase = resolve('ListGitHubRepositoriesUseCase');
|
|
7
|
+
const repos = await useCase.execute(input);
|
|
8
|
+
return { repos };
|
|
9
|
+
}
|
|
10
|
+
catch (error) {
|
|
11
|
+
if (error instanceof GitHubAuthError) {
|
|
12
|
+
return { error: 'GitHub CLI is not authenticated. Run `gh auth login` to sign in.' };
|
|
13
|
+
}
|
|
14
|
+
const message = error instanceof Error ? error.message : 'Failed to list repositories';
|
|
15
|
+
return { error: message };
|
|
16
|
+
}
|
|
17
|
+
}
|
package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import type { Repository } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
2
|
+
export interface AddRepositoryButtonProps {
|
|
2
3
|
onSelect?: (path: string) => void;
|
|
4
|
+
onGitHubImport?: (repository: Repository) => void;
|
|
3
5
|
}
|
|
4
|
-
export declare function AddRepositoryButton({ onSelect }: AddRepositoryButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
5
|
-
export {};
|
|
6
|
+
export declare function AddRepositoryButton({ onSelect, onGitHubImport }: AddRepositoryButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
6
7
|
//# sourceMappingURL=add-repository-button.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-repository-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/add-repository-button/add-repository-button.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"add-repository-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/add-repository-button/add-repository-button.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAEvE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CACnD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,wBAAwB,2CA2FzF"}
|
package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.js
CHANGED
|
@@ -1,13 +1,20 @@
|
|
|
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 { useState } from 'react';
|
|
4
|
-
import { FolderPlus, Loader2 } from 'lucide-react';
|
|
4
|
+
import { FolderPlus, Github, Loader2, Plus } from 'lucide-react';
|
|
5
5
|
import { Button } from '../../ui/button.js';
|
|
6
6
|
import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
|
|
7
|
+
import { Popover, PopoverContent, PopoverTrigger } from '../../ui/popover.js';
|
|
8
|
+
import { GitHubImportDialog } from '../../common/github-import-dialog/index.js';
|
|
7
9
|
import { pickFolder } from './pick-folder.js';
|
|
8
|
-
|
|
10
|
+
import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
|
|
11
|
+
export function AddRepositoryButton({ onSelect, onGitHubImport }) {
|
|
12
|
+
const featureFlags = useFeatureFlags();
|
|
9
13
|
const [loading, setLoading] = useState(false);
|
|
10
|
-
|
|
14
|
+
const [popoverOpen, setPopoverOpen] = useState(false);
|
|
15
|
+
const [githubDialogOpen, setGithubDialogOpen] = useState(false);
|
|
16
|
+
async function handleLocalFolder() {
|
|
17
|
+
setPopoverOpen(false);
|
|
11
18
|
if (loading)
|
|
12
19
|
return;
|
|
13
20
|
setLoading(true);
|
|
@@ -21,5 +28,15 @@ export function AddRepositoryButton({ onSelect }) {
|
|
|
21
28
|
setLoading(false);
|
|
22
29
|
}
|
|
23
30
|
}
|
|
24
|
-
|
|
31
|
+
function handleFromGitHub() {
|
|
32
|
+
setPopoverOpen(false);
|
|
33
|
+
setGithubDialogOpen(true);
|
|
34
|
+
}
|
|
35
|
+
function handleImportComplete(repository) {
|
|
36
|
+
onGitHubImport?.(repository);
|
|
37
|
+
if (repository.path) {
|
|
38
|
+
onSelect?.(repository.path);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Popover, { open: popoverOpen, onOpenChange: setPopoverOpen, children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Add Repository", "data-testid": "add-repository-button", disabled: loading, children: loading ? (_jsx(Loader2, { className: "h-5 w-5 animate-spin" })) : (_jsx(Plus, { className: "h-5 w-5" })) }) }) }), _jsx(TooltipContent, { children: "Add Repository" })] }) }), _jsxs(PopoverContent, { className: "w-48 p-1", align: "start", children: [_jsxs("button", { type: "button", className: "hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm", onClick: handleLocalFolder, "data-testid": "add-repo-local-folder", children: [_jsx(FolderPlus, { className: "h-4 w-4" }), "Local folder"] }), featureFlags.githubImport ? (_jsxs("button", { type: "button", className: "hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm", onClick: handleFromGitHub, "data-testid": "add-repo-from-github", children: [_jsx(Github, { className: "h-4 w-4" }), "From GitHub"] })) : null] })] }), featureFlags.githubImport ? (_jsx(GitHubImportDialog, { open: githubDialogOpen, onOpenChange: setGithubDialogOpen, onImportComplete: handleImportComplete })) : null] }));
|
|
25
42
|
}
|
package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Repository } from '../../../../../../packages/core/src/domain/generated/output.js';
|
|
2
|
+
export interface GitHubImportDialogProps {
|
|
3
|
+
open: boolean;
|
|
4
|
+
onOpenChange: (open: boolean) => void;
|
|
5
|
+
onImportComplete: (repository: Repository) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function GitHubImportDialog({ open, onOpenChange, onImportComplete, }: GitHubImportDialogProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=github-import-dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-import-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-import-dialog.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAEvE,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,gBAAgB,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CACpD;AAED,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,YAAY,EACZ,gBAAgB,GACjB,EAAE,uBAAuB,2CAqDzB"}
|
package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '../../ui/dialog.js';
|
|
5
|
+
import { Tabs, TabsContent, TabsList, TabsTrigger } from '../../ui/tabs.js';
|
|
6
|
+
import { GitHubUrlInput } from './github-url-input.js';
|
|
7
|
+
import { GitHubRepoBrowser } from './github-repo-browser.js';
|
|
8
|
+
import { importGitHubRepository } from '../../../app/actions/import-github-repository.js';
|
|
9
|
+
export function GitHubImportDialog({ open, onOpenChange, onImportComplete, }) {
|
|
10
|
+
const [importing, setImporting] = useState(false);
|
|
11
|
+
const [error, setError] = useState('');
|
|
12
|
+
async function handleImport(url) {
|
|
13
|
+
setImporting(true);
|
|
14
|
+
setError('');
|
|
15
|
+
try {
|
|
16
|
+
const result = await importGitHubRepository({ url });
|
|
17
|
+
if (result.error) {
|
|
18
|
+
setError(result.error);
|
|
19
|
+
}
|
|
20
|
+
else if (result.repository) {
|
|
21
|
+
onImportComplete(result.repository);
|
|
22
|
+
onOpenChange(false);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
setError('An unexpected error occurred');
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
setImporting(false);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "overflow-hidden sm:max-w-lg", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Import from GitHub" }), _jsx(DialogDescription, { children: "Clone a GitHub repository and add it to Shep." })] }), _jsxs(Tabs, { defaultValue: "url", className: "min-w-0", children: [_jsxs(TabsList, { className: "grid w-full grid-cols-2", children: [_jsx(TabsTrigger, { value: "url", children: "URL" }), _jsx(TabsTrigger, { value: "browse", children: "Browse" })] }), _jsx(TabsContent, { value: "url", className: "mt-4", children: _jsx(GitHubUrlInput, { onSubmit: handleImport, loading: importing }) }), _jsx(TabsContent, { value: "browse", className: "mt-4", children: _jsx(GitHubRepoBrowser, { onSelect: handleImport, loading: importing }) })] }), error ? (_jsx("p", { className: "text-destructive text-sm", role: "alert", children: error })) : null] }) }));
|
|
33
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { GitHubImportDialog } from './github-import-dialog.js';
|
|
3
|
+
declare const meta: Meta<typeof GitHubImportDialog>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof GitHubImportDialog>;
|
|
6
|
+
export declare const Default: Story;
|
|
7
|
+
export declare const URLTab: Story;
|
|
8
|
+
export declare const BrowseTab: Story;
|
|
9
|
+
export declare const Loading: Story;
|
|
10
|
+
//# sourceMappingURL=github-import-dialog.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-import-dialog.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,kBAAkB,CAYzC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjD,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,MAAM,EAAE,KAEpB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { fn } from '@storybook/test';
|
|
2
|
+
import { GitHubImportDialog } from './github-import-dialog.js';
|
|
3
|
+
const meta = {
|
|
4
|
+
title: 'Composed/GitHubImportDialog',
|
|
5
|
+
component: GitHubImportDialog,
|
|
6
|
+
tags: ['autodocs'],
|
|
7
|
+
parameters: {
|
|
8
|
+
layout: 'centered',
|
|
9
|
+
},
|
|
10
|
+
args: {
|
|
11
|
+
open: true,
|
|
12
|
+
onOpenChange: fn().mockName('onOpenChange'),
|
|
13
|
+
onImportComplete: fn().mockName('onImportComplete'),
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
export default meta;
|
|
17
|
+
export const Default = {};
|
|
18
|
+
export const URLTab = {
|
|
19
|
+
// Default tab is URL, so this is the same as Default
|
|
20
|
+
};
|
|
21
|
+
export const BrowseTab = {
|
|
22
|
+
// User clicks Browse tab to see repo list
|
|
23
|
+
};
|
|
24
|
+
export const Loading = {
|
|
25
|
+
// Loading state happens during import — interact with the story to see it
|
|
26
|
+
};
|
package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { GitHubRepo } from '../../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
|
|
2
|
+
export interface GitHubRepoBrowserProps {
|
|
3
|
+
onSelect: (nameWithOwner: string) => void;
|
|
4
|
+
loading?: boolean;
|
|
5
|
+
/** Override the fetch function for testing/stories */
|
|
6
|
+
fetchRepos?: (input?: {
|
|
7
|
+
search?: string;
|
|
8
|
+
limit?: number;
|
|
9
|
+
}) => Promise<{
|
|
10
|
+
repos?: GitHubRepo[];
|
|
11
|
+
error?: string;
|
|
12
|
+
}>;
|
|
13
|
+
}
|
|
14
|
+
export declare function GitHubRepoBrowser({ onSelect, loading: externalLoading, fetchRepos, }: GitHubRepoBrowserProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
//# sourceMappingURL=github-repo-browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-repo-browser.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-repo-browser.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oFAAoF,CAAC;AAErH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzD;AAED,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,OAAO,EAAE,eAAuB,EAChC,UAAmC,GACpC,EAAE,sBAAsB,2CAsIxB"}
|
package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
4
|
+
import { Lock, Globe, Loader2, Search, AlertCircle } from 'lucide-react';
|
|
5
|
+
import { Input } from '../../ui/input.js';
|
|
6
|
+
import { Badge } from '../../ui/badge.js';
|
|
7
|
+
import { Skeleton } from '../../ui/skeleton.js';
|
|
8
|
+
import { listGitHubRepositories } from '../../../app/actions/list-github-repositories.js';
|
|
9
|
+
export function GitHubRepoBrowser({ onSelect, loading: externalLoading = false, fetchRepos = listGitHubRepositories, }) {
|
|
10
|
+
const [repos, setRepos] = useState([]);
|
|
11
|
+
const [fetching, setFetching] = useState(true);
|
|
12
|
+
const [error, setError] = useState('');
|
|
13
|
+
const [search, setSearch] = useState('');
|
|
14
|
+
const debounceRef = useRef(null);
|
|
15
|
+
const fetchData = useCallback(async (searchTerm) => {
|
|
16
|
+
setFetching(true);
|
|
17
|
+
setError('');
|
|
18
|
+
try {
|
|
19
|
+
const result = await fetchRepos(searchTerm ? { search: searchTerm } : undefined);
|
|
20
|
+
if (result.error) {
|
|
21
|
+
setError(result.error);
|
|
22
|
+
setRepos([]);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
setRepos(result.repos ?? []);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
setError('Failed to fetch repositories');
|
|
30
|
+
setRepos([]);
|
|
31
|
+
}
|
|
32
|
+
finally {
|
|
33
|
+
setFetching(false);
|
|
34
|
+
}
|
|
35
|
+
}, [fetchRepos]);
|
|
36
|
+
useEffect(() => {
|
|
37
|
+
fetchData();
|
|
38
|
+
}, [fetchData]);
|
|
39
|
+
function handleSearchChange(value) {
|
|
40
|
+
setSearch(value);
|
|
41
|
+
if (debounceRef.current)
|
|
42
|
+
clearTimeout(debounceRef.current);
|
|
43
|
+
debounceRef.current = setTimeout(() => {
|
|
44
|
+
fetchData(value || undefined);
|
|
45
|
+
}, 300);
|
|
46
|
+
}
|
|
47
|
+
const disabled = externalLoading;
|
|
48
|
+
if (error && !fetching) {
|
|
49
|
+
return (_jsxs("div", { className: "flex flex-col items-center gap-2 py-8 text-center", "data-testid": "repo-browser-error", children: [_jsx(AlertCircle, { className: "text-destructive h-8 w-8" }), _jsx("p", { className: "text-destructive text-sm", children: error })] }));
|
|
50
|
+
}
|
|
51
|
+
return (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2" }), _jsx(Input, { placeholder: "Search repositories...", value: search, onChange: (e) => handleSearchChange(e.target.value), className: "pl-9", disabled: disabled, "aria-label": "Search repositories" })] }), _jsx("div", { className: "max-h-64 overflow-x-hidden overflow-y-auto rounded-md border", role: "listbox", "aria-label": "GitHub repositories", children: fetching ? (_jsx("div", { className: "flex flex-col gap-2 p-3", "data-testid": "repo-browser-loading", children: Array.from({ length: 5 }).map((_, i) => (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(Skeleton, { className: "h-4 w-48" }), _jsx(Skeleton, { className: "h-3 w-72" })] }, `skeleton-${String(i)}`))) })) : repos.length === 0 ? (_jsx("div", { className: "text-muted-foreground py-8 text-center text-sm", "data-testid": "repo-browser-empty", children: "No repositories found" })) : (repos.map((repo) => (_jsxs("button", { type: "button", role: "option", "aria-selected": false, className: "hover:bg-accent flex w-full items-start gap-2 border-b px-3 py-2.5 text-left last:border-b-0 disabled:opacity-50", onClick: () => onSelect(repo.nameWithOwner), disabled: disabled, children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "truncate text-sm font-medium", children: repo.nameWithOwner }), _jsx(Badge, { variant: repo.isPrivate ? 'secondary' : 'outline', className: "shrink-0 text-xs", children: repo.isPrivate ? (_jsxs(_Fragment, { children: [_jsx(Lock, { className: "mr-1 h-3 w-3" }), "Private"] })) : (_jsxs(_Fragment, { children: [_jsx(Globe, { className: "mr-1 h-3 w-3" }), "Public"] })) })] }), repo.description ? (_jsx("p", { className: "text-muted-foreground mt-0.5 truncate text-xs", children: repo.description })) : null] }), disabled ? _jsx(Loader2, { className: "mt-0.5 h-4 w-4 shrink-0 animate-spin" }) : null] }, repo.nameWithOwner)))) })] }));
|
|
52
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react';
|
|
2
|
+
import { GitHubRepoBrowser } from './github-repo-browser.js';
|
|
3
|
+
declare const meta: Meta<typeof GitHubRepoBrowser>;
|
|
4
|
+
export default meta;
|
|
5
|
+
type Story = StoryObj<typeof GitHubRepoBrowser>;
|
|
6
|
+
export declare const Default: Story;
|
|
7
|
+
export declare const Loading: Story;
|
|
8
|
+
export declare const Empty: Story;
|
|
9
|
+
export declare const Error: Story;
|
|
10
|
+
//# sourceMappingURL=github-repo-browser.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-repo-browser.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAyC1D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,iBAAiB,CAiBxC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEhD,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAOnB,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { fn } from '@storybook/test';
|
|
3
|
+
import { GitHubRepoBrowser } from './github-repo-browser.js';
|
|
4
|
+
const mockRepos = [
|
|
5
|
+
{
|
|
6
|
+
name: 'awesome-app',
|
|
7
|
+
nameWithOwner: 'octocat/awesome-app',
|
|
8
|
+
description: 'An awesome application built with React and TypeScript',
|
|
9
|
+
isPrivate: false,
|
|
10
|
+
pushedAt: '2025-03-15T10:00:00Z',
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
name: 'secret-project',
|
|
14
|
+
nameWithOwner: 'octocat/secret-project',
|
|
15
|
+
description: 'Top secret private repository',
|
|
16
|
+
isPrivate: true,
|
|
17
|
+
pushedAt: '2025-03-14T08:00:00Z',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: 'open-source-lib',
|
|
21
|
+
nameWithOwner: 'octocat/open-source-lib',
|
|
22
|
+
description: 'A reusable open-source library for everyone',
|
|
23
|
+
isPrivate: false,
|
|
24
|
+
pushedAt: '2025-03-13T15:30:00Z',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'private-infra',
|
|
28
|
+
nameWithOwner: 'octocat/private-infra',
|
|
29
|
+
description: '',
|
|
30
|
+
isPrivate: true,
|
|
31
|
+
pushedAt: '2025-03-12T12:00:00Z',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'docs-site',
|
|
35
|
+
nameWithOwner: 'octocat/docs-site',
|
|
36
|
+
description: 'Documentation website powered by Next.js',
|
|
37
|
+
isPrivate: false,
|
|
38
|
+
pushedAt: '2025-03-11T09:00:00Z',
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
const meta = {
|
|
42
|
+
title: 'Composed/GitHubRepoBrowser',
|
|
43
|
+
component: GitHubRepoBrowser,
|
|
44
|
+
tags: ['autodocs'],
|
|
45
|
+
parameters: {
|
|
46
|
+
layout: 'centered',
|
|
47
|
+
},
|
|
48
|
+
args: {
|
|
49
|
+
onSelect: fn().mockName('onSelect'),
|
|
50
|
+
},
|
|
51
|
+
decorators: [
|
|
52
|
+
(Story) => (_jsx("div", { style: { width: 480 }, children: _jsx(Story, {}) })),
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
export default meta;
|
|
56
|
+
export const Default = {
|
|
57
|
+
args: {
|
|
58
|
+
fetchRepos: () => Promise.resolve({ repos: mockRepos }),
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
export const Loading = {
|
|
62
|
+
args: {
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
64
|
+
fetchRepos: () => new Promise(() => { }), // never resolves
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
export const Empty = {
|
|
68
|
+
args: {
|
|
69
|
+
fetchRepos: () => Promise.resolve({ repos: [] }),
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
export const Error = {
|
|
73
|
+
args: {
|
|
74
|
+
fetchRepos: () => Promise.resolve({
|
|
75
|
+
error: 'GitHub CLI is not authenticated. Run `gh auth login` to sign in.',
|
|
76
|
+
}),
|
|
77
|
+
},
|
|
78
|
+
};
|
package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function isValidGitHubUrl(url: string): boolean;
|
|
2
|
+
export interface GitHubUrlInputProps {
|
|
3
|
+
onSubmit: (url: string) => void;
|
|
4
|
+
loading?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function GitHubUrlInput({ onSubmit, loading }: GitHubUrlInputProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
//# sourceMappingURL=github-url-input.d.ts.map
|
package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-url-input.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-url-input.tsx"],"names":[],"mappings":"AAkBA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,OAAe,EAAE,EAAE,mBAAmB,2CAqDhF"}
|