@shepai/cli 1.161.0 → 1.162.0-pr506.4839064
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +20 -0
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -1
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.d.ts +13 -0
- package/dist/packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.js +35 -0
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +5 -0
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +20 -0
- package/dist/src/presentation/cli/commands/repo/add.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/repo/add.command.js +3 -1
- package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts +5 -2
- package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts.map +1 -1
- package/dist/src/presentation/tui/wizards/github-import.wizard.js +38 -6
- package/dist/src/presentation/web/app/actions/list-github-organizations.d.ts +6 -0
- package/dist/src/presentation/web/app/actions/list-github-organizations.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/list-github-organizations.js +17 -0
- package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts +1 -0
- package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts +8 -1
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js +37 -7
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts +1 -0
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.js +35 -0
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
- package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +1 -4
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/web/.next/BUILD_ID +1 -1
- package/web/.next/build-manifest.json +2 -2
- package/web/.next/fallback-build-manifest.json +2 -2
- package/web/.next/prerender-manifest.json +3 -3
- package/web/.next/required-server-files.js +3 -3
- package/web/.next/required-server-files.json +3 -3
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +71 -56
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +73 -58
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +87 -72
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +87 -72
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/chat/page.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +73 -58
- package/web/.next/server/app/(dashboard)/create/page.js +1 -1
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +87 -72
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +87 -72
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/page.js +1 -1
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +25 -10
- 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/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +31 -16
- package/web/.next/server/app/settings/page.js +1 -1
- 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 +35 -20
- package/web/.next/server/app/skills/page.js +1 -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 +35 -20
- package/web/.next/server/app/tools/page.js +1 -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 +25 -10
- package/web/.next/server/app/version/page.js +1 -1
- package/web/.next/server/app/version/page.js.nft.json +1 -1
- package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__512b2c98._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__512b2c98._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bde2d922._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bde2d922._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c7691da2._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c7691da2._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e5ceba65._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__e5ceba65._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f1048f45._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__f1048f45._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
- package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_9495d50b._.js → _0727935d._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_9495d50b._.js.map → _0727935d._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_075fae20._.js +4 -0
- package/web/.next/server/chunks/ssr/_075fae20._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_18a3b7f5._.js → _0fc83881._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_18a3b7f5._.js.map → _0fc83881._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_125c55af._.js +4 -0
- package/web/.next/server/chunks/ssr/_125c55af._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_22e00a14._.js +4 -0
- package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_289a182a._.js +3 -0
- package/web/.next/server/chunks/ssr/_289a182a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
- package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_628621c7._.js +4 -0
- package/web/.next/server/chunks/ssr/_628621c7._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_68996e5b._.js +3 -0
- package/web/.next/server/chunks/ssr/_68996e5b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_3f23f48f._.js → _71ba6039._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_3f23f48f._.js.map → _71ba6039._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_9412b27f._.js +4 -0
- package/web/.next/server/chunks/ssr/_9412b27f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_a5a5901d._.js +4 -0
- package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
- package/web/.next/server/chunks/ssr/_c3f595c6._.js +4 -0
- package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_1c309165._.js → _ce97386b._.js} +2 -2
- package/web/.next/server/chunks/ssr/_ce97386b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js +6 -0
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_f33cd07e._.js +6 -0
- package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_f8b45233._.js +4 -0
- package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -0
- 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/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js.map +1 -0
- 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 +636 -495
- package/web/.next/static/chunks/045afc2f5599f55e.js +7 -0
- package/web/.next/static/chunks/{c7b37a688ea97611.js → 0b25e132c6474df2.js} +1 -1
- package/web/.next/static/chunks/{9555d8a511c05bd5.js → 35ec31863fa35a53.js} +1 -1
- package/web/.next/static/chunks/{c304db8f1d27505a.js → 430ebb233af04232.js} +2 -2
- package/web/.next/static/chunks/50a500c1cc2dee74.js +1 -0
- package/web/.next/static/chunks/{b5155ee03ad70945.js → 63f6860c64adac54.js} +1 -1
- package/web/.next/static/chunks/6b7c8cc4aaebde67.js +1 -0
- package/web/.next/static/chunks/{990b5a6eb6b8dedb.js → 6dfd3331ed16c17a.js} +1 -1
- package/web/.next/static/chunks/9059af01c4765dae.js +1 -0
- package/web/.next/static/chunks/{328e534d335ef687.js → b84a4b22a24e32e5.js} +1 -1
- package/web/.next/static/chunks/c3a67566f78b5bc3.js +1 -0
- package/web/.next/static/chunks/{496df1d4a9c9d83c.js → d98bc2adcbbf962b.js} +2 -2
- package/web/.next/static/chunks/e4f58183caab77d8.js +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ee0eaaf9._.js +0 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ee0eaaf9._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_1c309165._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_3a0b989f._.js +0 -6
- package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_3c638d2f._.js +0 -3
- package/web/.next/server/chunks/ssr/_3c638d2f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_5f69c13f._.js +0 -4
- package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_7c5b97c6._.js +0 -4
- package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_82c57f10._.js +0 -4
- package/web/.next/server/chunks/ssr/_82c57f10._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +0 -4
- package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +0 -4
- package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_cb5a021e._.js +0 -4
- package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_d86175ae._.js +0 -4
- package/web/.next/server/chunks/ssr/_d86175ae._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_d8bedf13._.js +0 -4
- package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_d90b0a06._.js +0 -3
- package/web/.next/server/chunks/ssr/_d90b0a06._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_fa7efce3._.js +0 -6
- package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +0 -1
- package/web/.next/static/chunks/076eaf8a817b5284.js +0 -7
- package/web/.next/static/chunks/3ee176daee98f78c.js +0 -1
- package/web/.next/static/chunks/419f55272dedf3b3.js +0 -1
- package/web/.next/static/chunks/4864ff06a738d58b.js +0 -1
- package/web/.next/static/chunks/6d60df4b3071af3b.js +0 -1
- package/web/.next/static/chunks/e523ab79dcc7f132.js +0 -1
- /package/web/.next/static/{kYE1v6B90r_hNugkL9Zh- → Nr75BQmqg1jHaq9Qff_Wk}/_buildManifest.js +0 -0
- /package/web/.next/static/{kYE1v6B90r_hNugkL9Zh- → Nr75BQmqg1jHaq9Qff_Wk}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{kYE1v6B90r_hNugkL9Zh- → Nr75BQmqg1jHaq9Qff_Wk}/_ssgManifest.js +0 -0
|
@@ -58,6 +58,17 @@ export interface ListUserRepositoriesOptions {
|
|
|
58
58
|
limit?: number;
|
|
59
59
|
/** Filter repos by name substring */
|
|
60
60
|
search?: string;
|
|
61
|
+
/** Owner (user or organization) to list repos for. Omit for the authenticated user's repos. */
|
|
62
|
+
owner?: string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* A GitHub organization the authenticated user belongs to.
|
|
66
|
+
*/
|
|
67
|
+
export interface GitHubOrganization {
|
|
68
|
+
/** Organization login handle (e.g. "my-org") */
|
|
69
|
+
login: string;
|
|
70
|
+
/** Organization description (may be empty string) */
|
|
71
|
+
description: string;
|
|
61
72
|
}
|
|
62
73
|
/**
|
|
63
74
|
* Options for cloning a repository.
|
|
@@ -101,11 +112,20 @@ export interface IGitHubRepositoryService {
|
|
|
101
112
|
/**
|
|
102
113
|
* List the authenticated user's GitHub repositories.
|
|
103
114
|
*
|
|
115
|
+
* When `options.owner` is provided, lists repositories for that user or organization instead.
|
|
116
|
+
*
|
|
104
117
|
* @param options - Optional filtering and pagination
|
|
105
118
|
* @returns Array of GitHub repositories sorted by most recently pushed
|
|
106
119
|
* @throws {GitHubRepoListError} if the list operation fails
|
|
107
120
|
*/
|
|
108
121
|
listUserRepositories(options?: ListUserRepositoriesOptions): Promise<GitHubRepo[]>;
|
|
122
|
+
/**
|
|
123
|
+
* List organizations the authenticated user belongs to.
|
|
124
|
+
*
|
|
125
|
+
* @returns Array of GitHub organizations
|
|
126
|
+
* @throws {GitHubRepoListError} if the list operation fails
|
|
127
|
+
*/
|
|
128
|
+
listOrganizations(): Promise<GitHubOrganization[]>;
|
|
109
129
|
/**
|
|
110
130
|
* Parse a GitHub URL or shorthand into its owner/repo components.
|
|
111
131
|
*
|
|
@@ -1 +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;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,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;
|
|
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;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,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;IAChB,+FAA+F;IAC/F,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB;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;;;;;;;;OAQG;IACH,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEnF;;;;;OAKG;IACH,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEnD;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC;IAE7C;;;;;;;;;OASG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACxD"}
|
|
@@ -17,7 +17,7 @@ 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';
|
|
20
|
+
export type { IGitHubRepositoryService, GitHubRepo, GitHubOrganization, ListUserRepositoriesOptions, CloneOptions, ParsedGitHubUrl, } from './github-repository-service.interface.js';
|
|
21
21
|
export { GitHubAuthError, GitHubCloneError, GitHubUrlParseError, GitHubRepoListError, } from './github-repository-service.interface.js';
|
|
22
22
|
export type { IInteractiveSessionService, StreamChunk, UnsubscribeFn, ChatState, } from './interactive-session-service.interface.js';
|
|
23
23
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EACV,wBAAwB,EACxB,UAAU,EACV,2BAA2B,EAC3B,YAAY,EACZ,eAAe,GAChB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,0BAA0B,EAC1B,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,4CAA4C,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EACV,wBAAwB,EACxB,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,YAAY,EACZ,eAAe,GAChB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,0BAA0B,EAC1B,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,4CAA4C,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List GitHub Organizations Use Case
|
|
3
|
+
*
|
|
4
|
+
* Checks GitHub CLI auth, then fetches the organizations the authenticated user belongs to.
|
|
5
|
+
* Decouples presentation from the IGitHubRepositoryService infrastructure.
|
|
6
|
+
*/
|
|
7
|
+
import type { IGitHubRepositoryService, GitHubOrganization } from '../../ports/output/services/github-repository-service.interface.js';
|
|
8
|
+
export declare class ListGitHubOrganizationsUseCase {
|
|
9
|
+
private readonly gitHubService;
|
|
10
|
+
constructor(gitHubService: IGitHubRepositoryService);
|
|
11
|
+
execute(): Promise<GitHubOrganization[]>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=list-github-organizations.use-case.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-github-organizations.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,wBAAwB,EACxB,kBAAkB,EACnB,MAAM,oEAAoE,CAAC;AAE5E,qBACa,8BAA8B;IAGvC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,wBAAwB;IAGpD,OAAO,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;CAI/C"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* List GitHub Organizations Use Case
|
|
3
|
+
*
|
|
4
|
+
* Checks GitHub CLI auth, then fetches the organizations the authenticated user belongs to.
|
|
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 ListGitHubOrganizationsUseCase = class ListGitHubOrganizationsUseCase {
|
|
21
|
+
gitHubService;
|
|
22
|
+
constructor(gitHubService) {
|
|
23
|
+
this.gitHubService = gitHubService;
|
|
24
|
+
}
|
|
25
|
+
async execute() {
|
|
26
|
+
await this.gitHubService.checkAuth();
|
|
27
|
+
return this.gitHubService.listOrganizations();
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
ListGitHubOrganizationsUseCase = __decorate([
|
|
31
|
+
injectable(),
|
|
32
|
+
__param(0, inject('IGitHubRepositoryService')),
|
|
33
|
+
__metadata("design:paramtypes", [Object])
|
|
34
|
+
], ListGitHubOrganizationsUseCase);
|
|
35
|
+
export { ListGitHubOrganizationsUseCase };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAmJrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAgbrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -81,6 +81,7 @@ import { ListRepositoriesUseCase } from '../../application/use-cases/repositorie
|
|
|
81
81
|
import { DeleteRepositoryUseCase } from '../../application/use-cases/repositories/delete-repository.use-case.js';
|
|
82
82
|
import { ImportGitHubRepositoryUseCase } from '../../application/use-cases/repositories/import-github-repository.use-case.js';
|
|
83
83
|
import { ListGitHubRepositoriesUseCase } from '../../application/use-cases/repositories/list-github-repositories.use-case.js';
|
|
84
|
+
import { ListGitHubOrganizationsUseCase } from '../../application/use-cases/repositories/list-github-organizations.use-case.js';
|
|
84
85
|
import { CheckAndUnblockFeaturesUseCase } from '../../application/use-cases/features/check-and-unblock-features.use-case.js';
|
|
85
86
|
import { UpdateFeatureLifecycleUseCase } from '../../application/use-cases/features/update/update-feature-lifecycle.use-case.js';
|
|
86
87
|
import { CleanupFeatureWorktreeUseCase } from '../../application/use-cases/features/cleanup-feature-worktree.use-case.js';
|
|
@@ -318,6 +319,7 @@ export async function initializeContainer() {
|
|
|
318
319
|
container.registerSingleton(DeleteRepositoryUseCase);
|
|
319
320
|
container.registerSingleton(ImportGitHubRepositoryUseCase);
|
|
320
321
|
container.registerSingleton(ListGitHubRepositoriesUseCase);
|
|
322
|
+
container.registerSingleton(ListGitHubOrganizationsUseCase);
|
|
321
323
|
// CheckAndUnblockFeaturesUseCase must be registered before UpdateFeatureLifecycleUseCase
|
|
322
324
|
// because the latter injects the former via class token.
|
|
323
325
|
container.registerSingleton(CheckAndUnblockFeaturesUseCase);
|
|
@@ -415,6 +417,9 @@ export async function initializeContainer() {
|
|
|
415
417
|
container.register('ListGitHubRepositoriesUseCase', {
|
|
416
418
|
useFactory: (c) => c.resolve(ListGitHubRepositoriesUseCase),
|
|
417
419
|
});
|
|
420
|
+
container.register('ListGitHubOrganizationsUseCase', {
|
|
421
|
+
useFactory: (c) => c.resolve(ListGitHubOrganizationsUseCase),
|
|
422
|
+
});
|
|
418
423
|
container.register('CheckAndUnblockFeaturesUseCase', {
|
|
419
424
|
useFactory: (c) => c.resolve(CheckAndUnblockFeaturesUseCase),
|
|
420
425
|
});
|
package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts
CHANGED
|
@@ -5,12 +5,13 @@
|
|
|
5
5
|
* checks, repository listing, cloning (with progress streaming), and URL parsing.
|
|
6
6
|
*/
|
|
7
7
|
import type { ExecFunction } from '../git/worktree.service.js';
|
|
8
|
-
import type { IGitHubRepositoryService, GitHubRepo, ListUserRepositoriesOptions, CloneOptions, ParsedGitHubUrl } from '../../../application/ports/output/services/github-repository-service.interface.js';
|
|
8
|
+
import type { IGitHubRepositoryService, GitHubRepo, GitHubOrganization, ListUserRepositoriesOptions, CloneOptions, ParsedGitHubUrl } from '../../../application/ports/output/services/github-repository-service.interface.js';
|
|
9
9
|
export declare class GitHubRepositoryService implements IGitHubRepositoryService {
|
|
10
10
|
private readonly execFile;
|
|
11
11
|
constructor(execFile: ExecFunction);
|
|
12
12
|
checkAuth(): Promise<void>;
|
|
13
13
|
listUserRepositories(options?: ListUserRepositoriesOptions): Promise<GitHubRepo[]>;
|
|
14
|
+
listOrganizations(): Promise<GitHubOrganization[]>;
|
|
14
15
|
cloneRepository(nameWithOwner: string, destination: string, options?: CloneOptions): Promise<void>;
|
|
15
16
|
parseGitHubUrl(url: string): ParsedGitHubUrl;
|
|
16
17
|
getViewerPermission(repoPath: string): Promise<string>;
|
package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-repository.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/external/github-repository.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EACV,wBAAwB,EACxB,UAAU,EACV,2BAA2B,EAC3B,YAAY,EACZ,eAAe,EAChB,MAAM,mFAAmF,CAAC;AAyB3F,qBACa,uBAAwB,YAAW,wBAAwB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB1B,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"github-repository.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/external/github-repository.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EACV,wBAAwB,EACxB,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,YAAY,EACZ,eAAe,EAChB,MAAM,mFAAmF,CAAC;AAyB3F,qBACa,uBAAwB,YAAW,wBAAwB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB1B,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAuClF,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA2BlD,eAAe,CACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,IAAI,CAAC;IAgDhB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;IA2CtC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAyB9C,mBAAmB;CAOlC"}
|
package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js
CHANGED
|
@@ -59,6 +59,7 @@ let GitHubRepositoryService = class GitHubRepositoryService {
|
|
|
59
59
|
const args = [
|
|
60
60
|
'repo',
|
|
61
61
|
'list',
|
|
62
|
+
...(options?.owner ? [options.owner] : []),
|
|
62
63
|
'--json',
|
|
63
64
|
'name,nameWithOwner,description,isPrivate,pushedAt',
|
|
64
65
|
'--limit',
|
|
@@ -82,6 +83,25 @@ let GitHubRepositoryService = class GitHubRepositoryService {
|
|
|
82
83
|
throw new GitHubRepoListError(`Failed to list GitHub repositories: ${cause?.message ?? String(error)}`, cause);
|
|
83
84
|
}
|
|
84
85
|
}
|
|
86
|
+
async listOrganizations() {
|
|
87
|
+
try {
|
|
88
|
+
const { stdout } = await this.execFile('gh', [
|
|
89
|
+
'api',
|
|
90
|
+
'/user/orgs',
|
|
91
|
+
'--jq',
|
|
92
|
+
'[.[] | {login: .login, description: (.description // "")}]',
|
|
93
|
+
]);
|
|
94
|
+
return JSON.parse(stdout);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
const cause = error instanceof Error ? error : undefined;
|
|
98
|
+
const errnoCode = error?.code;
|
|
99
|
+
if (errnoCode === 'ENOENT') {
|
|
100
|
+
throw new GitHubRepoListError('GitHub CLI (gh) is not installed. Install it from https://cli.github.com/', cause);
|
|
101
|
+
}
|
|
102
|
+
throw new GitHubRepoListError(`Failed to list GitHub organizations: ${cause?.message ?? String(error)}`, cause);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
85
105
|
async cloneRepository(nameWithOwner, destination, options) {
|
|
86
106
|
// Validate destination path — reject path traversal
|
|
87
107
|
const resolved = resolve(destination);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/repo/add.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"add.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/repo/add.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,gBAAgB,IAAI,OAAO,CA8E1C"}
|
|
@@ -13,6 +13,7 @@ import { container } from '../../../../../packages/core/src/infrastructure/di/co
|
|
|
13
13
|
import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
|
|
14
14
|
import { ImportGitHubRepositoryUseCase } from '../../../../../packages/core/src/application/use-cases/repositories/import-github-repository.use-case.js';
|
|
15
15
|
import { ListGitHubRepositoriesUseCase } from '../../../../../packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.js';
|
|
16
|
+
import { ListGitHubOrganizationsUseCase } from '../../../../../packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.js';
|
|
16
17
|
import { GitHubAuthError, GitHubCloneError, GitHubUrlParseError, } from '../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
|
|
17
18
|
import { messages } from '../../ui/index.js';
|
|
18
19
|
import { githubImportWizard } from '../../../tui/wizards/github-import.wizard.js';
|
|
@@ -35,7 +36,8 @@ export function createAddCommand() {
|
|
|
35
36
|
// Interactive wizard
|
|
36
37
|
const gitHubService = container.resolve('IGitHubRepositoryService');
|
|
37
38
|
const listUseCase = container.resolve(ListGitHubRepositoriesUseCase);
|
|
38
|
-
const
|
|
39
|
+
const listOrgsUseCase = container.resolve(ListGitHubOrganizationsUseCase);
|
|
40
|
+
const wizardResult = await githubImportWizard(gitHubService, listUseCase, listOrgsUseCase);
|
|
39
41
|
url = wizardResult.url;
|
|
40
42
|
if (!dest && wizardResult.dest) {
|
|
41
43
|
dest = wizardResult.dest;
|
|
@@ -3,10 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Interactive TUI wizard that guides users through importing a GitHub repository.
|
|
5
5
|
* Offers two paths: paste a GitHub URL or browse the user's repositories.
|
|
6
|
+
* Supports browsing repos from multiple organizations.
|
|
6
7
|
* Returns the selected URL/nameWithOwner and optional destination override.
|
|
7
8
|
*/
|
|
8
9
|
import type { IGitHubRepositoryService } from '../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
|
|
9
10
|
import type { ListGitHubRepositoriesUseCase } from '../../../../packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.js';
|
|
11
|
+
import type { ListGitHubOrganizationsUseCase } from '../../../../packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.js';
|
|
10
12
|
/**
|
|
11
13
|
* Result returned by the GitHub import wizard.
|
|
12
14
|
*/
|
|
@@ -22,12 +24,13 @@ export interface GitHubImportWizardResult {
|
|
|
22
24
|
* Steps:
|
|
23
25
|
* 1. Choose import method (URL input or browse repos)
|
|
24
26
|
* 2a. If URL: prompt for URL, validate with parseGitHubUrl
|
|
25
|
-
* 2b. If browse: fetch repos via listUseCase, display select list
|
|
27
|
+
* 2b. If browse: optionally select an org, then fetch repos via listUseCase, display select list
|
|
26
28
|
* 3. Optionally prompt for destination directory override
|
|
27
29
|
*
|
|
28
30
|
* @param gitHubService - Service for URL validation
|
|
29
31
|
* @param listUseCase - Use case for listing user repos
|
|
32
|
+
* @param listOrgsUseCase - Use case for listing user's organizations
|
|
30
33
|
* @returns The selected import target and optional destination
|
|
31
34
|
*/
|
|
32
|
-
export declare function githubImportWizard(gitHubService: IGitHubRepositoryService, listUseCase: ListGitHubRepositoriesUseCase): Promise<GitHubImportWizardResult>;
|
|
35
|
+
export declare function githubImportWizard(gitHubService: IGitHubRepositoryService, listUseCase: ListGitHubRepositoriesUseCase, listOrgsUseCase?: ListGitHubOrganizationsUseCase): Promise<GitHubImportWizardResult>;
|
|
33
36
|
//# sourceMappingURL=github-import.wizard.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"github-import.wizard.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/tui/wizards/github-import.wizard.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"github-import.wizard.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/tui/wizards/github-import.wizard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EACV,wBAAwB,EAEzB,MAAM,4EAA4E,CAAC;AAEpF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2EAA2E,CAAC;AAC/H,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,4EAA4E,CAAC;AAIjI;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAuBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,wBAAwB,EACvC,WAAW,EAAE,6BAA6B,EAC1C,eAAe,CAAC,EAAE,8BAA8B,GAC/C,OAAO,CAAC,wBAAwB,CAAC,CAqCnC"}
|
|
@@ -3,12 +3,15 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Interactive TUI wizard that guides users through importing a GitHub repository.
|
|
5
5
|
* Offers two paths: paste a GitHub URL or browse the user's repositories.
|
|
6
|
+
* Supports browsing repos from multiple organizations.
|
|
6
7
|
* Returns the selected URL/nameWithOwner and optional destination override.
|
|
7
8
|
*/
|
|
8
9
|
import { select, input } from '@inquirer/prompts';
|
|
9
10
|
import { GitHubUrlParseError } from '../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
|
|
10
11
|
import { getTuiI18n } from '../i18n.js';
|
|
11
12
|
import { shepTheme } from '../themes/shep.theme.js';
|
|
13
|
+
/** Sentinel value representing the authenticated user's personal account */
|
|
14
|
+
const PERSONAL_OWNER = '__personal__';
|
|
12
15
|
/**
|
|
13
16
|
* Format a GitHub repo for display in the select list.
|
|
14
17
|
* Shows name, visibility badge, and truncated description.
|
|
@@ -27,14 +30,15 @@ function formatRepoChoice(repo) {
|
|
|
27
30
|
* Steps:
|
|
28
31
|
* 1. Choose import method (URL input or browse repos)
|
|
29
32
|
* 2a. If URL: prompt for URL, validate with parseGitHubUrl
|
|
30
|
-
* 2b. If browse: fetch repos via listUseCase, display select list
|
|
33
|
+
* 2b. If browse: optionally select an org, then fetch repos via listUseCase, display select list
|
|
31
34
|
* 3. Optionally prompt for destination directory override
|
|
32
35
|
*
|
|
33
36
|
* @param gitHubService - Service for URL validation
|
|
34
37
|
* @param listUseCase - Use case for listing user repos
|
|
38
|
+
* @param listOrgsUseCase - Use case for listing user's organizations
|
|
35
39
|
* @returns The selected import target and optional destination
|
|
36
40
|
*/
|
|
37
|
-
export async function githubImportWizard(gitHubService, listUseCase) {
|
|
41
|
+
export async function githubImportWizard(gitHubService, listUseCase, listOrgsUseCase) {
|
|
38
42
|
// Step 1: Choose import method
|
|
39
43
|
const t = getTuiI18n().t;
|
|
40
44
|
const method = await select({
|
|
@@ -58,7 +62,7 @@ export async function githubImportWizard(gitHubService, listUseCase) {
|
|
|
58
62
|
url = await promptForUrl(gitHubService);
|
|
59
63
|
}
|
|
60
64
|
else {
|
|
61
|
-
url = await promptForBrowse(listUseCase);
|
|
65
|
+
url = await promptForBrowse(listUseCase, listOrgsUseCase);
|
|
62
66
|
}
|
|
63
67
|
// Step 3: Optional destination override
|
|
64
68
|
const dest = await promptForDestination();
|
|
@@ -97,11 +101,39 @@ async function promptForUrl(gitHubService) {
|
|
|
97
101
|
}
|
|
98
102
|
/**
|
|
99
103
|
* Prompt the user to browse and select from their GitHub repositories.
|
|
100
|
-
*
|
|
104
|
+
* If organizations are available, first prompts the user to select an owner.
|
|
101
105
|
*/
|
|
102
|
-
async function promptForBrowse(listUseCase) {
|
|
103
|
-
const repos = await listUseCase.execute({ limit: 30 });
|
|
106
|
+
async function promptForBrowse(listUseCase, listOrgsUseCase) {
|
|
104
107
|
const t = getTuiI18n().t;
|
|
108
|
+
let owner;
|
|
109
|
+
// Try to load organizations for the owner selector
|
|
110
|
+
if (listOrgsUseCase) {
|
|
111
|
+
try {
|
|
112
|
+
const orgs = await listOrgsUseCase.execute();
|
|
113
|
+
if (orgs.length > 0) {
|
|
114
|
+
const ownerChoices = [
|
|
115
|
+
{ name: 'My repositories', value: PERSONAL_OWNER },
|
|
116
|
+
...orgs.map((org) => ({
|
|
117
|
+
name: org.login,
|
|
118
|
+
value: org.login,
|
|
119
|
+
description: org.description || undefined,
|
|
120
|
+
})),
|
|
121
|
+
];
|
|
122
|
+
const selectedOwner = await select({
|
|
123
|
+
message: 'Select account',
|
|
124
|
+
choices: ownerChoices,
|
|
125
|
+
theme: shepTheme,
|
|
126
|
+
});
|
|
127
|
+
if (selectedOwner !== PERSONAL_OWNER) {
|
|
128
|
+
owner = selectedOwner;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
// Org listing failure is non-critical — proceed with personal repos
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const repos = await listUseCase.execute({ limit: 30, owner });
|
|
105
137
|
if (repos.length === 0) {
|
|
106
138
|
throw new Error(t('tui:wizards.githubImport.noRepos'));
|
|
107
139
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { GitHubOrganization } from '../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
|
|
2
|
+
export declare function listGitHubOrganizations(): Promise<{
|
|
3
|
+
orgs?: GitHubOrganization[];
|
|
4
|
+
error?: string;
|
|
5
|
+
}>;
|
|
6
|
+
//# sourceMappingURL=list-github-organizations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-github-organizations.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/list-github-organizations.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oFAAoF,CAAC;AAG7H,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACvD,IAAI,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAYD"}
|
|
@@ -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 listGitHubOrganizations() {
|
|
5
|
+
try {
|
|
6
|
+
const useCase = resolve('ListGitHubOrganizationsUseCase');
|
|
7
|
+
const orgs = await useCase.execute();
|
|
8
|
+
return { orgs };
|
|
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 organizations';
|
|
15
|
+
return { error: message };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -2,6 +2,7 @@ import type { GitHubRepo } from '../../../../../packages/core/src/application/po
|
|
|
2
2
|
interface ListGitHubRepositoriesInput {
|
|
3
3
|
search?: string;
|
|
4
4
|
limit?: number;
|
|
5
|
+
owner?: string;
|
|
5
6
|
}
|
|
6
7
|
export declare function listGitHubRepositories(input?: ListGitHubRepositoriesInput): Promise<{
|
|
7
8
|
repos?: GitHubRepo[];
|
|
@@ -1 +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"}
|
|
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;IACf,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"}
|
package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { GitHubRepo } from '../../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
|
|
2
|
+
import type { GitHubOrganization } from '../../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
|
|
2
3
|
export interface GitHubRepoBrowserProps {
|
|
3
4
|
onSelect: (nameWithOwner: string) => void;
|
|
4
5
|
loading?: boolean;
|
|
@@ -6,10 +7,16 @@ export interface GitHubRepoBrowserProps {
|
|
|
6
7
|
fetchRepos?: (input?: {
|
|
7
8
|
search?: string;
|
|
8
9
|
limit?: number;
|
|
10
|
+
owner?: string;
|
|
9
11
|
}) => Promise<{
|
|
10
12
|
repos?: GitHubRepo[];
|
|
11
13
|
error?: string;
|
|
12
14
|
}>;
|
|
15
|
+
/** Override the fetch function for testing/stories */
|
|
16
|
+
fetchOrgs?: () => Promise<{
|
|
17
|
+
orgs?: GitHubOrganization[];
|
|
18
|
+
error?: string;
|
|
19
|
+
}>;
|
|
13
20
|
}
|
|
14
|
-
export declare function GitHubRepoBrowser({ onSelect, loading: externalLoading, fetchRepos, }: GitHubRepoBrowserProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export declare function GitHubRepoBrowser({ onSelect, loading: externalLoading, fetchRepos, fetchOrgs, }: GitHubRepoBrowserProps): import("react/jsx-runtime").JSX.Element;
|
|
15
22
|
//# sourceMappingURL=github-repo-browser.d.ts.map
|
|
@@ -1 +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":"
|
|
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":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oFAAoF,CAAC;AACrH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oFAAoF,CAAC;AAK7H,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;QACf,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;IACxD,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5E;AAED,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,OAAO,EAAE,eAAuB,EAChC,UAAmC,EACnC,SAAmC,GACpC,EAAE,sBAAsB,2CA+KxB"}
|
package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js
CHANGED
|
@@ -5,18 +5,44 @@ import { Lock, Globe, Loader2, Search, AlertCircle } from 'lucide-react';
|
|
|
5
5
|
import { Input } from '../../ui/input.js';
|
|
6
6
|
import { Badge } from '../../ui/badge.js';
|
|
7
7
|
import { Skeleton } from '../../ui/skeleton.js';
|
|
8
|
+
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/select.js';
|
|
8
9
|
import { listGitHubRepositories } from '../../../app/actions/list-github-repositories.js';
|
|
9
|
-
|
|
10
|
+
import { listGitHubOrganizations } from '../../../app/actions/list-github-organizations.js';
|
|
11
|
+
/** Sentinel value representing the authenticated user's personal account */
|
|
12
|
+
const PERSONAL_OWNER = '__personal__';
|
|
13
|
+
export function GitHubRepoBrowser({ onSelect, loading: externalLoading = false, fetchRepos = listGitHubRepositories, fetchOrgs = listGitHubOrganizations, }) {
|
|
10
14
|
const [repos, setRepos] = useState([]);
|
|
15
|
+
const [orgs, setOrgs] = useState([]);
|
|
11
16
|
const [fetching, setFetching] = useState(true);
|
|
12
17
|
const [error, setError] = useState('');
|
|
13
18
|
const [search, setSearch] = useState('');
|
|
19
|
+
const [selectedOwner, setSelectedOwner] = useState(PERSONAL_OWNER);
|
|
14
20
|
const debounceRef = useRef(null);
|
|
15
|
-
|
|
21
|
+
// Fetch organizations on mount
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
async function loadOrgs() {
|
|
24
|
+
try {
|
|
25
|
+
const result = await fetchOrgs();
|
|
26
|
+
if (result.orgs) {
|
|
27
|
+
setOrgs(result.orgs);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
// Org listing failure is non-critical — user can still browse personal repos
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
loadOrgs();
|
|
35
|
+
}, [fetchOrgs]);
|
|
36
|
+
const fetchData = useCallback(async (searchTerm, owner) => {
|
|
16
37
|
setFetching(true);
|
|
17
38
|
setError('');
|
|
18
39
|
try {
|
|
19
|
-
const
|
|
40
|
+
const input = {};
|
|
41
|
+
if (searchTerm)
|
|
42
|
+
input.search = searchTerm;
|
|
43
|
+
if (owner && owner !== PERSONAL_OWNER)
|
|
44
|
+
input.owner = owner;
|
|
45
|
+
const result = await fetchRepos(Object.keys(input).length > 0 ? input : undefined);
|
|
20
46
|
if (result.error) {
|
|
21
47
|
setError(result.error);
|
|
22
48
|
setRepos([]);
|
|
@@ -34,19 +60,23 @@ export function GitHubRepoBrowser({ onSelect, loading: externalLoading = false,
|
|
|
34
60
|
}
|
|
35
61
|
}, [fetchRepos]);
|
|
36
62
|
useEffect(() => {
|
|
37
|
-
fetchData();
|
|
38
|
-
}, [fetchData]);
|
|
63
|
+
fetchData(search || undefined, selectedOwner);
|
|
64
|
+
}, [fetchData, selectedOwner]); // eslint-disable-line react-hooks/exhaustive-deps
|
|
39
65
|
function handleSearchChange(value) {
|
|
40
66
|
setSearch(value);
|
|
41
67
|
if (debounceRef.current)
|
|
42
68
|
clearTimeout(debounceRef.current);
|
|
43
69
|
debounceRef.current = setTimeout(() => {
|
|
44
|
-
fetchData(value || undefined);
|
|
70
|
+
fetchData(value || undefined, selectedOwner);
|
|
45
71
|
}, 300);
|
|
46
72
|
}
|
|
73
|
+
function handleOwnerChange(value) {
|
|
74
|
+
setSelectedOwner(value);
|
|
75
|
+
setSearch('');
|
|
76
|
+
}
|
|
47
77
|
const disabled = externalLoading;
|
|
48
78
|
if (error && !fetching) {
|
|
49
79
|
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
80
|
}
|
|
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: "ps-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-start 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: "me-1 h-3 w-3" }), "Private"] })) : (_jsxs(_Fragment, { children: [_jsx(Globe, { className: "me-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)))) })] }));
|
|
81
|
+
return (_jsxs("div", { className: "flex flex-col gap-3", children: [orgs.length > 0 ? (_jsxs(Select, { value: selectedOwner, onValueChange: handleOwnerChange, disabled: disabled, children: [_jsx(SelectTrigger, { "aria-label": "Select owner", children: _jsx(SelectValue, { placeholder: "Select owner" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: PERSONAL_OWNER, children: "My repositories" }), orgs.map((org) => (_jsx(SelectItem, { value: org.login, children: org.login }, org.login)))] })] })) : null, _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: "ps-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-start 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: "me-1 h-3 w-3" }), "Private"] })) : (_jsxs(_Fragment, { children: [_jsx(Globe, { className: "me-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
82
|
}
|
|
@@ -4,6 +4,7 @@ declare const meta: Meta<typeof GitHubRepoBrowser>;
|
|
|
4
4
|
export default meta;
|
|
5
5
|
type Story = StoryObj<typeof GitHubRepoBrowser>;
|
|
6
6
|
export declare const Default: Story;
|
|
7
|
+
export declare const WithOrganizations: Story;
|
|
7
8
|
export declare const Loading: Story;
|
|
8
9
|
export declare const Empty: Story;
|
|
9
10
|
export declare const Error: Story;
|
|
@@ -1 +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;
|
|
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;AAgE1D,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,KAKrB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAU/B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAQnB,CAAC"}
|
|
@@ -38,6 +38,26 @@ const mockRepos = [
|
|
|
38
38
|
pushedAt: '2025-03-11T09:00:00Z',
|
|
39
39
|
},
|
|
40
40
|
];
|
|
41
|
+
const mockOrgRepos = [
|
|
42
|
+
{
|
|
43
|
+
name: 'platform',
|
|
44
|
+
nameWithOwner: 'acme-corp/platform',
|
|
45
|
+
description: 'Core platform monorepo',
|
|
46
|
+
isPrivate: true,
|
|
47
|
+
pushedAt: '2025-03-15T10:00:00Z',
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
name: 'design-system',
|
|
51
|
+
nameWithOwner: 'acme-corp/design-system',
|
|
52
|
+
description: 'Shared design system components',
|
|
53
|
+
isPrivate: false,
|
|
54
|
+
pushedAt: '2025-03-14T08:00:00Z',
|
|
55
|
+
},
|
|
56
|
+
];
|
|
57
|
+
const mockOrgs = [
|
|
58
|
+
{ login: 'acme-corp', description: 'Acme Corporation' },
|
|
59
|
+
{ login: 'open-source-collective', description: 'Open source projects' },
|
|
60
|
+
];
|
|
41
61
|
const meta = {
|
|
42
62
|
title: 'Composed/GitHubRepoBrowser',
|
|
43
63
|
component: GitHubRepoBrowser,
|
|
@@ -56,17 +76,31 @@ export default meta;
|
|
|
56
76
|
export const Default = {
|
|
57
77
|
args: {
|
|
58
78
|
fetchRepos: () => Promise.resolve({ repos: mockRepos }),
|
|
79
|
+
fetchOrgs: () => Promise.resolve({ orgs: [] }),
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
export const WithOrganizations = {
|
|
83
|
+
args: {
|
|
84
|
+
fetchRepos: (input) => {
|
|
85
|
+
if (input?.owner === 'acme-corp') {
|
|
86
|
+
return Promise.resolve({ repos: mockOrgRepos });
|
|
87
|
+
}
|
|
88
|
+
return Promise.resolve({ repos: mockRepos });
|
|
89
|
+
},
|
|
90
|
+
fetchOrgs: () => Promise.resolve({ orgs: mockOrgs }),
|
|
59
91
|
},
|
|
60
92
|
};
|
|
61
93
|
export const Loading = {
|
|
62
94
|
args: {
|
|
63
95
|
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
64
96
|
fetchRepos: () => new Promise(() => { }), // never resolves
|
|
97
|
+
fetchOrgs: () => Promise.resolve({ orgs: [] }),
|
|
65
98
|
},
|
|
66
99
|
};
|
|
67
100
|
export const Empty = {
|
|
68
101
|
args: {
|
|
69
102
|
fetchRepos: () => Promise.resolve({ repos: [] }),
|
|
103
|
+
fetchOrgs: () => Promise.resolve({ orgs: [] }),
|
|
70
104
|
},
|
|
71
105
|
};
|
|
72
106
|
export const Error = {
|
|
@@ -74,5 +108,6 @@ export const Error = {
|
|
|
74
108
|
fetchRepos: () => Promise.resolve({
|
|
75
109
|
error: 'GitHub CLI is not authenticated. Run `gh auth login` to sign in.',
|
|
76
110
|
}),
|
|
111
|
+
fetchOrgs: () => Promise.resolve({ orgs: [] }),
|
|
77
112
|
},
|
|
78
113
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAEhC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EAEZ,cAAc,GACf,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAI/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAEhC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EAEZ,cAAc,GACf,EAAE,eAAe,2CA6OjB"}
|