@shepai/cli 1.127.3 → 1.128.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/apis/json-schema/EnvironmentConfig.yaml +3 -0
  2. package/apis/json-schema/FeatureFlags.yaml +5 -0
  3. package/apis/json-schema/Repository.yaml +3 -0
  4. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +4 -0
  5. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +118 -0
  7. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts.map +1 -0
  8. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.js +58 -0
  9. package/dist/packages/core/src/application/ports/output/services/index.d.ts +2 -0
  10. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  11. package/dist/packages/core/src/application/ports/output/services/index.js +1 -0
  12. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts +31 -0
  13. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts.map +1 -0
  14. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.js +86 -0
  15. package/dist/packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.d.ts +13 -0
  16. package/dist/packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.d.ts.map +1 -0
  17. package/dist/packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.js +35 -0
  18. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  19. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +2 -0
  20. package/dist/packages/core/src/domain/generated/output.d.ts +12 -0
  21. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  23. package/dist/packages/core/src/infrastructure/di/container.js +12 -0
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts +1 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts.map +1 -1
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js +2 -0
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  29. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -0
  30. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-add-repository-remote-url.d.ts +12 -0
  31. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-add-repository-remote-url.d.ts.map +1 -0
  32. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-add-repository-remote-url.js +29 -0
  33. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/041-add-feature-flag-github-import.d.ts +11 -0
  34. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/041-add-feature-flag-github-import.d.ts.map +1 -0
  35. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/041-add-feature-flag-github-import.js +17 -0
  36. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +3 -0
  37. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -1
  38. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +38 -2
  39. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  40. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  41. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +18 -0
  42. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -0
  43. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +171 -0
  44. package/dist/src/presentation/cli/commands/repo/add.command.d.ts +13 -0
  45. package/dist/src/presentation/cli/commands/repo/add.command.d.ts.map +1 -0
  46. package/dist/src/presentation/cli/commands/repo/add.command.js +82 -0
  47. package/dist/src/presentation/cli/commands/repo/index.d.ts +1 -0
  48. package/dist/src/presentation/cli/commands/repo/index.d.ts.map +1 -1
  49. package/dist/src/presentation/cli/commands/repo/index.js +4 -1
  50. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts +33 -0
  51. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts.map +1 -0
  52. package/dist/src/presentation/tui/wizards/github-import.wizard.js +121 -0
  53. package/dist/src/presentation/web/app/actions/import-github-repository.d.ts +11 -0
  54. package/dist/src/presentation/web/app/actions/import-github-repository.d.ts.map +1 -0
  55. package/dist/src/presentation/web/app/actions/import-github-repository.js +27 -0
  56. package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts +11 -0
  57. package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts.map +1 -0
  58. package/dist/src/presentation/web/app/actions/list-github-repositories.js +17 -0
  59. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.d.ts +4 -3
  60. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.d.ts.map +1 -1
  61. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.js +22 -5
  62. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.d.ts +8 -0
  63. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.d.ts.map +1 -0
  64. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.js +33 -0
  65. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.d.ts +10 -0
  66. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.d.ts.map +1 -0
  67. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.js +26 -0
  68. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts +15 -0
  69. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts.map +1 -0
  70. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js +52 -0
  71. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts +10 -0
  72. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts.map +1 -0
  73. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.js +78 -0
  74. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.d.ts +7 -0
  75. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.d.ts.map +1 -0
  76. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.js +46 -0
  77. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.stories.d.ts +10 -0
  78. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.stories.d.ts.map +1 -0
  79. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.stories.js +29 -0
  80. package/dist/src/presentation/web/components/common/github-import-dialog/index.d.ts +4 -0
  81. package/dist/src/presentation/web/components/common/github-import-dialog/index.d.ts.map +1 -0
  82. package/dist/src/presentation/web/components/common/github-import-dialog/index.js +3 -0
  83. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  84. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +9 -1
  85. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  86. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +3 -0
  87. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  88. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +5 -0
  89. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  90. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
  91. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  92. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +56 -27
  93. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  94. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +7 -1
  95. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  96. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
  97. package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
  98. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  99. package/dist/src/presentation/web/lib/feature-flags.js +5 -0
  100. package/dist/tsconfig.build.tsbuildinfo +1 -1
  101. package/package.json +1 -1
  102. package/web/.next/BUILD_ID +1 -1
  103. package/web/.next/build-manifest.json +2 -2
  104. package/web/.next/fallback-build-manifest.json +2 -2
  105. package/web/.next/prerender-manifest.json +3 -3
  106. package/web/.next/required-server-files.js +2 -2
  107. package/web/.next/required-server-files.json +2 -2
  108. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +74 -44
  109. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
  110. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +74 -44
  113. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  114. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  115. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +86 -56
  117. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
  118. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  119. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +86 -56
  121. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  122. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  123. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  124. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +70 -40
  125. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  126. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  127. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +74 -44
  129. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  130. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  131. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  132. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +86 -56
  133. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
  134. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  135. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  136. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +86 -56
  137. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  138. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  139. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +70 -40
  141. package/web/.next/server/app/(dashboard)/page.js +3 -3
  142. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  143. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +70 -40
  145. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  146. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  147. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  148. package/web/.next/server/app/_global-error.html +2 -2
  149. package/web/.next/server/app/_global-error.rsc +1 -1
  150. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  151. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  152. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  153. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  154. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  155. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +32 -2
  156. package/web/.next/server/app/_not-found/page.js +1 -1
  157. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  158. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  159. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  160. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  161. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  162. package/web/.next/server/app/settings/page/server-reference-manifest.json +42 -12
  163. package/web/.next/server/app/settings/page.js +2 -2
  164. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  165. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  166. package/web/.next/server/app/skills/page/server-reference-manifest.json +42 -12
  167. package/web/.next/server/app/skills/page.js +2 -1
  168. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  169. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  170. package/web/.next/server/app/tools/page/server-reference-manifest.json +42 -12
  171. package/web/.next/server/app/tools/page.js +2 -1
  172. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  173. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  174. package/web/.next/server/app/version/page/server-reference-manifest.json +32 -2
  175. package/web/.next/server/app/version/page.js +2 -2
  176. package/web/.next/server/app/version/page.js.nft.json +1 -1
  177. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  178. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  179. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  180. package/web/.next/server/chunks/[root-of-the-server]__dcd4f847._.js.map +1 -1
  181. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +3 -0
  182. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +1 -0
  183. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  184. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  185. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_8b618f7d._.js +3 -0
  186. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_8b618f7d._.js.map +1 -0
  187. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +3 -0
  188. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +1 -0
  189. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +3 -0
  190. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +1 -0
  191. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js +3 -0
  192. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js.map +1 -0
  193. package/web/.next/server/chunks/ssr/[root-of-the-server]__2f886f77._.js +4 -0
  194. package/web/.next/server/chunks/ssr/[root-of-the-server]__2f886f77._.js.map +1 -0
  195. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +3 -0
  196. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js.map +1 -0
  197. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +4 -0
  198. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -0
  199. package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js +4 -0
  200. package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js.map +1 -0
  201. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  202. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  203. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6cc70784._.js → [root-of-the-server]__755cfe02._.js} +2 -2
  204. package/web/.next/server/chunks/ssr/{[root-of-the-server]__430169b6._.js.map → [root-of-the-server]__755cfe02._.js.map} +1 -1
  205. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +4 -0
  206. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -0
  207. package/web/.next/server/chunks/ssr/{[root-of-the-server]__34323a67._.js → [root-of-the-server]__a21eef5a._.js} +2 -2
  208. package/web/.next/server/chunks/ssr/[root-of-the-server]__a21eef5a._.js.map +1 -0
  209. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1aa034e9._.js → [root-of-the-server]__a628fb91._.js} +2 -2
  210. package/web/.next/server/chunks/ssr/{[root-of-the-server]__e44ae5ca._.js.map → [root-of-the-server]__a628fb91._.js.map} +1 -1
  211. package/web/.next/server/chunks/ssr/{[root-of-the-server]__e44ae5ca._.js → [root-of-the-server]__bfba58e6._.js} +2 -2
  212. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6cc70784._.js.map → [root-of-the-server]__bfba58e6._.js.map} +1 -1
  213. package/web/.next/server/chunks/ssr/{[root-of-the-server]__430169b6._.js → [root-of-the-server]__c3ab8422._.js} +2 -2
  214. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1aa034e9._.js.map → [root-of-the-server]__c3ab8422._.js.map} +1 -1
  215. package/web/.next/server/chunks/ssr/[root-of-the-server]__d61bd462._.js +3 -0
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__d61bd462._.js.map +1 -0
  217. package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js +4 -0
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js.map +1 -0
  219. package/web/.next/server/chunks/ssr/{_918887c5._.js → _0020fddd._.js} +2 -2
  220. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -0
  221. package/web/.next/server/chunks/ssr/_01046927._.js +9 -0
  222. package/web/.next/server/chunks/ssr/_01046927._.js.map +1 -0
  223. package/web/.next/server/chunks/ssr/{_2f6f48b8._.js → _02ec1aea._.js} +2 -2
  224. package/web/.next/server/chunks/ssr/{_2f6f48b8._.js.map → _02ec1aea._.js.map} +1 -1
  225. package/web/.next/server/chunks/ssr/_087a3e78._.js +3 -0
  226. package/web/.next/server/chunks/ssr/_087a3e78._.js.map +1 -0
  227. package/web/.next/server/chunks/ssr/_67104d9e._.js +3 -0
  228. package/web/.next/server/chunks/ssr/_67104d9e._.js.map +1 -0
  229. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  230. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  231. package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
  232. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
  233. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  234. package/web/.next/server/chunks/ssr/_b4b8a636._.js +3 -0
  235. package/web/.next/server/chunks/ssr/_b4b8a636._.js.map +1 -0
  236. package/web/.next/server/chunks/ssr/{_4207f708._.js → _c2314ba5._.js} +2 -2
  237. package/web/.next/server/chunks/ssr/_c2314ba5._.js.map +1 -0
  238. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  239. package/web/.next/server/chunks/ssr/_d8575088._.js +3 -0
  240. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -0
  241. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  242. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  243. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  244. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  245. package/web/.next/server/chunks/ssr/node_modules__pnpm_55c7a131._.js +3 -0
  246. package/web/.next/server/chunks/ssr/node_modules__pnpm_55c7a131._.js.map +1 -0
  247. package/web/.next/server/chunks/ssr/{src_presentation_web_0f98f202._.js → src_presentation_web_39dc6c69._.js} +2 -2
  248. package/web/.next/server/chunks/ssr/{src_presentation_web_0f98f202._.js.map → src_presentation_web_39dc6c69._.js.map} +1 -1
  249. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +5 -0
  250. package/web/.next/server/chunks/ssr/{src_presentation_web_9db47db7._.js.map → src_presentation_web_8e7fe0d1._.js.map} +1 -1
  251. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +3 -0
  252. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +1 -0
  253. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +3 -0
  254. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -0
  255. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +3 -0
  256. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -0
  257. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +5 -0
  258. package/web/.next/server/chunks/ssr/{src_presentation_web_ede4a227._.js.map → src_presentation_web_b9023017._.js.map} +1 -1
  259. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +3 -0
  260. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js.map +1 -0
  261. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  262. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  263. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  264. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  265. package/web/.next/server/pages/500.html +2 -2
  266. package/web/.next/server/server-reference-manifest.js +1 -1
  267. package/web/.next/server/server-reference-manifest.json +520 -294
  268. package/web/.next/static/chunks/1ccaceb64fe9084f.js +1 -0
  269. package/web/.next/static/chunks/314b8314f77d6921.js +1 -0
  270. package/web/.next/static/chunks/3c0cef220743905a.js +1 -0
  271. package/web/.next/static/chunks/3d5d625e02456fab.js +1 -0
  272. package/web/.next/static/chunks/3e1e0f9bde3530d2.js +1 -0
  273. package/web/.next/static/chunks/4b9ea85ea5fbc162.js +1 -0
  274. package/web/.next/static/chunks/601d93593f5f664f.js +1 -0
  275. package/web/.next/static/chunks/688971d5bad5dc7c.js +1 -0
  276. package/web/.next/static/chunks/6d8be29584ad0fdd.js +1 -0
  277. package/web/.next/static/chunks/{62a58d2f3cd5f35f.js → 776e7f0d6b402430.js} +2 -2
  278. package/web/.next/static/chunks/822ed01254f97121.js +1 -0
  279. package/web/.next/static/chunks/8f979abfe5512674.js +1 -0
  280. package/web/.next/static/chunks/98dfbecc5ee30ce1.css +1 -0
  281. package/web/.next/static/chunks/{fa373c6f8139a712.js → c1537a58c2e5625b.js} +2 -2
  282. package/web/.next/static/chunks/d34a91958ca566fa.js +13 -0
  283. package/web/.next/static/chunks/{41c7cee55ef51fc8.js → d534a122561e6231.js} +1 -1
  284. package/web/.next/static/chunks/e22192217a4fc0d4.js +1 -0
  285. package/web/.next/static/chunks/eea5d09deb8afd9a.js +1 -0
  286. package/web/.next/static/chunks/f259386f4875e70c.js +1 -0
  287. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_fbb88113.js +0 -3
  288. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_fbb88113.js.map +0 -1
  289. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_fdfbf5cc.js +0 -3
  290. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_fdfbf5cc.js.map +0 -1
  291. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_d8fa0b5f.js +0 -3
  292. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_d8fa0b5f.js.map +0 -1
  293. package/web/.next/server/chunks/ssr/[root-of-the-server]__02c84e6b._.js +0 -3
  294. package/web/.next/server/chunks/ssr/[root-of-the-server]__02c84e6b._.js.map +0 -1
  295. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +0 -3
  296. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js.map +0 -1
  297. package/web/.next/server/chunks/ssr/[root-of-the-server]__34323a67._.js.map +0 -1
  298. package/web/.next/server/chunks/ssr/[root-of-the-server]__357de47c._.js +0 -4
  299. package/web/.next/server/chunks/ssr/[root-of-the-server]__357de47c._.js.map +0 -1
  300. package/web/.next/server/chunks/ssr/[root-of-the-server]__67fe07fe._.js +0 -4
  301. package/web/.next/server/chunks/ssr/[root-of-the-server]__67fe07fe._.js.map +0 -1
  302. package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js +0 -3
  303. package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js.map +0 -1
  304. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +0 -4
  305. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +0 -1
  306. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +0 -4
  307. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +0 -1
  308. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +0 -4
  309. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js.map +0 -1
  310. package/web/.next/server/chunks/ssr/[root-of-the-server]__a50a7e39._.js +0 -4
  311. package/web/.next/server/chunks/ssr/[root-of-the-server]__a50a7e39._.js.map +0 -1
  312. package/web/.next/server/chunks/ssr/_1bb79fe8._.js +0 -3
  313. package/web/.next/server/chunks/ssr/_1bb79fe8._.js.map +0 -1
  314. package/web/.next/server/chunks/ssr/_4207f708._.js.map +0 -1
  315. package/web/.next/server/chunks/ssr/_583a83fb._.js +0 -3
  316. package/web/.next/server/chunks/ssr/_583a83fb._.js.map +0 -1
  317. package/web/.next/server/chunks/ssr/_918887c5._.js.map +0 -1
  318. package/web/.next/server/chunks/ssr/_9f56cf8f._.js +0 -3
  319. package/web/.next/server/chunks/ssr/_9f56cf8f._.js.map +0 -1
  320. package/web/.next/server/chunks/ssr/_a187fd7e._.js +0 -3
  321. package/web/.next/server/chunks/ssr/_a187fd7e._.js.map +0 -1
  322. package/web/.next/server/chunks/ssr/_a5aa6371._.js +0 -9
  323. package/web/.next/server/chunks/ssr/_a5aa6371._.js.map +0 -1
  324. package/web/.next/server/chunks/ssr/_b730ac57._.js +0 -3
  325. package/web/.next/server/chunks/ssr/_b730ac57._.js.map +0 -1
  326. package/web/.next/server/chunks/ssr/_fae9e550._.js +0 -3
  327. package/web/.next/server/chunks/ssr/_fae9e550._.js.map +0 -1
  328. package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js +0 -3
  329. package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js.map +0 -1
  330. package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js +0 -3
  331. package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js.map +0 -1
  332. package/web/.next/server/chunks/ssr/src_presentation_web_9db47db7._.js +0 -5
  333. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f66cd328.js +0 -3
  334. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f66cd328.js.map +0 -1
  335. package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js +0 -3
  336. package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js.map +0 -1
  337. package/web/.next/server/chunks/ssr/src_presentation_web_ede4a227._.js +0 -5
  338. package/web/.next/static/chunks/01ba448cf76c6014.js +0 -1
  339. package/web/.next/static/chunks/05e9c71e5e4cf531.js +0 -1
  340. package/web/.next/static/chunks/33d2f67ad4814aba.css +0 -1
  341. package/web/.next/static/chunks/534e18ee1fbd8452.js +0 -1
  342. package/web/.next/static/chunks/8080c842b0358904.js +0 -1
  343. package/web/.next/static/chunks/9b2a23851096f1aa.js +0 -1
  344. package/web/.next/static/chunks/a67c9c6125c1aa32.js +0 -1
  345. package/web/.next/static/chunks/a8ba3f3e2b0f87aa.js +0 -1
  346. package/web/.next/static/chunks/abc3f71a05ccbdfe.js +0 -1
  347. package/web/.next/static/chunks/c1f3db103c2b226f.js +0 -1
  348. package/web/.next/static/chunks/cca0f5112a9260d8.js +0 -1
  349. package/web/.next/static/chunks/cd45aed9c46e1bf5.js +0 -11
  350. package/web/.next/static/chunks/d04de4be30ab78ca.js +0 -3
  351. package/web/.next/static/chunks/d47658be0870a4b9.js +0 -1
  352. package/web/.next/static/chunks/d8e86e8e5bb7cc0a.js +0 -1
  353. package/web/.next/static/chunks/f9667ee1e5b445b7.js +0 -1
  354. /package/web/.next/static/{hWrKuop_3FR0syZrFWLvn → aZANFTRivKlrY7NZ-ovtr}/_buildManifest.js +0 -0
  355. /package/web/.next/static/{hWrKuop_3FR0syZrFWLvn → aZANFTRivKlrY7NZ-ovtr}/_clientMiddlewareManifest.json +0 -0
  356. /package/web/.next/static/{hWrKuop_3FR0syZrFWLvn → aZANFTRivKlrY7NZ-ovtr}/_ssgManifest.js +0 -0
@@ -9,10 +9,12 @@
9
9
  * Subcommands:
10
10
  * shep repo ls List tracked repositories
11
11
  * shep repo show <id> Display details of a tracked repository
12
+ * shep repo add Import a GitHub repository
12
13
  */
13
14
  import { Command } from 'commander';
14
15
  import { createShowCommand } from './show.command.js';
15
16
  import { createLsCommand } from './ls.command.js';
17
+ import { createAddCommand } from './add.command.js';
16
18
  /**
17
19
  * Create the repo command with all subcommands
18
20
  */
@@ -20,6 +22,7 @@ export function createRepoCommand() {
20
22
  const repo = new Command('repo')
21
23
  .description('Manage tracked repositories')
22
24
  .addCommand(createLsCommand())
23
- .addCommand(createShowCommand());
25
+ .addCommand(createShowCommand())
26
+ .addCommand(createAddCommand());
24
27
  return repo;
25
28
  }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * GitHub Import Wizard
3
+ *
4
+ * Interactive TUI wizard that guides users through importing a GitHub repository.
5
+ * Offers two paths: paste a GitHub URL or browse the user's repositories.
6
+ * Returns the selected URL/nameWithOwner and optional destination override.
7
+ */
8
+ import type { IGitHubRepositoryService } from '../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
9
+ import type { ListGitHubRepositoriesUseCase } from '../../../../packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.js';
10
+ /**
11
+ * Result returned by the GitHub import wizard.
12
+ */
13
+ export interface GitHubImportWizardResult {
14
+ /** GitHub URL or owner/repo shorthand */
15
+ url: string;
16
+ /** Optional override for clone destination directory */
17
+ dest?: string;
18
+ }
19
+ /**
20
+ * Runs the interactive GitHub import wizard.
21
+ *
22
+ * Steps:
23
+ * 1. Choose import method (URL input or browse repos)
24
+ * 2a. If URL: prompt for URL, validate with parseGitHubUrl
25
+ * 2b. If browse: fetch repos via listUseCase, display select list
26
+ * 3. Optionally prompt for destination directory override
27
+ *
28
+ * @param gitHubService - Service for URL validation
29
+ * @param listUseCase - Use case for listing user repos
30
+ * @returns The selected import target and optional destination
31
+ */
32
+ export declare function githubImportWizard(gitHubService: IGitHubRepositoryService, listUseCase: ListGitHubRepositoriesUseCase): Promise<GitHubImportWizardResult>;
33
+ //# sourceMappingURL=github-import.wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-import.wizard.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/tui/wizards/github-import.wizard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,wBAAwB,EAEzB,MAAM,4EAA4E,CAAC;AAEpF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2EAA2E,CAAC;AAG/H;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAoBD;;;;;;;;;;;;GAYG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,wBAAwB,EACvC,WAAW,EAAE,6BAA6B,GACzC,OAAO,CAAC,wBAAwB,CAAC,CAoCnC"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * GitHub Import Wizard
3
+ *
4
+ * Interactive TUI wizard that guides users through importing a GitHub repository.
5
+ * Offers two paths: paste a GitHub URL or browse the user's repositories.
6
+ * Returns the selected URL/nameWithOwner and optional destination override.
7
+ */
8
+ import { select, input } from '@inquirer/prompts';
9
+ import { GitHubUrlParseError } from '../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
10
+ import { shepTheme } from '../themes/shep.theme.js';
11
+ /**
12
+ * Format a GitHub repo for display in the select list.
13
+ * Shows name, visibility badge, and truncated description.
14
+ */
15
+ function formatRepoChoice(repo) {
16
+ const visibility = repo.isPrivate ? ' (private)' : '';
17
+ return {
18
+ name: `${repo.nameWithOwner}${visibility}`,
19
+ value: repo.nameWithOwner,
20
+ description: repo.description || undefined,
21
+ };
22
+ }
23
+ /**
24
+ * Runs the interactive GitHub import wizard.
25
+ *
26
+ * Steps:
27
+ * 1. Choose import method (URL input or browse repos)
28
+ * 2a. If URL: prompt for URL, validate with parseGitHubUrl
29
+ * 2b. If browse: fetch repos via listUseCase, display select list
30
+ * 3. Optionally prompt for destination directory override
31
+ *
32
+ * @param gitHubService - Service for URL validation
33
+ * @param listUseCase - Use case for listing user repos
34
+ * @returns The selected import target and optional destination
35
+ */
36
+ export async function githubImportWizard(gitHubService, listUseCase) {
37
+ // Step 1: Choose import method
38
+ const method = await select({
39
+ message: 'How would you like to add a GitHub repository?',
40
+ choices: [
41
+ {
42
+ name: 'Paste a GitHub URL',
43
+ value: 'url',
44
+ description: 'Enter a GitHub repository URL or owner/repo shorthand',
45
+ },
46
+ {
47
+ name: 'Browse my repositories',
48
+ value: 'browse',
49
+ description: 'Search and select from your GitHub repositories',
50
+ },
51
+ ],
52
+ theme: shepTheme,
53
+ });
54
+ let url;
55
+ if (method === 'url') {
56
+ url = await promptForUrl(gitHubService);
57
+ }
58
+ else {
59
+ url = await promptForBrowse(listUseCase);
60
+ }
61
+ // Step 3: Optional destination override
62
+ const dest = await promptForDestination();
63
+ const result = { url };
64
+ if (dest) {
65
+ result.dest = dest;
66
+ }
67
+ return result;
68
+ }
69
+ /**
70
+ * Prompt the user for a GitHub URL and validate it.
71
+ * Re-prompts on invalid input until a valid URL is provided.
72
+ */
73
+ async function promptForUrl(gitHubService) {
74
+ const url = await input({
75
+ message: 'Enter a GitHub repository URL or owner/repo',
76
+ validate: (value) => {
77
+ if (!value.trim()) {
78
+ return 'URL is required';
79
+ }
80
+ try {
81
+ gitHubService.parseGitHubUrl(value.trim());
82
+ return true;
83
+ }
84
+ catch (error) {
85
+ if (error instanceof GitHubUrlParseError) {
86
+ return error.message;
87
+ }
88
+ return 'Invalid GitHub URL format. Use https://github.com/owner/repo or owner/repo';
89
+ }
90
+ },
91
+ theme: shepTheme,
92
+ });
93
+ return url.trim();
94
+ }
95
+ /**
96
+ * Prompt the user to browse and select from their GitHub repositories.
97
+ * Fetches repos via the list use case and displays them in a select prompt.
98
+ */
99
+ async function promptForBrowse(listUseCase) {
100
+ const repos = await listUseCase.execute({ limit: 30 });
101
+ if (repos.length === 0) {
102
+ throw new Error('No repositories found. Make sure you have repositories on GitHub.');
103
+ }
104
+ const choices = repos.map(formatRepoChoice);
105
+ const selected = await select({
106
+ message: 'Select a repository to import',
107
+ choices,
108
+ theme: shepTheme,
109
+ });
110
+ return selected;
111
+ }
112
+ /**
113
+ * Optionally prompt for a custom clone destination directory.
114
+ */
115
+ async function promptForDestination() {
116
+ const dest = await input({
117
+ message: 'Clone destination (leave empty for default)',
118
+ theme: shepTheme,
119
+ });
120
+ return dest.trim() || undefined;
121
+ }
@@ -0,0 +1,11 @@
1
+ import type { Repository } from '../../../../../packages/core/src/domain/generated/output.js';
2
+ interface ImportGitHubRepositoryInput {
3
+ url: string;
4
+ dest?: string;
5
+ }
6
+ export declare function importGitHubRepository(input: ImportGitHubRepositoryInput): Promise<{
7
+ repository?: Repository;
8
+ error?: string;
9
+ }>;
10
+ export {};
11
+ //# sourceMappingURL=import-github-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-github-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/import-github-repository.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAOvE,UAAU,2BAA2B;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBtD"}
@@ -0,0 +1,27 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ import { GitHubAuthError, GitHubUrlParseError, GitHubCloneError, } from '../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
4
+ export async function importGitHubRepository(input) {
5
+ const { url, dest } = input;
6
+ if (!url?.trim()) {
7
+ return { error: 'GitHub URL is required' };
8
+ }
9
+ try {
10
+ const useCase = resolve('ImportGitHubRepositoryUseCase');
11
+ const repository = await useCase.execute({ url, dest });
12
+ return { repository };
13
+ }
14
+ catch (error) {
15
+ if (error instanceof GitHubAuthError) {
16
+ return { error: 'GitHub CLI is not authenticated. Run `gh auth login` to sign in.' };
17
+ }
18
+ if (error instanceof GitHubUrlParseError) {
19
+ return { error: `Invalid GitHub URL: ${error.message}` };
20
+ }
21
+ if (error instanceof GitHubCloneError) {
22
+ return { error: `Clone failed: ${error.message}` };
23
+ }
24
+ const message = error instanceof Error ? error.message : 'Failed to import repository';
25
+ return { error: message };
26
+ }
27
+ }
@@ -0,0 +1,11 @@
1
+ import type { GitHubRepo } from '../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
2
+ interface ListGitHubRepositoriesInput {
3
+ search?: string;
4
+ limit?: number;
5
+ }
6
+ export declare function listGitHubRepositories(input?: ListGitHubRepositoriesInput): Promise<{
7
+ repos?: GitHubRepo[];
8
+ error?: string;
9
+ }>;
10
+ export {};
11
+ //# sourceMappingURL=list-github-repositories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-github-repositories.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/list-github-repositories.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oFAAoF,CAAC;AAGrH,UAAU,2BAA2B;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,CAAC,EAAE,2BAA2B,GAClC,OAAO,CAAC;IAAE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAYnD"}
@@ -0,0 +1,17 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ import { GitHubAuthError } from '../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
4
+ export async function listGitHubRepositories(input) {
5
+ try {
6
+ const useCase = resolve('ListGitHubRepositoriesUseCase');
7
+ const repos = await useCase.execute(input);
8
+ return { repos };
9
+ }
10
+ catch (error) {
11
+ if (error instanceof GitHubAuthError) {
12
+ return { error: 'GitHub CLI is not authenticated. Run `gh auth login` to sign in.' };
13
+ }
14
+ const message = error instanceof Error ? error.message : 'Failed to list repositories';
15
+ return { error: message };
16
+ }
17
+ }
@@ -1,6 +1,7 @@
1
- interface AddRepositoryButtonProps {
1
+ import type { Repository } from '../../../../../../packages/core/src/domain/generated/output.js';
2
+ export interface AddRepositoryButtonProps {
2
3
  onSelect?: (path: string) => void;
4
+ onGitHubImport?: (repository: Repository) => void;
3
5
  }
4
- export declare function AddRepositoryButton({ onSelect }: AddRepositoryButtonProps): import("react/jsx-runtime").JSX.Element;
5
- export {};
6
+ export declare function AddRepositoryButton({ onSelect, onGitHubImport }: AddRepositoryButtonProps): import("react/jsx-runtime").JSX.Element;
6
7
  //# sourceMappingURL=add-repository-button.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"add-repository-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/add-repository-button/add-repository-button.tsx"],"names":[],"mappings":"AAQA,UAAU,wBAAwB;IAChC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,EAAE,wBAAwB,2CAuCzE"}
1
+ {"version":3,"file":"add-repository-button.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/add-repository-button/add-repository-button.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAEvE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CACnD;AAED,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAE,wBAAwB,2CA2FzF"}
@@ -1,13 +1,20 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState } from 'react';
4
- import { FolderPlus, Loader2 } from 'lucide-react';
4
+ import { FolderPlus, Github, Loader2, Plus } from 'lucide-react';
5
5
  import { Button } from '../../ui/button.js';
6
6
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
7
+ import { Popover, PopoverContent, PopoverTrigger } from '../../ui/popover.js';
8
+ import { GitHubImportDialog } from '../../common/github-import-dialog/index.js';
7
9
  import { pickFolder } from './pick-folder.js';
8
- export function AddRepositoryButton({ onSelect }) {
10
+ import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
11
+ export function AddRepositoryButton({ onSelect, onGitHubImport }) {
12
+ const featureFlags = useFeatureFlags();
9
13
  const [loading, setLoading] = useState(false);
10
- async function handleClick() {
14
+ const [popoverOpen, setPopoverOpen] = useState(false);
15
+ const [githubDialogOpen, setGithubDialogOpen] = useState(false);
16
+ async function handleLocalFolder() {
17
+ setPopoverOpen(false);
11
18
  if (loading)
12
19
  return;
13
20
  setLoading(true);
@@ -21,5 +28,15 @@ export function AddRepositoryButton({ onSelect }) {
21
28
  setLoading(false);
22
29
  }
23
30
  }
24
- return (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Add Repository", "data-testid": "add-repository-button", onClick: handleClick, disabled: loading, children: loading ? (_jsx(Loader2, { className: "h-5 w-5 animate-spin" })) : (_jsx(FolderPlus, { className: "h-5 w-5" })) }) }), _jsx(TooltipContent, { children: "Add Repository" })] }) }));
31
+ function handleFromGitHub() {
32
+ setPopoverOpen(false);
33
+ setGithubDialogOpen(true);
34
+ }
35
+ function handleImportComplete(repository) {
36
+ onGitHubImport?.(repository);
37
+ if (repository.path) {
38
+ onSelect?.(repository.path);
39
+ }
40
+ }
41
+ return (_jsxs(_Fragment, { children: [_jsxs(Popover, { open: popoverOpen, onOpenChange: setPopoverOpen, children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(PopoverTrigger, { asChild: true, children: _jsx(Button, { variant: "ghost", size: "icon", "aria-label": "Add Repository", "data-testid": "add-repository-button", disabled: loading, children: loading ? (_jsx(Loader2, { className: "h-5 w-5 animate-spin" })) : (_jsx(Plus, { className: "h-5 w-5" })) }) }) }), _jsx(TooltipContent, { children: "Add Repository" })] }) }), _jsxs(PopoverContent, { className: "w-48 p-1", align: "start", children: [_jsxs("button", { type: "button", className: "hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm", onClick: handleLocalFolder, "data-testid": "add-repo-local-folder", children: [_jsx(FolderPlus, { className: "h-4 w-4" }), "Local folder"] }), featureFlags.githubImport ? (_jsxs("button", { type: "button", className: "hover:bg-accent flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm", onClick: handleFromGitHub, "data-testid": "add-repo-from-github", children: [_jsx(Github, { className: "h-4 w-4" }), "From GitHub"] })) : null] })] }), featureFlags.githubImport ? (_jsx(GitHubImportDialog, { open: githubDialogOpen, onOpenChange: setGithubDialogOpen, onImportComplete: handleImportComplete })) : null] }));
25
42
  }
@@ -0,0 +1,8 @@
1
+ import type { Repository } from '../../../../../../packages/core/src/domain/generated/output.js';
2
+ export interface GitHubImportDialogProps {
3
+ open: boolean;
4
+ onOpenChange: (open: boolean) => void;
5
+ onImportComplete: (repository: Repository) => void;
6
+ }
7
+ export declare function GitHubImportDialog({ open, onOpenChange, onImportComplete, }: GitHubImportDialogProps): import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=github-import-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-import-dialog.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-import-dialog.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAEvE,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,gBAAgB,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CACpD;AAED,wBAAgB,kBAAkB,CAAC,EACjC,IAAI,EACJ,YAAY,EACZ,gBAAgB,GACjB,EAAE,uBAAuB,2CAqDzB"}
@@ -0,0 +1,33 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState } from 'react';
4
+ import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, } from '../../ui/dialog.js';
5
+ import { Tabs, TabsContent, TabsList, TabsTrigger } from '../../ui/tabs.js';
6
+ import { GitHubUrlInput } from './github-url-input.js';
7
+ import { GitHubRepoBrowser } from './github-repo-browser.js';
8
+ import { importGitHubRepository } from '../../../app/actions/import-github-repository.js';
9
+ export function GitHubImportDialog({ open, onOpenChange, onImportComplete, }) {
10
+ const [importing, setImporting] = useState(false);
11
+ const [error, setError] = useState('');
12
+ async function handleImport(url) {
13
+ setImporting(true);
14
+ setError('');
15
+ try {
16
+ const result = await importGitHubRepository({ url });
17
+ if (result.error) {
18
+ setError(result.error);
19
+ }
20
+ else if (result.repository) {
21
+ onImportComplete(result.repository);
22
+ onOpenChange(false);
23
+ }
24
+ }
25
+ catch {
26
+ setError('An unexpected error occurred');
27
+ }
28
+ finally {
29
+ setImporting(false);
30
+ }
31
+ }
32
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, children: _jsxs(DialogContent, { className: "overflow-hidden sm:max-w-lg", children: [_jsxs(DialogHeader, { children: [_jsx(DialogTitle, { children: "Import from GitHub" }), _jsx(DialogDescription, { children: "Clone a GitHub repository and add it to Shep." })] }), _jsxs(Tabs, { defaultValue: "url", className: "min-w-0", children: [_jsxs(TabsList, { className: "grid w-full grid-cols-2", children: [_jsx(TabsTrigger, { value: "url", children: "URL" }), _jsx(TabsTrigger, { value: "browse", children: "Browse" })] }), _jsx(TabsContent, { value: "url", className: "mt-4", children: _jsx(GitHubUrlInput, { onSubmit: handleImport, loading: importing }) }), _jsx(TabsContent, { value: "browse", className: "mt-4", children: _jsx(GitHubRepoBrowser, { onSelect: handleImport, loading: importing }) })] }), error ? (_jsx("p", { className: "text-destructive text-sm", role: "alert", children: error })) : null] }) }));
33
+ }
@@ -0,0 +1,10 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { GitHubImportDialog } from './github-import-dialog.js';
3
+ declare const meta: Meta<typeof GitHubImportDialog>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof GitHubImportDialog>;
6
+ export declare const Default: Story;
7
+ export declare const URLTab: Story;
8
+ export declare const BrowseTab: Story;
9
+ export declare const Loading: Story;
10
+ //# sourceMappingURL=github-import-dialog.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-import-dialog.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,kBAAkB,CAYzC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjD,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,MAAM,EAAE,KAEpB,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAEvB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { fn } from '@storybook/test';
2
+ import { GitHubImportDialog } from './github-import-dialog.js';
3
+ const meta = {
4
+ title: 'Composed/GitHubImportDialog',
5
+ component: GitHubImportDialog,
6
+ tags: ['autodocs'],
7
+ parameters: {
8
+ layout: 'centered',
9
+ },
10
+ args: {
11
+ open: true,
12
+ onOpenChange: fn().mockName('onOpenChange'),
13
+ onImportComplete: fn().mockName('onImportComplete'),
14
+ },
15
+ };
16
+ export default meta;
17
+ export const Default = {};
18
+ export const URLTab = {
19
+ // Default tab is URL, so this is the same as Default
20
+ };
21
+ export const BrowseTab = {
22
+ // User clicks Browse tab to see repo list
23
+ };
24
+ export const Loading = {
25
+ // Loading state happens during import — interact with the story to see it
26
+ };
@@ -0,0 +1,15 @@
1
+ import type { GitHubRepo } from '../../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
2
+ export interface GitHubRepoBrowserProps {
3
+ onSelect: (nameWithOwner: string) => void;
4
+ loading?: boolean;
5
+ /** Override the fetch function for testing/stories */
6
+ fetchRepos?: (input?: {
7
+ search?: string;
8
+ limit?: number;
9
+ }) => Promise<{
10
+ repos?: GitHubRepo[];
11
+ error?: string;
12
+ }>;
13
+ }
14
+ export declare function GitHubRepoBrowser({ onSelect, loading: externalLoading, fetchRepos, }: GitHubRepoBrowserProps): import("react/jsx-runtime").JSX.Element;
15
+ //# sourceMappingURL=github-repo-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-repo-browser.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-repo-browser.tsx"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oFAAoF,CAAC;AAErH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzD;AAED,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,OAAO,EAAE,eAAuB,EAChC,UAAmC,GACpC,EAAE,sBAAsB,2CAsIxB"}
@@ -0,0 +1,52 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useRef, useState } from 'react';
4
+ import { Lock, Globe, Loader2, Search, AlertCircle } from 'lucide-react';
5
+ import { Input } from '../../ui/input.js';
6
+ import { Badge } from '../../ui/badge.js';
7
+ import { Skeleton } from '../../ui/skeleton.js';
8
+ import { listGitHubRepositories } from '../../../app/actions/list-github-repositories.js';
9
+ export function GitHubRepoBrowser({ onSelect, loading: externalLoading = false, fetchRepos = listGitHubRepositories, }) {
10
+ const [repos, setRepos] = useState([]);
11
+ const [fetching, setFetching] = useState(true);
12
+ const [error, setError] = useState('');
13
+ const [search, setSearch] = useState('');
14
+ const debounceRef = useRef(null);
15
+ const fetchData = useCallback(async (searchTerm) => {
16
+ setFetching(true);
17
+ setError('');
18
+ try {
19
+ const result = await fetchRepos(searchTerm ? { search: searchTerm } : undefined);
20
+ if (result.error) {
21
+ setError(result.error);
22
+ setRepos([]);
23
+ }
24
+ else {
25
+ setRepos(result.repos ?? []);
26
+ }
27
+ }
28
+ catch {
29
+ setError('Failed to fetch repositories');
30
+ setRepos([]);
31
+ }
32
+ finally {
33
+ setFetching(false);
34
+ }
35
+ }, [fetchRepos]);
36
+ useEffect(() => {
37
+ fetchData();
38
+ }, [fetchData]);
39
+ function handleSearchChange(value) {
40
+ setSearch(value);
41
+ if (debounceRef.current)
42
+ clearTimeout(debounceRef.current);
43
+ debounceRef.current = setTimeout(() => {
44
+ fetchData(value || undefined);
45
+ }, 300);
46
+ }
47
+ const disabled = externalLoading;
48
+ if (error && !fetching) {
49
+ return (_jsxs("div", { className: "flex flex-col items-center gap-2 py-8 text-center", "data-testid": "repo-browser-error", children: [_jsx(AlertCircle, { className: "text-destructive h-8 w-8" }), _jsx("p", { className: "text-destructive text-sm", children: error })] }));
50
+ }
51
+ return (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2" }), _jsx(Input, { placeholder: "Search repositories...", value: search, onChange: (e) => handleSearchChange(e.target.value), className: "pl-9", disabled: disabled, "aria-label": "Search repositories" })] }), _jsx("div", { className: "max-h-64 overflow-x-hidden overflow-y-auto rounded-md border", role: "listbox", "aria-label": "GitHub repositories", children: fetching ? (_jsx("div", { className: "flex flex-col gap-2 p-3", "data-testid": "repo-browser-loading", children: Array.from({ length: 5 }).map((_, i) => (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(Skeleton, { className: "h-4 w-48" }), _jsx(Skeleton, { className: "h-3 w-72" })] }, `skeleton-${String(i)}`))) })) : repos.length === 0 ? (_jsx("div", { className: "text-muted-foreground py-8 text-center text-sm", "data-testid": "repo-browser-empty", children: "No repositories found" })) : (repos.map((repo) => (_jsxs("button", { type: "button", role: "option", "aria-selected": false, className: "hover:bg-accent flex w-full items-start gap-2 border-b px-3 py-2.5 text-left last:border-b-0 disabled:opacity-50", onClick: () => onSelect(repo.nameWithOwner), disabled: disabled, children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "truncate text-sm font-medium", children: repo.nameWithOwner }), _jsx(Badge, { variant: repo.isPrivate ? 'secondary' : 'outline', className: "shrink-0 text-xs", children: repo.isPrivate ? (_jsxs(_Fragment, { children: [_jsx(Lock, { className: "mr-1 h-3 w-3" }), "Private"] })) : (_jsxs(_Fragment, { children: [_jsx(Globe, { className: "mr-1 h-3 w-3" }), "Public"] })) })] }), repo.description ? (_jsx("p", { className: "text-muted-foreground mt-0.5 truncate text-xs", children: repo.description })) : null] }), disabled ? _jsx(Loader2, { className: "mt-0.5 h-4 w-4 shrink-0 animate-spin" }) : null] }, repo.nameWithOwner)))) })] }));
52
+ }
@@ -0,0 +1,10 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { GitHubRepoBrowser } from './github-repo-browser.js';
3
+ declare const meta: Meta<typeof GitHubRepoBrowser>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof GitHubRepoBrowser>;
6
+ export declare const Default: Story;
7
+ export declare const Loading: Story;
8
+ export declare const Empty: Story;
9
+ export declare const Error: Story;
10
+ //# sourceMappingURL=github-repo-browser.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-repo-browser.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAyC1D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,iBAAiB,CAiBxC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEhD,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAOnB,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { fn } from '@storybook/test';
3
+ import { GitHubRepoBrowser } from './github-repo-browser.js';
4
+ const mockRepos = [
5
+ {
6
+ name: 'awesome-app',
7
+ nameWithOwner: 'octocat/awesome-app',
8
+ description: 'An awesome application built with React and TypeScript',
9
+ isPrivate: false,
10
+ pushedAt: '2025-03-15T10:00:00Z',
11
+ },
12
+ {
13
+ name: 'secret-project',
14
+ nameWithOwner: 'octocat/secret-project',
15
+ description: 'Top secret private repository',
16
+ isPrivate: true,
17
+ pushedAt: '2025-03-14T08:00:00Z',
18
+ },
19
+ {
20
+ name: 'open-source-lib',
21
+ nameWithOwner: 'octocat/open-source-lib',
22
+ description: 'A reusable open-source library for everyone',
23
+ isPrivate: false,
24
+ pushedAt: '2025-03-13T15:30:00Z',
25
+ },
26
+ {
27
+ name: 'private-infra',
28
+ nameWithOwner: 'octocat/private-infra',
29
+ description: '',
30
+ isPrivate: true,
31
+ pushedAt: '2025-03-12T12:00:00Z',
32
+ },
33
+ {
34
+ name: 'docs-site',
35
+ nameWithOwner: 'octocat/docs-site',
36
+ description: 'Documentation website powered by Next.js',
37
+ isPrivate: false,
38
+ pushedAt: '2025-03-11T09:00:00Z',
39
+ },
40
+ ];
41
+ const meta = {
42
+ title: 'Composed/GitHubRepoBrowser',
43
+ component: GitHubRepoBrowser,
44
+ tags: ['autodocs'],
45
+ parameters: {
46
+ layout: 'centered',
47
+ },
48
+ args: {
49
+ onSelect: fn().mockName('onSelect'),
50
+ },
51
+ decorators: [
52
+ (Story) => (_jsx("div", { style: { width: 480 }, children: _jsx(Story, {}) })),
53
+ ],
54
+ };
55
+ export default meta;
56
+ export const Default = {
57
+ args: {
58
+ fetchRepos: () => Promise.resolve({ repos: mockRepos }),
59
+ },
60
+ };
61
+ export const Loading = {
62
+ args: {
63
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
64
+ fetchRepos: () => new Promise(() => { }), // never resolves
65
+ },
66
+ };
67
+ export const Empty = {
68
+ args: {
69
+ fetchRepos: () => Promise.resolve({ repos: [] }),
70
+ },
71
+ };
72
+ export const Error = {
73
+ args: {
74
+ fetchRepos: () => Promise.resolve({
75
+ error: 'GitHub CLI is not authenticated. Run `gh auth login` to sign in.',
76
+ }),
77
+ },
78
+ };
@@ -0,0 +1,7 @@
1
+ export declare function isValidGitHubUrl(url: string): boolean;
2
+ export interface GitHubUrlInputProps {
3
+ onSubmit: (url: string) => void;
4
+ loading?: boolean;
5
+ }
6
+ export declare function GitHubUrlInput({ onSubmit, loading }: GitHubUrlInputProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=github-url-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-url-input.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-url-input.tsx"],"names":[],"mappings":"AAkBA,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,OAAe,EAAE,EAAE,mBAAmB,2CAqDhF"}