@shepai/cli 1.174.0 → 1.175.0-pr530.44b3d3f
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/Repository.yaml +6 -0
- package/dist/eslint.config.mjs +2 -0
- package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +3 -1
- package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +28 -0
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
- package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.js +2 -0
- package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +47 -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/github-repository-service.interface.js +12 -0
- package/dist/packages/core/src/application/ports/output/services/i-browser-opener.d.ts +28 -0
- package/dist/packages/core/src/application/ports/output/services/i-browser-opener.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/i-browser-opener.js +13 -0
- package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.d.ts +29 -0
- package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.d.ts.map +1 -0
- package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.js +13 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts +2 -0
- package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/features/create/create-feature-from-remote.use-case.d.ts +67 -0
- package/dist/packages/core/src/application/use-cases/features/create/create-feature-from-remote.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/features/create/create-feature-from-remote.use-case.js +128 -0
- package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts +16 -5
- package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts.map +1 -1
- package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.js +76 -14
- package/dist/packages/core/src/application/use-cases/repositories/init-remote-repository.use-case.d.ts +30 -0
- package/dist/packages/core/src/application/use-cases/repositories/init-remote-repository.use-case.d.ts.map +1 -0
- package/dist/packages/core/src/application/use-cases/repositories/init-remote-repository.use-case.js +51 -0
- package/dist/packages/core/src/domain/generated/output.d.ts +8 -0
- package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/di/container.js +15 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts +2 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js +4 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-repository-fork-fields.d.ts +12 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-repository-fork-fields.d.ts.map +1 -0
- package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-repository-fork-fields.js +26 -0
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +14 -0
- package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +4 -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 +55 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +15 -0
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
- package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +62 -0
- package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts +2 -1
- package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts +1 -1
- package/dist/src/presentation/cli/commands/daemon/start-daemon.js +2 -3
- package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/feat/new.command.js +32 -6
- package/dist/src/presentation/cli/commands/repo/index.d.ts.map +1 -1
- package/dist/src/presentation/cli/commands/repo/index.js +3 -1
- package/dist/src/presentation/cli/commands/repo/init-remote.command.d.ts +15 -0
- package/dist/src/presentation/cli/commands/repo/init-remote.command.d.ts.map +1 -0
- package/dist/src/presentation/cli/commands/repo/init-remote.command.js +44 -0
- package/dist/src/presentation/cli/commands/ui.command.js +1 -2
- package/dist/src/presentation/web/app/actions/create-feature-from-remote.d.ts +31 -0
- package/dist/src/presentation/web/app/actions/create-feature-from-remote.d.ts.map +1 -0
- package/dist/src/presentation/web/app/actions/create-feature-from-remote.js +69 -0
- package/dist/src/presentation/web/app/actions/import-github-repository.d.ts +1 -0
- package/dist/src/presentation/web/app/actions/import-github-repository.d.ts.map +1 -1
- package/dist/src/presentation/web/app/actions/import-github-repository.js +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +2 -0
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/repository-combobox.stories.d.ts +2 -0
- package/dist/src/presentation/web/components/common/feature-create-drawer/repository-combobox.stories.d.ts.map +1 -1
- package/dist/src/presentation/web/components/common/feature-create-drawer/repository-combobox.stories.js +22 -0
- package/dist/src/presentation/web/lib/feature-flags.js +1 -1
- package/dist/translations/ar/cli.json +12 -0
- package/dist/translations/de/cli.json +12 -0
- package/dist/translations/en/cli.json +12 -0
- package/dist/translations/es/cli.json +12 -0
- package/dist/translations/fr/cli.json +12 -0
- package/dist/translations/he/cli.json +12 -0
- package/dist/translations/pt/cli.json +12 -0
- package/dist/translations/ru/cli.json +12 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +10 -2
- 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 +29 -29
- package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -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 +27 -27
- package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +2 -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 +30 -30
- package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -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 +38 -38
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -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 +38 -38
- package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -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 +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +2 -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 +28 -28
- package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -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 +27 -27
- package/web/.next/server/app/(dashboard)/chat/page.js +2 -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 +30 -30
- package/web/.next/server/app/(dashboard)/create/page.js +2 -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 +38 -38
- package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -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 +38 -38
- package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -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 +27 -27
- package/web/.next/server/app/(dashboard)/page.js +2 -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 +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +2 -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 +28 -28
- package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -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 +6 -6
- 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/features/page/server-reference-manifest.json +6 -6
- package/web/.next/server/app/features/page.js.nft.json +1 -1
- package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
- 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 +13 -13
- package/web/.next/server/app/skills/page.js +2 -1
- package/web/.next/server/app/skills/page.js.nft.json +1 -1
- package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
- package/web/.next/server/app/tools/page.js +2 -1
- package/web/.next/server/app/tools/page.js.nft.json +1 -1
- package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
- package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
- 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]__c78383b1._.js.map +1 -1
- package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.js +3 -0
- package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.js.map +1 -0
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
- package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
- package/web/.next/server/chunks/ssr/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]__1cd4327c._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__51ec77a8._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__51ec77a8._.js.map +1 -0
- package/web/.next/server/chunks/ssr/{[root-of-the-server]__b020c17d._.js → [root-of-the-server]__540c615f._.js} +3 -3
- package/web/.next/server/chunks/ssr/[root-of-the-server]__540c615f._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__66047a1b._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__66047a1b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a932cd3a._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__a932cd3a._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aa72e794._.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__aa72e794._.js.map +1 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
- 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/_16eb4fec._.js +1 -1
- package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_295fffde._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_45496654._.js +1 -1
- package/web/.next/server/chunks/ssr/_45496654._.js.map +1 -1
- package/web/.next/server/chunks/ssr/_4cbb7f95._.js +1 -1
- package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_fd595af2._.js → _4f2b44c0._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_fd595af2._.js.map → _4f2b44c0._.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/_6abfa39e._.js +1 -1
- package/web/.next/server/chunks/ssr/_6abfa39e._.js.map +1 -1
- package/web/.next/server/chunks/ssr/{_7953be4d._.js → _d3833dd3._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_7953be4d._.js.map → _d3833dd3._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/{_3a71f39b._.js → _f2f1bb99._.js} +2 -2
- package/web/.next/server/chunks/ssr/{_3a71f39b._.js.map → _f2f1bb99._.js.map} +1 -1
- package/web/.next/server/chunks/ssr/_f8c55130._.js +4 -0
- package/web/.next/server/chunks/ssr/_f8c55130._.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/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
- package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_17d39233._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_17d39233._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_54b02639._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_54b02639._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_7b7b9e3b._.js +5 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_7b7b9e3b._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_807cba76._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_807cba76._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js.map +1 -0
- 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_features_skills_8a174cac._.js +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
- package/web/.next/server/chunks/ssr/src_presentation_web_e1cd1869._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_e1cd1869._.js.map +1 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_e3a30e30._.js +3 -0
- package/web/.next/server/chunks/ssr/src_presentation_web_e3a30e30._.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 +50 -50
- package/web/.next/static/chunks/{393b27ab5de6c454.js → 1500ae4caae7ab8a.js} +1 -1
- package/web/.next/static/chunks/{534194b584a151ed.js → 2670ec1d2e2e55d2.js} +1 -1
- package/web/.next/static/chunks/2ceebcc839ee0d4b.js +1 -0
- package/web/.next/static/chunks/{6bc240cd4ae43267.js → 3fb211d4ea30acb5.js} +1 -1
- package/web/.next/static/chunks/{ad47bc6ddec7508e.js → 6c7f0a73c0873fab.js} +1 -1
- package/web/.next/static/chunks/9a829b853e2e89f7.js +1 -0
- package/web/.next/static/chunks/9de7f8e1dd758f7a.js +1 -0
- package/web/.next/static/chunks/{a060ad1bb509687f.js → 9ebe6617c1687993.js} +1 -1
- package/web/.next/static/chunks/{d9c9db1823b4dffd.js → a0f3ae7198e8fb87.js} +1 -1
- package/web/.next/static/chunks/a20f2d6f76f469b7.css +1 -0
- package/web/.next/static/chunks/{6dc0a23d333274ae.js → a88aa07f3cbb7567.js} +3 -3
- package/web/.next/static/chunks/{a2a03ecb10000974.js → badc97045a6c414d.js} +1 -1
- package/web/.next/static/chunks/{e30aa6d2cf824fa1.js → bbcb1154726b6b99.js} +1 -1
- package/web/.next/static/chunks/{0baf5a2e56d191cf.js → d8e739ad177860ed.js} +1 -1
- package/web/.next/static/chunks/{c164b157638b2a8b.js → e8b36e95e26924d5.js} +1 -1
- package/web/.next/static/chunks/ec7dc9f7942577c7.js +3 -0
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js.map +0 -1
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js +0 -4
- package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_02e01240._.js +0 -4
- package/web/.next/server/chunks/ssr/_02e01240._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_18886033._.js +0 -4
- package/web/.next/server/chunks/ssr/_18886033._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_22e00a14._.js +0 -4
- package/web/.next/server/chunks/ssr/_22e00a14._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_a5a5901d._.js +0 -4
- package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_ad09f271._.js +0 -4
- package/web/.next/server/chunks/ssr/_ad09f271._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_c3f595c6._.js +0 -4
- package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_ea9e1556._.js +0 -4
- package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js +0 -6
- package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f33cd07e._.js +0 -6
- package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +0 -1
- package/web/.next/server/chunks/ssr/_f8b45233._.js +0 -4
- package/web/.next/server/chunks/ssr/_f8b45233._.js.map +0 -1
- package/web/.next/static/chunks/32c46154c31c58fc.js +0 -1
- package/web/.next/static/chunks/5a2e1c8699897c26.js +0 -3
- package/web/.next/static/chunks/84b480808bd74fa9.css +0 -1
- package/web/.next/static/chunks/f5abbc495d496f5b.js +0 -1
- /package/web/.next/static/{nLYXtW5TIrvQiMl1yyD4O → O8LQNkKaww1r4JKbHgBGo}/_buildManifest.js +0 -0
- /package/web/.next/static/{nLYXtW5TIrvQiMl1yyD4O → O8LQNkKaww1r4JKbHgBGo}/_clientMiddlewareManifest.json +0 -0
- /package/web/.next/static/{nLYXtW5TIrvQiMl1yyD4O → O8LQNkKaww1r4JKbHgBGo}/_ssgManifest.js +0 -0
package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js
CHANGED
|
@@ -20,7 +20,7 @@ import { injectable, inject } from 'tsyringe';
|
|
|
20
20
|
import { resolve, normalize } from 'node:path';
|
|
21
21
|
import { rm } from 'node:fs/promises';
|
|
22
22
|
import { spawn } from 'node:child_process';
|
|
23
|
-
import { GitHubAuthError, GitHubCloneError, GitHubPermissionError, GitHubRepoListError, GitHubUrlParseError, } from '../../../application/ports/output/services/github-repository-service.interface.js';
|
|
23
|
+
import { GitHubAuthError, GitHubCloneError, GitHubForkError, GitHubPermissionError, GitHubRepoListError, GitHubUrlParseError, } from '../../../application/ports/output/services/github-repository-service.interface.js';
|
|
24
24
|
// ---------------------------------------------------------------------------
|
|
25
25
|
// URL regex patterns
|
|
26
26
|
// ---------------------------------------------------------------------------
|
|
@@ -191,6 +191,60 @@ let GitHubRepositoryService = class GitHubRepositoryService {
|
|
|
191
191
|
throw new GitHubPermissionError(`Failed to check repository permission: ${cause?.message ?? String(error)}`, cause);
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
|
+
async getAuthenticatedUser() {
|
|
195
|
+
try {
|
|
196
|
+
const { stdout } = await this.execFile('gh', ['api', 'user', '--jq', '.login']);
|
|
197
|
+
return stdout.trim();
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
201
|
+
throw new GitHubAuthError(`Failed to get authenticated user: ${err.message}`, err);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async checkPushAccess(nameWithOwner) {
|
|
205
|
+
try {
|
|
206
|
+
const viewerLogin = await this.getAuthenticatedUser();
|
|
207
|
+
const { stdout } = await this.execFile('gh', [
|
|
208
|
+
'api',
|
|
209
|
+
`repos/${nameWithOwner}`,
|
|
210
|
+
'--jq',
|
|
211
|
+
'.permissions.push',
|
|
212
|
+
]);
|
|
213
|
+
return {
|
|
214
|
+
hasPushAccess: stdout.trim() === 'true',
|
|
215
|
+
viewerLogin,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
if (error instanceof GitHubAuthError)
|
|
220
|
+
throw error;
|
|
221
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
222
|
+
throw new GitHubPermissionError(`Failed to check push access for ${nameWithOwner}: ${err.message}`, err);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
async forkRepository(nameWithOwner, options) {
|
|
226
|
+
try {
|
|
227
|
+
options?.onProgress?.(`Forking ${nameWithOwner}...`);
|
|
228
|
+
const { stdout, stderr } = await this.execFile('gh', [
|
|
229
|
+
'repo',
|
|
230
|
+
'fork',
|
|
231
|
+
nameWithOwner,
|
|
232
|
+
'--clone=false',
|
|
233
|
+
]);
|
|
234
|
+
const combined = `${stdout}\n${stderr}`;
|
|
235
|
+
const alreadyExisted = combined.toLowerCase().includes('already exists');
|
|
236
|
+
// Extract fork nameWithOwner from output
|
|
237
|
+
// gh repo fork outputs the fork URL like "https://github.com/user/repo"
|
|
238
|
+
const urlMatch = combined.match(/github\.com\/([^\s/]+\/[^\s/]+)/);
|
|
239
|
+
const forkNwo = urlMatch ? urlMatch[1].replace(/\.git$/, '') : nameWithOwner;
|
|
240
|
+
options?.onProgress?.(alreadyExisted ? 'Using existing fork' : 'Fork created');
|
|
241
|
+
return { nameWithOwner: forkNwo, alreadyExisted };
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
245
|
+
throw new GitHubForkError(`Failed to fork ${nameWithOwner}: ${err.message}`, err);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
194
248
|
async cleanupPartialClone(destination) {
|
|
195
249
|
try {
|
|
196
250
|
await rm(destination, { recursive: true, force: true });
|
|
@@ -44,6 +44,21 @@ export declare class GitPrService implements IGitPrService {
|
|
|
44
44
|
private parseGitError;
|
|
45
45
|
private parseGhError;
|
|
46
46
|
private parsePrNumberFromUrl;
|
|
47
|
+
createGitHubRepo(cwd: string, name: string, options: {
|
|
48
|
+
isPrivate: boolean;
|
|
49
|
+
org?: string;
|
|
50
|
+
}): Promise<string>;
|
|
51
|
+
/**
|
|
52
|
+
* Extracts the first github.com repository URL from a blob of text.
|
|
53
|
+
* Returns a normalized URL without a trailing `.git` suffix or punctuation.
|
|
54
|
+
*/
|
|
55
|
+
private extractGitHubUrl;
|
|
56
|
+
/**
|
|
57
|
+
* Queries the current repo's URL via `gh repo view --json url`. Used as a
|
|
58
|
+
* fallback when URL parsing from `gh repo create` output fails.
|
|
59
|
+
*/
|
|
60
|
+
private queryRepoUrl;
|
|
61
|
+
addRemote(cwd: string, remoteName: string, remoteUrl: string): Promise<void>;
|
|
47
62
|
private parseDiffStat;
|
|
48
63
|
syncMain(cwd: string, baseBranch: string): Promise<void>;
|
|
49
64
|
rebaseOnMain(cwd: string, featureBranch: string, baseBranch: string): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -650,6 +650,68 @@ let GitPrService = class GitPrService {
|
|
|
650
650
|
const match = url.match(/\/pull\/(\d+)/);
|
|
651
651
|
return match ? parseInt(match[1], 10) : 0;
|
|
652
652
|
}
|
|
653
|
+
async createGitHubRepo(cwd, name, options) {
|
|
654
|
+
const repoName = options.org ? `${options.org}/${name}` : name;
|
|
655
|
+
const visibilityFlag = options.isPrivate ? '--private' : '--public';
|
|
656
|
+
const args = [
|
|
657
|
+
'repo',
|
|
658
|
+
'create',
|
|
659
|
+
repoName,
|
|
660
|
+
visibilityFlag,
|
|
661
|
+
'--source=.',
|
|
662
|
+
'--remote=origin',
|
|
663
|
+
'--push',
|
|
664
|
+
];
|
|
665
|
+
try {
|
|
666
|
+
const { stdout, stderr } = await this.execFile('gh', args, { cwd });
|
|
667
|
+
// `gh repo create` emits status lines to stdout/stderr that include the
|
|
668
|
+
// created repo URL somewhere in the output (e.g. "✓ Created repository
|
|
669
|
+
// org/name on GitHub\n https://github.com/org/name"). Scrape the first
|
|
670
|
+
// github.com URL we can find rather than returning the raw multi-line blob.
|
|
671
|
+
const combined = `${stdout}\n${stderr}`;
|
|
672
|
+
const parsedUrl = this.extractGitHubUrl(combined);
|
|
673
|
+
if (parsedUrl) {
|
|
674
|
+
return parsedUrl;
|
|
675
|
+
}
|
|
676
|
+
// Fall back to `gh repo view` from the cwd — after --push, origin is the
|
|
677
|
+
// authoritative source of the repo URL.
|
|
678
|
+
return await this.queryRepoUrl(cwd);
|
|
679
|
+
}
|
|
680
|
+
catch (error) {
|
|
681
|
+
const ghError = this.parseGhError(error);
|
|
682
|
+
if (ghError.code === GitPrErrorCode.GIT_ERROR) {
|
|
683
|
+
throw new GitPrError(ghError.message, GitPrErrorCode.REPO_CREATE_FAILED, ghError.cause);
|
|
684
|
+
}
|
|
685
|
+
throw ghError;
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
/**
|
|
689
|
+
* Extracts the first github.com repository URL from a blob of text.
|
|
690
|
+
* Returns a normalized URL without a trailing `.git` suffix or punctuation.
|
|
691
|
+
*/
|
|
692
|
+
extractGitHubUrl(text) {
|
|
693
|
+
const match = text.match(/https:\/\/github\.com\/[\w.-]+\/[\w.-]+/);
|
|
694
|
+
if (!match) {
|
|
695
|
+
return null;
|
|
696
|
+
}
|
|
697
|
+
return match[0].replace(/\.git$/, '').replace(/[).,;]+$/, '');
|
|
698
|
+
}
|
|
699
|
+
/**
|
|
700
|
+
* Queries the current repo's URL via `gh repo view --json url`. Used as a
|
|
701
|
+
* fallback when URL parsing from `gh repo create` output fails.
|
|
702
|
+
*/
|
|
703
|
+
async queryRepoUrl(cwd) {
|
|
704
|
+
const { stdout } = await this.execFile('gh', ['repo', 'view', '--json', 'url', '--jq', '.url'], { cwd });
|
|
705
|
+
return stdout.trim();
|
|
706
|
+
}
|
|
707
|
+
async addRemote(cwd, remoteName, remoteUrl) {
|
|
708
|
+
try {
|
|
709
|
+
await this.execFile('git', ['remote', 'add', remoteName, remoteUrl], { cwd });
|
|
710
|
+
}
|
|
711
|
+
catch (error) {
|
|
712
|
+
throw this.parseGitError(error);
|
|
713
|
+
}
|
|
714
|
+
}
|
|
653
715
|
parseDiffStat(diffStat, logOutput) {
|
|
654
716
|
const summaryLine = diffStat.trim().split('\n').pop() ?? '';
|
|
655
717
|
const filesMatch = summaryLine.match(/(\d+)\s+files?\s+changed/);
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
* - Title truncated to 100 chars, body to 500 chars
|
|
10
10
|
* - Errors are caught and logged (never thrown)
|
|
11
11
|
*/
|
|
12
|
-
|
|
12
|
+
import type { IDesktopNotifier } from '../../../application/ports/output/services/i-desktop-notifier.js';
|
|
13
|
+
export declare class DesktopNotifier implements IDesktopNotifier {
|
|
13
14
|
/**
|
|
14
15
|
* Send a native OS desktop notification.
|
|
15
16
|
*
|
package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"desktop-notifier.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/notifications/desktop-notifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"desktop-notifier.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/notifications/desktop-notifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kEAAkE,CAAC;AAMzG,qBAAa,eAAgB,YAAW,gBAAgB;IACtD;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAYvC,OAAO,CAAC,QAAQ;CAIjB"}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* 4. Wait briefly to confirm the child is alive; surface stderr on crash
|
|
15
15
|
* 5. Write daemon.json atomically via IDaemonService
|
|
16
16
|
* 6. Print formatted URL to stdout
|
|
17
|
-
* 7. Open browser via
|
|
17
|
+
* 7. Open browser via IBrowserOpener (resolved from DI container)
|
|
18
18
|
*/
|
|
19
19
|
export interface StartDaemonOptions {
|
|
20
20
|
port?: number;
|
|
@@ -14,14 +14,13 @@
|
|
|
14
14
|
* 4. Wait briefly to confirm the child is alive; surface stderr on crash
|
|
15
15
|
* 5. Write daemon.json atomically via IDaemonService
|
|
16
16
|
* 6. Print formatted URL to stdout
|
|
17
|
-
* 7. Open browser via
|
|
17
|
+
* 7. Open browser via IBrowserOpener (resolved from DI container)
|
|
18
18
|
*/
|
|
19
19
|
import { spawn } from 'node:child_process';
|
|
20
20
|
import { closeSync, openSync, renameSync, existsSync } from 'node:fs';
|
|
21
21
|
import http from 'node:http';
|
|
22
22
|
import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
|
|
23
23
|
import { findAvailablePort, DEFAULT_PORT } from '../../../../../packages/core/src/infrastructure/services/port.service.js';
|
|
24
|
-
import { BrowserOpenerService } from '../../../../../packages/core/src/infrastructure/services/browser-opener.service.js';
|
|
25
24
|
import { getDaemonLogPath } from '../../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
|
|
26
25
|
import { fmt, messages, spinner } from '../../ui/index.js';
|
|
27
26
|
import { getCliI18n } from '../../i18n.js';
|
|
@@ -116,7 +115,7 @@ export async function startDaemon(opts = {}) {
|
|
|
116
115
|
}
|
|
117
116
|
}
|
|
118
117
|
messages.newline();
|
|
119
|
-
const opener =
|
|
118
|
+
const opener = container.resolve('IBrowserOpener');
|
|
120
119
|
opener.open(url);
|
|
121
120
|
}
|
|
122
121
|
/**
|
|
@@ -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;AA2EpC;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAmM1C"}
|
|
@@ -15,6 +15,7 @@ import { existsSync } from 'node:fs';
|
|
|
15
15
|
import { join, resolve } from 'node:path';
|
|
16
16
|
import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
|
|
17
17
|
import { CreateFeatureUseCase } from '../../../../../packages/core/src/application/use-cases/features/create/create-feature.use-case.js';
|
|
18
|
+
import { CreateFeatureFromRemoteUseCase } from '../../../../../packages/core/src/application/use-cases/features/create/create-feature-from-remote.use-case.js';
|
|
18
19
|
import { SdlcLifecycle } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
19
20
|
import { colors, messages, spinner } from '../../ui/index.js';
|
|
20
21
|
import { getCliI18n } from '../../i18n.js';
|
|
@@ -57,6 +58,7 @@ export function createNewCommand() {
|
|
|
57
58
|
.description(t('cli:commands.feat.new.description'))
|
|
58
59
|
.argument('<description>', t('cli:commands.feat.new.descriptionArgument'))
|
|
59
60
|
.option('-r, --repo <path>', t('cli:commands.feat.new.repoOption'))
|
|
61
|
+
.option('--remote <url>', t('cli:commands.feat.new.remoteOption'))
|
|
60
62
|
.option('--push', t('cli:commands.feat.new.pushOption'))
|
|
61
63
|
.option('--pr', t('cli:commands.feat.new.prOption'))
|
|
62
64
|
.option('--no-pr', t('cli:commands.feat.new.noPrOption'))
|
|
@@ -75,6 +77,12 @@ export function createNewCommand() {
|
|
|
75
77
|
.option('--attach <path>', t('cli:commands.feat.new.attachOption'), collect, [])
|
|
76
78
|
.action(async (description, options) => {
|
|
77
79
|
try {
|
|
80
|
+
// Conflict check: --remote and --repo are mutually exclusive
|
|
81
|
+
if (options.remote && options.repo) {
|
|
82
|
+
messages.error(t('cli:commands.feat.new.remoteConflict'));
|
|
83
|
+
process.exitCode = 1;
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
78
86
|
// First-run onboarding gate — only for interactive terminals
|
|
79
87
|
if (process.stdin.isTTY) {
|
|
80
88
|
const { isComplete } = await new CheckOnboardingStatusUseCase().execute();
|
|
@@ -82,7 +90,6 @@ export function createNewCommand() {
|
|
|
82
90
|
await onboardingWizard();
|
|
83
91
|
}
|
|
84
92
|
}
|
|
85
|
-
const useCase = container.resolve(CreateFeatureUseCase);
|
|
86
93
|
const repoPath = options.repo ?? process.cwd();
|
|
87
94
|
// Resolve openPr from CLI flags or settings defaults
|
|
88
95
|
const defaults = getWorkflowDefaults();
|
|
@@ -122,9 +129,8 @@ export function createNewCommand() {
|
|
|
122
129
|
}
|
|
123
130
|
}
|
|
124
131
|
const fast = options.fast ?? defaults.fast;
|
|
125
|
-
const
|
|
132
|
+
const commonInput = {
|
|
126
133
|
userInput: description,
|
|
127
|
-
repositoryPath: repoPath,
|
|
128
134
|
approvalGates,
|
|
129
135
|
push,
|
|
130
136
|
openPr,
|
|
@@ -133,9 +139,29 @@ export function createNewCommand() {
|
|
|
133
139
|
...(fast && { fast: true }),
|
|
134
140
|
...(options.model !== undefined && { model: options.model }),
|
|
135
141
|
...(attachmentPaths.length > 0 && { attachmentPaths }),
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
142
|
+
};
|
|
143
|
+
let result;
|
|
144
|
+
if (options.remote) {
|
|
145
|
+
// Remote path: clone (or fork) then create feature
|
|
146
|
+
const settings = getSettings();
|
|
147
|
+
const defaultCloneDir = settings.environment?.defaultCloneDirectory;
|
|
148
|
+
const remoteUseCase = container.resolve(CreateFeatureFromRemoteUseCase);
|
|
149
|
+
result = await spinner(t('cli:commands.feat.new.spinnerText'), () => remoteUseCase.execute({
|
|
150
|
+
...commonInput,
|
|
151
|
+
remoteUrl: options.remote,
|
|
152
|
+
defaultCloneDir,
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
// Local path: create feature on existing repo
|
|
157
|
+
const useCase = container.resolve(CreateFeatureUseCase);
|
|
158
|
+
result = await spinner(t('cli:commands.feat.new.spinnerText'), () => useCase.execute({
|
|
159
|
+
...commonInput,
|
|
160
|
+
repositoryPath: repoPath,
|
|
161
|
+
...(options.injectSkills !== undefined && { injectSkills: options.injectSkills }),
|
|
162
|
+
rebaseBeforeBranch: options.rebase,
|
|
163
|
+
}));
|
|
164
|
+
}
|
|
139
165
|
const { feature, warning } = result;
|
|
140
166
|
const repoHash = createHash('sha256').update(repoPath).digest('hex').slice(0, 16);
|
|
141
167
|
const wtSlug = feature.branch.replace(/\//g, '-');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/repo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/repo/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAU3C"}
|
|
@@ -15,6 +15,7 @@ import { Command } from 'commander';
|
|
|
15
15
|
import { createShowCommand } from './show.command.js';
|
|
16
16
|
import { createLsCommand } from './ls.command.js';
|
|
17
17
|
import { createAddCommand } from './add.command.js';
|
|
18
|
+
import { createInitRemoteCommand } from './init-remote.command.js';
|
|
18
19
|
import { getCliI18n } from '../../i18n.js';
|
|
19
20
|
/**
|
|
20
21
|
* Create the repo command with all subcommands
|
|
@@ -25,6 +26,7 @@ export function createRepoCommand() {
|
|
|
25
26
|
.description(t('cli:commands.repo.description'))
|
|
26
27
|
.addCommand(createLsCommand())
|
|
27
28
|
.addCommand(createShowCommand())
|
|
28
|
-
.addCommand(createAddCommand())
|
|
29
|
+
.addCommand(createAddCommand())
|
|
30
|
+
.addCommand(createInitRemoteCommand());
|
|
29
31
|
return repo;
|
|
30
32
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo Init-Remote Command
|
|
3
|
+
*
|
|
4
|
+
* Creates a GitHub repository from a local repo that has no remote,
|
|
5
|
+
* configures the origin remote, and pushes the current branch.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* shep repo init-remote # Private repo, name from cwd basename
|
|
9
|
+
* shep repo init-remote my-project # Explicit repo name
|
|
10
|
+
* shep repo init-remote --public # Public repo
|
|
11
|
+
* shep repo init-remote --org myorg # Create under an organization
|
|
12
|
+
*/
|
|
13
|
+
import { Command } from 'commander';
|
|
14
|
+
export declare function createInitRemoteCommand(): Command;
|
|
15
|
+
//# sourceMappingURL=init-remote.command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-remote.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/repo/init-remote.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,uBAAuB,IAAI,OAAO,CA6BjD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo Init-Remote Command
|
|
3
|
+
*
|
|
4
|
+
* Creates a GitHub repository from a local repo that has no remote,
|
|
5
|
+
* configures the origin remote, and pushes the current branch.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* shep repo init-remote # Private repo, name from cwd basename
|
|
9
|
+
* shep repo init-remote my-project # Explicit repo name
|
|
10
|
+
* shep repo init-remote --public # Public repo
|
|
11
|
+
* shep repo init-remote --org myorg # Create under an organization
|
|
12
|
+
*/
|
|
13
|
+
import { Command } from 'commander';
|
|
14
|
+
import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
|
|
15
|
+
import { InitRemoteRepositoryUseCase } from '../../../../../packages/core/src/application/use-cases/repositories/init-remote-repository.use-case.js';
|
|
16
|
+
import { messages, colors } from '../../ui/index.js';
|
|
17
|
+
import { getCliI18n } from '../../i18n.js';
|
|
18
|
+
export function createInitRemoteCommand() {
|
|
19
|
+
const t = getCliI18n().t;
|
|
20
|
+
return new Command('init-remote')
|
|
21
|
+
.description(t('cli:commands.repo.initRemote.description'))
|
|
22
|
+
.argument('[name]', t('cli:commands.repo.initRemote.nameArgument'))
|
|
23
|
+
.option('--public', t('cli:commands.repo.initRemote.publicOption'))
|
|
24
|
+
.option('--org <name>', t('cli:commands.repo.initRemote.orgOption'))
|
|
25
|
+
.action(async (name, options) => {
|
|
26
|
+
try {
|
|
27
|
+
const useCase = container.resolve(InitRemoteRepositoryUseCase);
|
|
28
|
+
const cwd = process.cwd();
|
|
29
|
+
const result = await useCase.execute({
|
|
30
|
+
cwd,
|
|
31
|
+
name,
|
|
32
|
+
isPrivate: !options.public,
|
|
33
|
+
org: options.org,
|
|
34
|
+
});
|
|
35
|
+
messages.success(t('cli:commands.repo.initRemote.created', { name: result.name }));
|
|
36
|
+
console.log(` ${colors.muted(t('cli:commands.repo.initRemote.urlLabel'))} ${colors.accent(result.url)}`);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
40
|
+
messages.error(t('cli:commands.repo.initRemote.failed'), err);
|
|
41
|
+
process.exitCode = 1;
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
@@ -23,7 +23,6 @@ import { initializeNotificationWatcher, getNotificationWatcher, } from '../../..
|
|
|
23
23
|
import { initializePrSyncWatcher, getPrSyncWatcher, } from '../../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js';
|
|
24
24
|
import { initializeAutoArchiveWatcher, getAutoArchiveWatcher, } from '../../../../packages/core/src/infrastructure/services/auto-archive/auto-archive-watcher.service.js';
|
|
25
25
|
import { getExistingConnection } from '../../../../packages/core/src/infrastructure/persistence/sqlite/connection.js';
|
|
26
|
-
import { BrowserOpenerService } from '../../../../packages/core/src/infrastructure/services/browser-opener.service.js';
|
|
27
26
|
import { colors, fmt, messages } from '../ui/index.js';
|
|
28
27
|
import { getCliI18n } from '../i18n.js';
|
|
29
28
|
function parsePort(value) {
|
|
@@ -83,7 +82,7 @@ Examples:
|
|
|
83
82
|
messages.newline();
|
|
84
83
|
// Auto-open browser (unless --no-open)
|
|
85
84
|
if (options.open !== false) {
|
|
86
|
-
const opener =
|
|
85
|
+
const opener = container.resolve('IBrowserOpener');
|
|
87
86
|
opener.open(url);
|
|
88
87
|
}
|
|
89
88
|
// Handle graceful shutdown via SIGINT/SIGTERM
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Feature } from '../../../../../packages/core/src/domain/generated/output.js';
|
|
2
|
+
interface Attachment {
|
|
3
|
+
path: string;
|
|
4
|
+
name: string;
|
|
5
|
+
notes?: string;
|
|
6
|
+
}
|
|
7
|
+
interface CreateFeatureFromRemoteInput {
|
|
8
|
+
/** GitHub URL or owner/repo shorthand */
|
|
9
|
+
remoteUrl: string;
|
|
10
|
+
description: string;
|
|
11
|
+
attachments?: Attachment[];
|
|
12
|
+
sessionId?: string;
|
|
13
|
+
approvalGates?: {
|
|
14
|
+
allowPrd: boolean;
|
|
15
|
+
allowPlan: boolean;
|
|
16
|
+
allowMerge?: boolean;
|
|
17
|
+
};
|
|
18
|
+
push?: boolean;
|
|
19
|
+
openPr?: boolean;
|
|
20
|
+
parentId?: string;
|
|
21
|
+
fast?: boolean;
|
|
22
|
+
pending?: boolean;
|
|
23
|
+
agentType?: string;
|
|
24
|
+
model?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function createFeatureFromRemote(input: CreateFeatureFromRemoteInput): Promise<{
|
|
27
|
+
feature?: Feature;
|
|
28
|
+
error?: string;
|
|
29
|
+
}>;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=create-feature-from-remote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-feature-from-remote.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature-from-remote.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAQpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAQD,UAAU,4BAA4B;IACpC,yCAAyC;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuFhD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
'use server';
|
|
2
|
+
import { resolve } from '../../lib/server-container.js';
|
|
3
|
+
import { GitHubAuthError, GitHubUrlParseError, GitHubCloneError, } from '../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
|
|
4
|
+
import { composeUserInput } from './compose-user-input.js';
|
|
5
|
+
export async function createFeatureFromRemote(input) {
|
|
6
|
+
const { remoteUrl, description, attachments, sessionId, approvalGates, push, openPr, parentId, fast, pending, agentType, model, } = input;
|
|
7
|
+
if (!remoteUrl?.trim()) {
|
|
8
|
+
return { error: 'GitHub URL is required' };
|
|
9
|
+
}
|
|
10
|
+
if (!description?.trim()) {
|
|
11
|
+
return { error: 'Description is required' };
|
|
12
|
+
}
|
|
13
|
+
const userInput = composeUserInput(description, attachments);
|
|
14
|
+
const gates = {
|
|
15
|
+
allowPrd: approvalGates?.allowPrd ?? false,
|
|
16
|
+
allowPlan: approvalGates?.allowPlan ?? false,
|
|
17
|
+
allowMerge: approvalGates?.allowMerge ?? false,
|
|
18
|
+
};
|
|
19
|
+
try {
|
|
20
|
+
const useCase = resolve('CreateFeatureFromRemoteUseCase');
|
|
21
|
+
// Phase 1 (fast): import repo + create DB record — returns immediately
|
|
22
|
+
const { feature, shouldSpawn } = await useCase.createRecord({
|
|
23
|
+
remoteUrl,
|
|
24
|
+
userInput,
|
|
25
|
+
approvalGates: gates,
|
|
26
|
+
push: push ?? false,
|
|
27
|
+
openPr: openPr ?? false,
|
|
28
|
+
...(parentId ? { parentId } : {}),
|
|
29
|
+
description,
|
|
30
|
+
...(fast ? { fast } : {}),
|
|
31
|
+
...(pending ? { pending } : {}),
|
|
32
|
+
...(agentType ? { agentType } : {}),
|
|
33
|
+
...(model ? { model } : {}),
|
|
34
|
+
});
|
|
35
|
+
// Phase 2 (background): metadata generation, worktree, spec, agent spawn
|
|
36
|
+
useCase
|
|
37
|
+
.initializeAndSpawn(feature, {
|
|
38
|
+
remoteUrl,
|
|
39
|
+
userInput,
|
|
40
|
+
approvalGates: gates,
|
|
41
|
+
push: push ?? false,
|
|
42
|
+
openPr: openPr ?? false,
|
|
43
|
+
...(parentId ? { parentId } : {}),
|
|
44
|
+
...(fast ? { fast } : {}),
|
|
45
|
+
...(pending ? { pending } : {}),
|
|
46
|
+
...(agentType ? { agentType } : {}),
|
|
47
|
+
...(model ? { model } : {}),
|
|
48
|
+
...(sessionId ? { sessionId } : {}),
|
|
49
|
+
}, shouldSpawn)
|
|
50
|
+
.catch((err) => {
|
|
51
|
+
// eslint-disable-next-line no-console
|
|
52
|
+
console.error('[createFeatureFromRemote] initializeAndSpawn failed:', err);
|
|
53
|
+
});
|
|
54
|
+
return { feature };
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (error instanceof GitHubAuthError) {
|
|
58
|
+
return { error: 'GitHub CLI is not authenticated. Run `gh auth login` to sign in.' };
|
|
59
|
+
}
|
|
60
|
+
if (error instanceof GitHubUrlParseError) {
|
|
61
|
+
return { error: `Invalid GitHub URL: ${error.message}` };
|
|
62
|
+
}
|
|
63
|
+
if (error instanceof GitHubCloneError) {
|
|
64
|
+
return { error: `Clone failed: ${error.message}` };
|
|
65
|
+
}
|
|
66
|
+
const message = error instanceof Error ? error.message : 'Failed to create feature from remote';
|
|
67
|
+
return { error: message };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"import-github-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/import-github-repository.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAOvE,UAAU,2BAA2B;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"import-github-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/import-github-repository.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAOvE,UAAU,2BAA2B;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBxE"}
|
|
@@ -9,7 +9,7 @@ export async function importGitHubRepository(input) {
|
|
|
9
9
|
try {
|
|
10
10
|
const useCase = resolve('ImportGitHubRepositoryUseCase');
|
|
11
11
|
const repository = await useCase.execute({ url, dest });
|
|
12
|
-
return { repository };
|
|
12
|
+
return { repository, forked: repository.isFork === true };
|
|
13
13
|
}
|
|
14
14
|
catch (error) {
|
|
15
15
|
if (error instanceof GitHubAuthError) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAU5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AA+BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAU5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,OAAO,CAAC;IACnB,uFAAuF;IACvF,WAAW,EAAE,OAAO,CAAC;IACrB,gFAAgF;IAChF,kBAAkB,EAAE,OAAO,CAAC;IAC5B,uDAAuD;IACvD,YAAY,EAAE,OAAO,CAAC;IACtB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAyED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,+EAA+E;IAC/E,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAClC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,eAAe,GAChB,EAAE,wBAAwB,2CAqgC1B;AAsJD,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,eAAe,EACf,QAAQ,GACT,EAAE,uBAAuB,2CA0NzB"}
|
package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js
CHANGED
|
@@ -644,7 +644,7 @@ export function RepositoryCombobox({ repositories, value, onChange, onAddReposit
|
|
|
644
644
|
setQuery('');
|
|
645
645
|
}
|
|
646
646
|
}, [open]);
|
|
647
|
-
return (_jsxs(_Fragment, { children: [_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", role: "combobox", "aria-expanded": open, "aria-label": "Repository", disabled: disabled, "data-testid": "repository-combobox", className: cn('border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50', !selectedRepo && 'text-muted-foreground'), children: [_jsx("span", { className: "truncate", children: selectedRepo ? selectedRepo.name : 'Select repository...' }), _jsx(ChevronsUpDown, { className: "ms-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-80 p-0", align: "start", "data-testid": "repository-combobox-content", children: _jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: "border-b p-2", children: _jsx(Input, { ref: inputRef, placeholder: t('createDrawer.searchRepositories'), value: query, onChange: (e) => setQuery(e.target.value), className: "h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0", "data-testid": "repository-search" }) }), _jsx("div", { className: "max-h-48 overflow-y-auto py-1", role: "listbox", "aria-label": "Repositories", children: filtered.length === 0 ? (_jsx("p", { className: "text-muted-foreground px-3 py-2 text-sm", "data-testid": "repository-empty", children: "No repositories found." })) : (filtered.map((r) => (_jsxs("button", { type: "button", role: "option", "aria-selected": value === r.path, onClick: () => handleSelect(r.path), className: cn('hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm', value === r.path && 'bg-accent/50'), "data-testid": `repository-option-${r.id}`, children: [_jsx(CheckIcon, { className: cn('h-4 w-4 shrink-0', value !== r.path && 'invisible') }), _jsxs("span", { className: "flex flex-col items-start truncate", children: [
|
|
647
|
+
return (_jsxs(_Fragment, { children: [_jsxs(Popover, { open: open, onOpenChange: setOpen, children: [_jsx(PopoverTrigger, { asChild: true, children: _jsxs("button", { type: "button", role: "combobox", "aria-expanded": open, "aria-label": "Repository", disabled: disabled, "data-testid": "repository-combobox", className: cn('border-input bg-background ring-offset-background focus:ring-ring flex h-9 w-full items-center justify-between rounded-md border px-3 py-2 text-sm focus:ring-2 focus:ring-offset-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50', !selectedRepo && 'text-muted-foreground'), children: [_jsx("span", { className: "truncate", children: selectedRepo ? selectedRepo.name : 'Select repository...' }), _jsx(ChevronsUpDown, { className: "ms-2 h-4 w-4 shrink-0 opacity-50" })] }) }), _jsx(PopoverContent, { className: "w-80 p-0", align: "start", "data-testid": "repository-combobox-content", children: _jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: "border-b p-2", children: _jsx(Input, { ref: inputRef, placeholder: t('createDrawer.searchRepositories'), value: query, onChange: (e) => setQuery(e.target.value), className: "h-8 border-0 p-0 text-sm shadow-none focus-visible:ring-0", "data-testid": "repository-search" }) }), _jsx("div", { className: "max-h-48 overflow-y-auto py-1", role: "listbox", "aria-label": "Repositories", children: filtered.length === 0 ? (_jsx("p", { className: "text-muted-foreground px-3 py-2 text-sm", "data-testid": "repository-empty", children: "No repositories found." })) : (filtered.map((r) => (_jsxs("button", { type: "button", role: "option", "aria-selected": value === r.path, onClick: () => handleSelect(r.path), className: cn('hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm', value === r.path && 'bg-accent/50'), "data-testid": `repository-option-${r.id}`, children: [_jsx(CheckIcon, { className: cn('h-4 w-4 shrink-0', value !== r.path && 'invisible') }), _jsxs("span", { className: "flex flex-col items-start truncate", children: [_jsxs("span", { className: "flex items-center gap-1.5 truncate", children: [r.name, r.isFork ? (_jsxs(Badge, { variant: "outline", className: "h-4 shrink-0 px-1 text-[10px]", children: [_jsx(GitFork, { className: "mr-0.5 h-2.5 w-2.5" }), "Fork"] })) : null] }), _jsx("span", { className: "text-muted-foreground truncate text-xs", children: r.path })] })] }, r.id)))) }), _jsx(Separator, {}), _jsxs("button", { type: "button", onClick: handleAddRepository, disabled: isAdding, className: "hover:bg-accent hover:text-accent-foreground flex w-full items-center gap-2 px-3 py-2 text-sm", "data-testid": "add-repository-item", children: [isAdding ? (_jsx(Loader2, { className: "h-4 w-4 shrink-0 animate-spin" })) : (_jsx(FolderPlus, { className: "h-4 w-4 shrink-0" })), _jsx("span", { children: "Add new repository..." })] }), addError ? (_jsx("p", { className: "px-3 pb-2 text-xs text-red-500", "data-testid": "add-repository-error", children: addError })) : null] }) })] }), _jsx(ReactFileManagerDialog, { open: showReactPicker, onOpenChange: (isOpen) => {
|
|
648
648
|
if (!isOpen)
|
|
649
649
|
setShowReactPicker(false);
|
|
650
650
|
}, onSelect: handleReactPickerSelect })] }));
|
|
@@ -11,4 +11,6 @@ export declare const EmptyList: Story;
|
|
|
11
11
|
export declare const PreSelected: Story;
|
|
12
12
|
/** Disabled state — combobox trigger button is non-interactive. */
|
|
13
13
|
export declare const Disabled: Story;
|
|
14
|
+
/** Repositories with fork badges — forked repos show a "Fork" badge next to their name. */
|
|
15
|
+
export declare const WithForkBadges: Story;
|
|
14
16
|
//# sourceMappingURL=repository-combobox.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-combobox.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/repository-combobox.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"repository-combobox.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/repository-combobox.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AA6B7D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,kBAAkB,CAOzC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,kBAAkB,CAAC,CAAC;AA+BjD,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,8FAA8F;AAC9F,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAEF,2FAA2F;AAC3F,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC"}
|