@shepai/cli 1.162.0-pr509.4102877 → 1.163.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/FabLayoutConfig.yaml +11 -0
- package/apis/json-schema/Settings.yaml +3 -0
- package/apis/json-schema/WorkflowConfig.yaml +0 -3
- 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 -2
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts +1 -3
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +3 -16
- package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +0 -2
- package/dist/packages/core/src/application/use-cases/features/create/types.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/domain/factories/settings-defaults.factory.d.ts.map +1 -1
- package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -30
- package/dist/packages/core/src/domain/generated/output.d.ts +13 -42
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/domain/generated/output.js +0 -5
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +5 -2
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -2
- 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 +6 -24
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-fab-position-swapped.d.ts +15 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-fab-position-swapped.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-fab-position-swapped.js +20 -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/feat/new.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/new.command.js +0 -3
- 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/app/layout.d.ts.map +1 -1
- package/dist/src/presentation/web/app/layout.js +3 -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/features/chat/ChatSheet.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/chat/ChatSheet.js +22 -2
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
- package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +15 -1
- 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 +9 -2
- package/dist/src/presentation/web/hooks/fab-layout-context.d.ts +18 -0
- package/dist/src/presentation/web/hooks/fab-layout-context.d.ts.map +1 -0
- package/dist/src/presentation/web/hooks/fab-layout-context.js +19 -0
- package/dist/src/presentation/web/lib/fab-layout.d.ts +11 -0
- package/dist/src/presentation/web/lib/fab-layout.d.ts.map +1 -0
- package/dist/src/presentation/web/lib/fab-layout.js +21 -0
- package/dist/translations/ar/cli.json +0 -2
- package/dist/translations/ar/web.json +8 -0
- package/dist/translations/de/cli.json +0 -2
- package/dist/translations/de/web.json +8 -0
- package/dist/translations/en/cli.json +0 -2
- package/dist/translations/en/web.json +8 -0
- package/dist/translations/es/cli.json +0 -2
- package/dist/translations/es/web.json +8 -0
- package/dist/translations/fr/cli.json +0 -2
- package/dist/translations/fr/web.json +8 -0
- package/dist/translations/he/cli.json +0 -2
- package/dist/translations/he/web.json +8 -0
- package/dist/translations/pt/cli.json +0 -2
- package/dist/translations/pt/web.json +8 -0
- package/dist/translations/ru/cli.json +0 -2
- package/dist/translations/ru/web.json +8 -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 +71 -56
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -2
- 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 +2 -2
- 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 +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +87 -72
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +87 -72
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +2 -2
- 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 +2 -2
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/chat/page.js +2 -2
- 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 +2 -2
- package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +87 -72
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +87 -72
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/page.js +2 -2
- package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +2 -2
- 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 +2 -2
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/_global-error.html +2 -2
- package/web/.next/server/app/_global-error.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
- package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
- package/web/.next/server/app/_not-found/page/server-reference-manifest.json +25 -10
- package/web/.next/server/app/_not-found/page.js +2 -2
- 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 +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 +35 -20
- package/web/.next/server/app/skills/page.js +2 -2
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +35 -20
- package/web/.next/server/app/tools/page.js +2 -2
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +25 -10
- 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]__beda892a._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__beda892a._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +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]__563e4faf._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__563e4faf._.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]__821a11c1._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__821a11c1._.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]__98740ee4._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__98740ee4._.js.map +1 -0
- 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]__ba9f9e11._.js +4 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ba9f9e11._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c9777776._.js.map +1 -1
- 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/_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/_0dc06d07._.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/{_bcaea66b._.js → _1879404a._.js} +2 -2
- package/web/.next/server/chunks/ssr/_1879404a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{_b9ba2473._.js → _1e08a336._.js} +2 -2
- package/web/.next/server/chunks/ssr/_1e08a336._.js.map +1 -0
- 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/_391e499a._.js +3 -0
- package/web/.next/server/chunks/ssr/_391e499a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/_5119a3df._.js.map +1 -1
- 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/_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/_ac4a3873._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_bf5fb52d._.js → _b881a389._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_bf5fb52d._.js.map → _b881a389._.js.map} +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/{_83fcc008._.js → _def82237._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_83fcc008._.js.map → _def82237._.js.map} +1 -1
- 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/chunks/ssr/translations_23dd5e7e._.js +1 -1
- package/web/.next/server/chunks/ssr/translations_23dd5e7e._.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 +636 -495
- package/web/.next/static/chunks/{12d5e55a38f12556.js → 0613d3829ce90fe9.js} +1 -1
- package/web/.next/static/chunks/{08c7087402abe8dc.js → 0d9e3aa7e10cf6e6.js} +2 -2
- package/web/.next/static/chunks/28ae5046faef6cec.js +1 -0
- package/web/.next/static/chunks/{36979e6fc9b5420a.js → 4581eaf51543601d.js} +1 -1
- package/web/.next/static/chunks/{c0317639cd5742f0.js → 5f40b5c4f859b573.js} +1 -1
- package/web/.next/static/chunks/{b641dd8f011c38d3.js → 780f688b8568331d.js} +2 -2
- package/web/.next/static/chunks/{86182e0294e048b3.js → 8b64414cdb4a4dc7.js} +1 -1
- package/web/.next/static/chunks/{7bad183aabd2ea36.js → bf55fb50a69f7350.js} +3 -3
- package/web/.next/static/chunks/{a8f13257c999eff1.js → c04ada25ace6f30c.js} +1 -1
- package/web/.next/static/chunks/c3a67566f78b5bc3.js +1 -0
- package/web/.next/static/chunks/ca8752df0e809c1b.js +7 -0
- package/web/.next/static/chunks/{20c33aaf58bbe8a9.js → d39ae882d080aa52.js} +1 -1
- package/web/.next/static/chunks/dbfbd9d9ee5eb2d0.js +1 -0
- package/web/.next/static/chunks/dc39dd4276779dec.js +1 -0
- package/web/.next/static/chunks/e779296e738a812b.css +1 -0
- package/apis/json-schema/SkillInjectionConfig.yaml +0 -17
- package/apis/json-schema/SkillSource.yaml +0 -21
- package/apis/json-schema/SkillSourceType.yaml +0 -7
- package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.d.ts +0 -39
- package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.d.ts.map +0 -1
- package/dist/packages/core/src/application/ports/output/services/skill-injector.interface.js +0 -8
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-skill-injection-config.d.ts +0 -15
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-skill-injection-config.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-skill-injection-config.js +0 -23
- package/dist/packages/core/src/infrastructure/services/skill-injector.service.d.ts +0 -26
- package/dist/packages/core/src/infrastructure/services/skill-injector.service.d.ts.map +0 -1
- package/dist/packages/core/src/infrastructure/services/skill-injector.service.js +0 -201
- 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/_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/_8797d9db._.js +0 -3
- package/web/.next/server/chunks/ssr/_8797d9db._.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/_b9ba2473._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_bcaea66b._.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/0eaa69a37f6c9e36.js +0 -7
- package/web/.next/static/chunks/4864ff06a738d58b.js +0 -1
- package/web/.next/static/chunks/63b4954715fc3423.js +0 -1
- package/web/.next/static/chunks/6b84fca3729b6688.js +0 -1
- package/web/.next/static/chunks/86c476f04ff32e7b.css +0 -1
- package/web/.next/static/chunks/b97ea1a9a5e986e9.js +0 -1
- /package/web/.next/static/{4ltYFSvrDIWJmAqKzeUt7 → qfCnoWSr4qmt2_dT28B-O}/_buildManifest.js +0 -0
- /package/web/.next/static/{4ltYFSvrDIWJmAqKzeUt7 → qfCnoWSr4qmt2_dT28B-O}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{4ltYFSvrDIWJmAqKzeUt7 → qfCnoWSr4qmt2_dT28B-O}/_ssgManifest.js +0 -0
|
@@ -105,11 +105,8 @@ export function toDatabase(settings) {
|
|
|
105
105
|
interactive_agent_max_concurrent_sessions: settings.interactiveAgent?.maxConcurrentSessions ?? 3,
|
|
106
106
|
// Auto-archive config (default: 10 minutes)
|
|
107
107
|
auto_archive_delay_minutes: settings.workflow.autoArchiveDelayMinutes ?? 10,
|
|
108
|
-
//
|
|
109
|
-
|
|
110
|
-
skill_injection_skills: settings.workflow.skillInjection?.skills?.length
|
|
111
|
-
? JSON.stringify(settings.workflow.skillInjection.skills)
|
|
112
|
-
: null,
|
|
108
|
+
// FAB layout config (default: not swapped)
|
|
109
|
+
fab_position_swapped: (settings.fabLayout?.swapPosition ?? false) ? 1 : 0,
|
|
113
110
|
};
|
|
114
111
|
}
|
|
115
112
|
/**
|
|
@@ -145,24 +142,6 @@ function buildAnalyzeRepoTimeoutsFromRow(row) {
|
|
|
145
142
|
return {};
|
|
146
143
|
return { analyzeRepoTimeouts: { analyzeMs: row.analyze_repo_timeout_analyze_ms } };
|
|
147
144
|
}
|
|
148
|
-
/**
|
|
149
|
-
* Build the skillInjection spread from DB row columns.
|
|
150
|
-
* Returns `{ skillInjection: { ... } }` when the enabled flag or skills JSON is present,
|
|
151
|
-
* or an empty object `{}` when both are default/null (so the field stays undefined).
|
|
152
|
-
*/
|
|
153
|
-
function buildSkillInjectionFromRow(row) {
|
|
154
|
-
const hasSkills = row.skill_injection_skills !== null;
|
|
155
|
-
const isEnabled = row.skill_injection_enabled === 1;
|
|
156
|
-
if (!isEnabled && !hasSkills)
|
|
157
|
-
return {};
|
|
158
|
-
const skills = hasSkills ? JSON.parse(row.skill_injection_skills) : [];
|
|
159
|
-
return {
|
|
160
|
-
skillInjection: {
|
|
161
|
-
enabled: isEnabled,
|
|
162
|
-
skills,
|
|
163
|
-
},
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
145
|
/**
|
|
167
146
|
* Maps database row to Settings domain object.
|
|
168
147
|
* Reconstructs nested objects and converts types from SQL.
|
|
@@ -237,7 +216,6 @@ export function fromDatabase(row) {
|
|
|
237
216
|
...(row.ci_log_max_chars !== null && { ciLogMaxChars: row.ci_log_max_chars }),
|
|
238
217
|
...buildStageTimeoutsFromRow(row),
|
|
239
218
|
...buildAnalyzeRepoTimeoutsFromRow(row),
|
|
240
|
-
...buildSkillInjectionFromRow(row),
|
|
241
219
|
ciWatchEnabled: row.ci_watch_enabled !== 0,
|
|
242
220
|
enableEvidence: row.workflow_enable_evidence === 1,
|
|
243
221
|
commitEvidence: row.workflow_commit_evidence === 1,
|
|
@@ -261,6 +239,10 @@ export function fromDatabase(row) {
|
|
|
261
239
|
autoTimeoutMinutes: row.interactive_agent_auto_timeout_minutes ?? 15,
|
|
262
240
|
maxConcurrentSessions: row.interactive_agent_max_concurrent_sessions ?? 3,
|
|
263
241
|
},
|
|
242
|
+
// FabLayoutConfig (INTEGER 0/1 → boolean)
|
|
243
|
+
fabLayout: {
|
|
244
|
+
swapPosition: (row.fab_position_swapped ?? 0) !== 0,
|
|
245
|
+
},
|
|
264
246
|
// Onboarding (INTEGER → boolean)
|
|
265
247
|
onboardingComplete: row.onboarding_complete === 1,
|
|
266
248
|
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration 050: Add fab_position_swapped column to the settings table.
|
|
3
|
+
*
|
|
4
|
+
* Adds one new column for controlling FAB layout:
|
|
5
|
+
* - fab_position_swapped (INTEGER DEFAULT 0): when 1, the Create (+) and
|
|
6
|
+
* Chat FABs swap horizontal positions in the web UI.
|
|
7
|
+
*
|
|
8
|
+
* Default value of 0 keeps the current layout (Create = start, Chat = end).
|
|
9
|
+
* Guards against duplicate column errors using table_info pragma.
|
|
10
|
+
*/
|
|
11
|
+
import type { MigrationParams } from 'umzug';
|
|
12
|
+
import type Database from 'better-sqlite3';
|
|
13
|
+
export declare function up({ context: db }: MigrationParams<Database.Database>): Promise<void>;
|
|
14
|
+
export declare function down({ context: db }: MigrationParams<Database.Database>): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=050-add-fab-position-swapped.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"050-add-fab-position-swapped.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations/050-add-fab-position-swapped.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,wBAAsB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAO3F;AAED,wBAAsB,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Migration 050: Add fab_position_swapped column to the settings table.
|
|
3
|
+
*
|
|
4
|
+
* Adds one new column for controlling FAB layout:
|
|
5
|
+
* - fab_position_swapped (INTEGER DEFAULT 0): when 1, the Create (+) and
|
|
6
|
+
* Chat FABs swap horizontal positions in the web UI.
|
|
7
|
+
*
|
|
8
|
+
* Default value of 0 keeps the current layout (Create = start, Chat = end).
|
|
9
|
+
* Guards against duplicate column errors using table_info pragma.
|
|
10
|
+
*/
|
|
11
|
+
export async function up({ context: db }) {
|
|
12
|
+
const columns = db.pragma('table_info(settings)');
|
|
13
|
+
const names = new Set(columns.map((c) => c.name));
|
|
14
|
+
if (!names.has('fab_position_swapped')) {
|
|
15
|
+
db.exec('ALTER TABLE settings ADD COLUMN fab_position_swapped INTEGER NOT NULL DEFAULT 0');
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function down({ context: db }) {
|
|
19
|
+
void db;
|
|
20
|
+
}
|
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":"new.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/new.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"new.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/new.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwEpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAmK1C"}
|
|
@@ -70,8 +70,6 @@ export function createNewCommand() {
|
|
|
70
70
|
.option('--no-fast', t('cli:commands.feat.new.noFastOption'))
|
|
71
71
|
.option('--model <model>', t('cli:commands.feat.new.modelOption'))
|
|
72
72
|
.option('--no-rebase', t('cli:commands.feat.new.noRebaseOption'))
|
|
73
|
-
.option('--inject-skills', t('cli:commands.feat.new.injectSkillsOption'))
|
|
74
|
-
.option('--no-inject-skills', t('cli:commands.feat.new.noInjectSkillsOption'))
|
|
75
73
|
.option('--attach <path>', t('cli:commands.feat.new.attachOption'), collect, [])
|
|
76
74
|
.action(async (description, options) => {
|
|
77
75
|
try {
|
|
@@ -133,7 +131,6 @@ export function createNewCommand() {
|
|
|
133
131
|
...(fast && { fast: true }),
|
|
134
132
|
...(options.model !== undefined && { model: options.model }),
|
|
135
133
|
...(attachmentPaths.length > 0 && { attachmentPaths }),
|
|
136
|
-
...(options.injectSkills !== undefined && { injectSkills: options.injectSkills }),
|
|
137
134
|
rebaseBeforeBranch: options.rebase,
|
|
138
135
|
}));
|
|
139
136
|
const { feature, warning } = result;
|
|
@@ -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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,6BAA6B,CAAC;AACrC,OAAO,2CAA2C,CAAC;AACnD,OAAO,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/layout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAErC,OAAO,6BAA6B,CAAC;AACrC,OAAO,2CAA2C,CAAC;AACnD,OAAO,eAAe,CAAC;AAWvB,sFAAsF;AACtF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,eAAO,MAAM,QAAQ,EAAE,QAkBtB,CAAC;AAEF,wBAA8B,UAAU,CAAC,EACvC,QAAQ,GACT,EAAE,QAAQ,CAAC;IACV,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,CAAC,oDA6BD"}
|
|
@@ -6,7 +6,9 @@ import './globals.css';
|
|
|
6
6
|
import { AppShell } from '../components/layouts/app-shell/index.js';
|
|
7
7
|
import { Toaster } from '../components/ui/sonner.js';
|
|
8
8
|
import { getFeatureFlags } from '../lib/feature-flags.js';
|
|
9
|
+
import { getFabLayout } from '../lib/fab-layout.js';
|
|
9
10
|
import { FeatureFlagsProvider } from '../hooks/feature-flags-context.js';
|
|
11
|
+
import { FabLayoutProvider } from '../hooks/fab-layout-context.js';
|
|
10
12
|
import { QueryProvider } from '../components/providers/query-provider.js';
|
|
11
13
|
import { I18nProvider } from '../components/providers/i18n-provider.js';
|
|
12
14
|
import { getLanguagePreference } from '../lib/language.js';
|
|
@@ -36,5 +38,5 @@ export default async function RootLayout({ children, }) {
|
|
|
36
38
|
const { language, dir } = getLanguagePreference();
|
|
37
39
|
return (_jsxs("html", { lang: language, dir: dir, suppressHydrationWarning: true, children: [_jsx("head", { children: _jsx("script", { dangerouslySetInnerHTML: {
|
|
38
40
|
__html: `(function(){try{var d=document.documentElement,t=localStorage.getItem('shep-theme'),s=window.matchMedia('(prefers-color-scheme: dark)').matches;if(t==='dark'||(t==='system'&&s)||(!t&&s)){d.classList.add('dark')}}catch(e){}})();`,
|
|
39
|
-
} }) }), _jsxs("body", { className: "min-h-screen antialiased", children: [_jsx(I18nProvider, { initialLanguage: language, children: _jsx(QueryProvider, { children: _jsx(FeatureFlagsProvider, { flags: getFeatureFlags(), children: _jsx(AppShell, { sidebarOpen: sidebarOpen, children: children }) }) }) }), _jsx(Toaster, { position: "bottom-center" })] })] }));
|
|
41
|
+
} }) }), _jsxs("body", { className: "min-h-screen antialiased", children: [_jsx(I18nProvider, { initialLanguage: language, children: _jsx(QueryProvider, { children: _jsx(FeatureFlagsProvider, { flags: getFeatureFlags(), children: _jsx(FabLayoutProvider, { layout: getFabLayout(), children: _jsx(AppShell, { sidebarOpen: sidebarOpen, children: children }) }) }) }) }), _jsx(Toaster, { position: "bottom-center" })] })] }));
|
|
40
42
|
}
|
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":"ChatSheet.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/ChatSheet.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ChatSheet.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/chat/ChatSheet.tsx"],"names":[],"mappings":"AA2DA,wBAAgB,eAAe,4CAwY9B"}
|