@shepai/cli 1.127.3-pr400.67a8317 → 1.127.3-pr404.06ba582

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 (374) 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/eslint.config.mjs +0 -2
  5. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +4 -0
  6. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -1
  7. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +118 -0
  8. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts.map +1 -0
  9. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.js +58 -0
  10. package/dist/packages/core/src/application/ports/output/services/index.d.ts +2 -0
  11. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  12. package/dist/packages/core/src/application/ports/output/services/index.js +1 -0
  13. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts +31 -0
  14. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts.map +1 -0
  15. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.js +86 -0
  16. package/dist/packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.d.ts +13 -0
  17. package/dist/packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.d.ts.map +1 -0
  18. package/dist/packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.js +35 -0
  19. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  20. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +2 -0
  21. package/dist/packages/core/src/domain/generated/output.d.ts +12 -0
  22. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  23. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/di/container.js +12 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts +1 -0
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts.map +1 -1
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js +2 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  29. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -0
  31. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-add-repository-remote-url.d.ts +12 -0
  32. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-add-repository-remote-url.d.ts.map +1 -0
  33. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-add-repository-remote-url.js +29 -0
  34. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/041-add-feature-flag-github-import.d.ts +11 -0
  35. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/041-add-feature-flag-github-import.d.ts.map +1 -0
  36. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/041-add-feature-flag-github-import.js +17 -0
  37. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +3 -0
  38. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -1
  39. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +38 -2
  40. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  41. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  42. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +18 -0
  43. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -0
  44. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +171 -0
  45. package/dist/src/presentation/cli/commands/repo/add.command.d.ts +13 -0
  46. package/dist/src/presentation/cli/commands/repo/add.command.d.ts.map +1 -0
  47. package/dist/src/presentation/cli/commands/repo/add.command.js +82 -0
  48. package/dist/src/presentation/cli/commands/repo/index.d.ts +1 -0
  49. package/dist/src/presentation/cli/commands/repo/index.d.ts.map +1 -1
  50. package/dist/src/presentation/cli/commands/repo/index.js +4 -1
  51. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts +33 -0
  52. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts.map +1 -0
  53. package/dist/src/presentation/tui/wizards/github-import.wizard.js +121 -0
  54. package/dist/src/presentation/web/app/actions/import-github-repository.d.ts +11 -0
  55. package/dist/src/presentation/web/app/actions/import-github-repository.d.ts.map +1 -0
  56. package/dist/src/presentation/web/app/actions/import-github-repository.js +27 -0
  57. package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts +11 -0
  58. package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts.map +1 -0
  59. package/dist/src/presentation/web/app/actions/list-github-repositories.js +17 -0
  60. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.d.ts +4 -3
  61. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.d.ts.map +1 -1
  62. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.js +22 -5
  63. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  64. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +0 -18
  65. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  66. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +1 -2
  67. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
  68. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +9 -3
  69. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +4 -0
  70. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
  71. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +13 -0
  72. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.d.ts +8 -0
  73. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.d.ts.map +1 -0
  74. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.js +33 -0
  75. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.d.ts +10 -0
  76. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.d.ts.map +1 -0
  77. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.js +26 -0
  78. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts +15 -0
  79. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts.map +1 -0
  80. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js +52 -0
  81. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts +10 -0
  82. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts.map +1 -0
  83. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.js +78 -0
  84. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.d.ts +7 -0
  85. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.d.ts.map +1 -0
  86. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.js +46 -0
  87. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.stories.d.ts +10 -0
  88. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.stories.d.ts.map +1 -0
  89. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.stories.js +29 -0
  90. package/dist/src/presentation/web/components/common/github-import-dialog/index.d.ts +4 -0
  91. package/dist/src/presentation/web/components/common/github-import-dialog/index.d.ts.map +1 -0
  92. package/dist/src/presentation/web/components/common/github-import-dialog/index.js +3 -0
  93. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  94. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +9 -1
  95. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  96. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +3 -0
  97. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  98. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +5 -0
  99. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  100. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
  101. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  102. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +56 -27
  103. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  104. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +7 -1
  105. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  106. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
  107. package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
  108. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  109. package/dist/src/presentation/web/lib/feature-flags.js +5 -0
  110. package/dist/tsconfig.build.tsbuildinfo +1 -1
  111. package/package.json +1 -1
  112. package/web/.next/BUILD_ID +1 -1
  113. package/web/.next/build-manifest.json +2 -2
  114. package/web/.next/fallback-build-manifest.json +2 -2
  115. package/web/.next/prerender-manifest.json +3 -3
  116. package/web/.next/required-server-files.js +1 -1
  117. package/web/.next/required-server-files.json +1 -1
  118. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +74 -44
  119. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
  120. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  121. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  122. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +74 -44
  123. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  124. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  125. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  126. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +86 -56
  127. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
  128. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  129. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  130. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +86 -56
  131. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  132. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  133. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  134. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +70 -40
  135. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  136. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  137. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  138. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +74 -44
  139. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  140. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  141. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  142. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +86 -56
  143. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
  144. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  145. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  146. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +86 -56
  147. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  148. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  149. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  150. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +70 -40
  151. package/web/.next/server/app/(dashboard)/page.js +3 -3
  152. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  153. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  154. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +70 -40
  155. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  156. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  157. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  158. package/web/.next/server/app/_global-error.html +2 -2
  159. package/web/.next/server/app/_global-error.rsc +1 -1
  160. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  161. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  162. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  163. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  164. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  165. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +32 -2
  166. package/web/.next/server/app/_not-found/page.js +1 -1
  167. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  168. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  169. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  170. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  171. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  172. package/web/.next/server/app/settings/page/server-reference-manifest.json +42 -12
  173. package/web/.next/server/app/settings/page.js +2 -2
  174. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  175. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  176. package/web/.next/server/app/skills/page/server-reference-manifest.json +42 -12
  177. package/web/.next/server/app/skills/page.js +2 -1
  178. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  179. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  180. package/web/.next/server/app/tools/page/server-reference-manifest.json +42 -12
  181. package/web/.next/server/app/tools/page.js +2 -1
  182. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  183. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  184. package/web/.next/server/app/version/page/server-reference-manifest.json +32 -2
  185. package/web/.next/server/app/version/page.js +2 -2
  186. package/web/.next/server/app/version/page.js.nft.json +1 -1
  187. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  188. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  189. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  190. package/web/.next/server/chunks/[root-of-the-server]__dcd4f847._.js.map +1 -1
  191. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +3 -0
  192. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +1 -0
  193. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  194. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  195. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_8b618f7d._.js +3 -0
  196. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_8b618f7d._.js.map +1 -0
  197. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +3 -0
  198. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +1 -0
  199. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +3 -0
  200. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +1 -0
  201. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js +3 -0
  202. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js.map +1 -0
  203. package/web/.next/server/chunks/ssr/[root-of-the-server]__2f886f77._.js +4 -0
  204. package/web/.next/server/chunks/ssr/[root-of-the-server]__2f886f77._.js.map +1 -0
  205. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +3 -0
  206. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js.map +1 -0
  207. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +4 -0
  208. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -0
  209. package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js +4 -0
  210. package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js.map +1 -0
  211. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  212. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/{[root-of-the-server]__e44ae5ca._.js → [root-of-the-server]__755cfe02._.js} +2 -2
  214. package/web/.next/server/chunks/ssr/{[root-of-the-server]__430169b6._.js.map → [root-of-the-server]__755cfe02._.js.map} +1 -1
  215. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +4 -0
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -0
  217. package/web/.next/server/chunks/ssr/{[root-of-the-server]__34323a67._.js → [root-of-the-server]__a21eef5a._.js} +2 -2
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__a21eef5a._.js.map +1 -0
  219. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1aa034e9._.js → [root-of-the-server]__a628fb91._.js} +2 -2
  220. package/web/.next/server/chunks/ssr/{[root-of-the-server]__e44ae5ca._.js.map → [root-of-the-server]__a628fb91._.js.map} +1 -1
  221. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6cc70784._.js → [root-of-the-server]__bfba58e6._.js} +2 -2
  222. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6cc70784._.js.map → [root-of-the-server]__bfba58e6._.js.map} +1 -1
  223. package/web/.next/server/chunks/ssr/{[root-of-the-server]__430169b6._.js → [root-of-the-server]__c3ab8422._.js} +2 -2
  224. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1aa034e9._.js.map → [root-of-the-server]__c3ab8422._.js.map} +1 -1
  225. package/web/.next/server/chunks/ssr/[root-of-the-server]__d61bd462._.js +3 -0
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__d61bd462._.js.map +1 -0
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js +4 -0
  228. package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js.map +1 -0
  229. package/web/.next/server/chunks/ssr/{_918887c5._.js → _0020fddd._.js} +2 -2
  230. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -0
  231. package/web/.next/server/chunks/ssr/_01046927._.js +9 -0
  232. package/web/.next/server/chunks/ssr/_01046927._.js.map +1 -0
  233. package/web/.next/server/chunks/ssr/{_2f6f48b8._.js → _02ec1aea._.js} +2 -2
  234. package/web/.next/server/chunks/ssr/{_2f6f48b8._.js.map → _02ec1aea._.js.map} +1 -1
  235. package/web/.next/server/chunks/ssr/{_0c916cd8._.js → _1b9aa104._.js} +2 -2
  236. package/web/.next/server/chunks/ssr/_1b9aa104._.js.map +1 -0
  237. package/web/.next/server/chunks/ssr/_67104d9e._.js +3 -0
  238. package/web/.next/server/chunks/ssr/_67104d9e._.js.map +1 -0
  239. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  240. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  241. package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
  242. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
  243. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  244. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +1 -1
  245. package/web/.next/server/chunks/ssr/_b4b8a636._.js +3 -0
  246. package/web/.next/server/chunks/ssr/_b4b8a636._.js.map +1 -0
  247. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  248. package/web/.next/server/chunks/ssr/_d54a7a58._.js +3 -0
  249. package/web/.next/server/chunks/ssr/_d54a7a58._.js.map +1 -0
  250. package/web/.next/server/chunks/ssr/_d8575088._.js +3 -0
  251. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -0
  252. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  253. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  254. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  255. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  256. package/web/.next/server/chunks/ssr/node_modules__pnpm_55c7a131._.js +3 -0
  257. package/web/.next/server/chunks/ssr/node_modules__pnpm_55c7a131._.js.map +1 -0
  258. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +5 -0
  259. package/web/.next/server/chunks/ssr/{src_presentation_web_9db47db7._.js.map → src_presentation_web_8e7fe0d1._.js.map} +1 -1
  260. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +3 -0
  261. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +1 -0
  262. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +3 -0
  263. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -0
  264. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +3 -0
  265. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -0
  266. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +5 -0
  267. package/web/.next/server/chunks/ssr/{src_presentation_web_ede4a227._.js.map → src_presentation_web_b9023017._.js.map} +1 -1
  268. package/web/.next/server/chunks/ssr/src_presentation_web_cfdd70ed._.js +3 -0
  269. package/web/.next/server/chunks/ssr/{src_presentation_web_5914be6c._.js.map → src_presentation_web_cfdd70ed._.js.map} +1 -1
  270. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +3 -0
  271. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js.map +1 -0
  272. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  273. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  274. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  275. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  276. package/web/.next/server/pages/500.html +2 -2
  277. package/web/.next/server/server-reference-manifest.js +1 -1
  278. package/web/.next/server/server-reference-manifest.json +520 -294
  279. package/web/.next/static/chunks/314b8314f77d6921.js +1 -0
  280. package/web/.next/static/chunks/3e1e0f9bde3530d2.js +1 -0
  281. package/web/.next/static/chunks/3ebc78425ca44fc1.js +1 -0
  282. package/web/.next/static/chunks/601d93593f5f664f.js +1 -0
  283. package/web/.next/static/chunks/688971d5bad5dc7c.js +1 -0
  284. package/web/.next/static/chunks/{ad3b1560b2612b59.js → 74cda0ef8886742f.js} +1 -1
  285. package/web/.next/static/chunks/822c119dba4cfe13.js +1 -0
  286. package/web/.next/static/chunks/90a4ff487d740051.js +2 -0
  287. package/web/.next/static/chunks/98dfbecc5ee30ce1.css +1 -0
  288. package/web/.next/static/chunks/99a01ba4afe8bf59.js +1 -0
  289. package/web/.next/static/chunks/{4265877011a68ce0.js → b47032e2b8cea7a7.js} +1 -1
  290. package/web/.next/static/chunks/bcb19e292795f2b1.js +1 -0
  291. package/web/.next/static/chunks/{10f102e4f3d30fab.js → bd959d8ef8bcbf8b.js} +1 -1
  292. package/web/.next/static/chunks/c272b98911cacff1.js +1 -0
  293. package/web/.next/static/chunks/c976ac02a2d19d26.js +1 -0
  294. package/web/.next/static/chunks/d34a91958ca566fa.js +13 -0
  295. package/web/.next/static/chunks/e15ea4ed03d5d2c8.js +1 -0
  296. package/web/.next/static/chunks/e82b8c7db062d86b.js +1 -0
  297. package/web/.next/static/chunks/f259386f4875e70c.js +1 -0
  298. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-running-controls.d.ts +0 -12
  299. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-running-controls.d.ts.map +0 -1
  300. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-running-controls.js +0 -19
  301. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-running-controls.stories.d.ts +0 -26
  302. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-running-controls.stories.d.ts.map +0 -1
  303. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-running-controls.stories.js +0 -91
  304. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_fbb88113.js +0 -3
  305. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_fbb88113.js.map +0 -1
  306. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_fdfbf5cc.js +0 -3
  307. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_fdfbf5cc.js.map +0 -1
  308. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_d8fa0b5f.js +0 -3
  309. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_d8fa0b5f.js.map +0 -1
  310. package/web/.next/server/chunks/ssr/[root-of-the-server]__02c84e6b._.js +0 -3
  311. package/web/.next/server/chunks/ssr/[root-of-the-server]__02c84e6b._.js.map +0 -1
  312. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +0 -3
  313. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js.map +0 -1
  314. package/web/.next/server/chunks/ssr/[root-of-the-server]__34323a67._.js.map +0 -1
  315. package/web/.next/server/chunks/ssr/[root-of-the-server]__357de47c._.js +0 -4
  316. package/web/.next/server/chunks/ssr/[root-of-the-server]__357de47c._.js.map +0 -1
  317. package/web/.next/server/chunks/ssr/[root-of-the-server]__67fe07fe._.js +0 -4
  318. package/web/.next/server/chunks/ssr/[root-of-the-server]__67fe07fe._.js.map +0 -1
  319. package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js +0 -3
  320. package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js.map +0 -1
  321. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +0 -4
  322. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +0 -1
  323. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +0 -4
  324. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +0 -1
  325. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +0 -4
  326. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js.map +0 -1
  327. package/web/.next/server/chunks/ssr/[root-of-the-server]__a50a7e39._.js +0 -4
  328. package/web/.next/server/chunks/ssr/[root-of-the-server]__a50a7e39._.js.map +0 -1
  329. package/web/.next/server/chunks/ssr/_0c916cd8._.js.map +0 -1
  330. package/web/.next/server/chunks/ssr/_1bb79fe8._.js +0 -3
  331. package/web/.next/server/chunks/ssr/_1bb79fe8._.js.map +0 -1
  332. package/web/.next/server/chunks/ssr/_583a83fb._.js +0 -3
  333. package/web/.next/server/chunks/ssr/_583a83fb._.js.map +0 -1
  334. package/web/.next/server/chunks/ssr/_832c379b._.js +0 -3
  335. package/web/.next/server/chunks/ssr/_832c379b._.js.map +0 -1
  336. package/web/.next/server/chunks/ssr/_918887c5._.js.map +0 -1
  337. package/web/.next/server/chunks/ssr/_9f56cf8f._.js +0 -3
  338. package/web/.next/server/chunks/ssr/_9f56cf8f._.js.map +0 -1
  339. package/web/.next/server/chunks/ssr/_a187fd7e._.js +0 -3
  340. package/web/.next/server/chunks/ssr/_a187fd7e._.js.map +0 -1
  341. package/web/.next/server/chunks/ssr/_a5aa6371._.js +0 -9
  342. package/web/.next/server/chunks/ssr/_a5aa6371._.js.map +0 -1
  343. package/web/.next/server/chunks/ssr/_b730ac57._.js +0 -3
  344. package/web/.next/server/chunks/ssr/_b730ac57._.js.map +0 -1
  345. package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js +0 -3
  346. package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js.map +0 -1
  347. package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js +0 -3
  348. package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js.map +0 -1
  349. package/web/.next/server/chunks/ssr/src_presentation_web_5914be6c._.js +0 -3
  350. package/web/.next/server/chunks/ssr/src_presentation_web_9db47db7._.js +0 -5
  351. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f66cd328.js +0 -3
  352. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f66cd328.js.map +0 -1
  353. package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js +0 -3
  354. package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js.map +0 -1
  355. package/web/.next/server/chunks/ssr/src_presentation_web_ede4a227._.js +0 -5
  356. package/web/.next/static/chunks/01ba448cf76c6014.js +0 -1
  357. package/web/.next/static/chunks/05e9c71e5e4cf531.js +0 -1
  358. package/web/.next/static/chunks/53941e038c6b975c.js +0 -1
  359. package/web/.next/static/chunks/722c4b021a197a84.js +0 -2
  360. package/web/.next/static/chunks/736d94180ff7f37d.js +0 -1
  361. package/web/.next/static/chunks/78d9c944f56f22b4.js +0 -1
  362. package/web/.next/static/chunks/8080c842b0358904.js +0 -1
  363. package/web/.next/static/chunks/a0f0cb1ede328514.js +0 -1
  364. package/web/.next/static/chunks/a5804ae1a0c23932.js +0 -1
  365. package/web/.next/static/chunks/a835d31cfedb9077.js +0 -1
  366. package/web/.next/static/chunks/a8ba3f3e2b0f87aa.js +0 -1
  367. package/web/.next/static/chunks/afa4210db783bc6f.js +0 -1
  368. package/web/.next/static/chunks/cca0f5112a9260d8.js +0 -1
  369. package/web/.next/static/chunks/cd45aed9c46e1bf5.js +0 -11
  370. package/web/.next/static/chunks/d04de4be30ab78ca.js +0 -3
  371. package/web/.next/static/chunks/f7d4ca49260314fb.css +0 -1
  372. /package/web/.next/static/{SUd6bpgXghiSZx_3nWE4Y → 8LFWaiDoKGrMLSC9Zpl7z}/_buildManifest.js +0 -0
  373. /package/web/.next/static/{SUd6bpgXghiSZx_3nWE4Y → 8LFWaiDoKGrMLSC9Zpl7z}/_clientMiddlewareManifest.json +0 -0
  374. /package/web/.next/static/{SUd6bpgXghiSZx_3nWE4Y → 8LFWaiDoKGrMLSC9Zpl7z}/_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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAwCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAslB1F"}
1
+ {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAqkB1F"}
@@ -7,7 +7,6 @@ import { Loader2, Trash2, Play, Square, Copy, Check, Code2, ExternalLink } from
7
7
  import { approveFeature } from '../../../app/actions/approve-feature.js';
8
8
  import { resumeFeature } from '../../../app/actions/resume-feature.js';
9
9
  import { startFeature } from '../../../app/actions/start-feature.js';
10
- import { stopFeature } from '../../../app/actions/stop-feature.js';
11
10
  import { rejectFeature } from '../../../app/actions/reject-feature.js';
12
11
  import { getFeatureArtifact } from '../../../app/actions/get-feature-artifact.js';
13
12
  import { getResearchArtifact } from '../../../app/actions/get-research-artifact.js';
@@ -301,20 +300,6 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
301
300
  return { ...prev, node: { ...prev.node, state: 'running' } };
302
301
  });
303
302
  }, []);
304
- const handleStop = useCallback(async (featureId) => {
305
- const result = await stopFeature(featureId);
306
- if (result.error) {
307
- toast.error(result.error);
308
- return;
309
- }
310
- toast.success('Feature stopped');
311
- // Optimistically update the drawer view — agent run will be interrupted
312
- setView((prev) => {
313
- if (prev.type !== 'feature')
314
- return prev;
315
- return { ...prev, node: { ...prev.node, state: 'error' } };
316
- });
317
- }, []);
318
303
  // ── Hooks (always called unconditionally per Rules of Hooks) ──────────
319
304
  const featureActionsInput = featureNode?.repositoryPath && featureNode?.branch
320
305
  ? {
@@ -360,9 +345,6 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
360
345
  ...featureNode,
361
346
  ...(featureNode.state === 'error' && { onRetry: handleRetry }),
362
347
  ...(featureNode.state === 'pending' && { onStart: handleStart }),
363
- ...((featureNode.state === 'running' || featureNode.state === 'action-required') && {
364
- onStop: handleStop,
365
- }),
366
348
  };
367
349
  body = (_jsx(FeatureDrawerTabs, { featureNode: enrichedNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, sseEvents: events, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
368
350
  }
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-tabs.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAS9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAS9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAkD3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gFAAgF;IAChF,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,mFAAmF;IACnF,SAAS,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAGzC,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,WAAW,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAGjD,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAwBD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,SAAS,GACV,EAAE,sBAAsB,2CAgVxB"}
1
+ {"version":3,"file":"feature-drawer-tabs.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAS9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAQ9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAkD3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gFAAgF;IAChF,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,mFAAmF;IACnF,SAAS,CAAC,EAAE,SAAS,iBAAiB,EAAE,CAAC;IAGzC,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,WAAW,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAGjD,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAwBD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,SAAS,GACV,EAAE,sBAAsB,2CA8UxB"}
@@ -15,7 +15,6 @@ import { OverviewTab } from './overview-tab.js';
15
15
  import { ActivityTab } from './activity-tab.js';
16
16
  import { LogTab } from './log-tab.js';
17
17
  import { PlanTab } from './plan-tab.js';
18
- import { FeatureRunningControls } from './feature-running-controls.js';
19
18
  import { useFeatureLogs } from '../../../hooks/use-feature-logs.js';
20
19
  import { useTabDataFetch } from './use-tab-data-fetch.js';
21
20
  /** All possible tabs in display order. */
@@ -245,7 +244,7 @@ export function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab,
245
244
  fetchTab(tab);
246
245
  }
247
246
  }, [fetchTab]);
248
- return (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsx(FeatureRunningControls, { data: featureNode }), _jsxs(Tabs, { value: activeTab, onValueChange: handleTabChange, className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "shrink-0 overflow-x-auto px-4 pt-4", children: _jsx(TabsList, { className: "flex w-full", children: visibleTabDefs.map((tab) => (_jsx(TabsTrigger, { value: tab.key, className: "flex-1", children: tab.label }, tab.key))) }) }), _jsx(TabsContent, { value: "overview", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(OverviewTab, { data: featureNode }) }), _jsx(TabsContent, { value: "activity", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(ActivityTab, { timings: tabs.activity.data?.timings ?? null, loading: tabs.activity.loading, error: tabs.activity.error, rejectionFeedback: tabs.activity.data?.rejectionFeedback }) }), _jsx(TabsContent, { value: "log", className: "mt-0 flex-1 overflow-hidden", children: _jsx(LogTab, { content: featureLogs.content, isConnected: featureLogs.isConnected, error: featureLogs.error }) }), _jsx(TabsContent, { value: "plan", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(PlanTab, { plan: tabs.plan.data, loading: tabs.plan.loading, error: tabs.plan.error }) }), visibleTabs.includes('prd-review') ? (_jsx(TabsContent, { value: "prd-review", className: "mt-0 flex min-h-0 flex-1 flex-col", children: prdData ? (_jsx(PrdQuestionnaire, { data: prdData, selections: prdSelections ?? {}, onSelect: onPrdSelect ?? (() => undefined), onApprove: onPrdApprove ?? (() => undefined), onReject: onPrdReject, isProcessing: isPrdLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null, visibleTabs.includes('tech-decisions') ? (_jsx(TabsContent, { value: "tech-decisions", className: "mt-0 flex min-h-0 flex-1 flex-col", children: techData ? (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(TechDecisionsContent, { data: techData }) }), _jsx(DrawerActionBarForTech, { onApprove: onTechApprove ?? (() => undefined), onReject: onTechReject, isProcessing: isTechLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })] })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null, visibleTabs.includes('product-decisions') ? (_jsx(TabsContent, { value: "product-decisions", className: "mt-0 flex-1 overflow-y-auto", children: productData === null ? (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) : productData ? (_jsx(ProductDecisionsSummary, { data: productData })) : (_jsx("p", { className: "text-muted-foreground p-4 text-center text-sm", children: "No product decisions available." })) })) : null, visibleTabs.includes('merge-review') ? (_jsx(TabsContent, { value: "merge-review", className: "mt-0 flex min-h-0 flex-1 flex-col", children: mergeData ? (_jsx(MergeReview, { data: mergeData, readOnly: featureNode.lifecycle === 'maintain', onApprove: onMergeApprove ?? (() => undefined), onReject: onMergeReject, isProcessing: isMergeLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null] })] }));
247
+ return (_jsx("div", { className: "flex min-h-0 flex-1 flex-col", children: _jsxs(Tabs, { value: activeTab, onValueChange: handleTabChange, className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "shrink-0 overflow-x-auto px-4 pt-4", children: _jsx(TabsList, { className: "flex w-full", children: visibleTabDefs.map((tab) => (_jsx(TabsTrigger, { value: tab.key, className: "flex-1", children: tab.label }, tab.key))) }) }), _jsx(TabsContent, { value: "overview", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(OverviewTab, { data: featureNode }) }), _jsx(TabsContent, { value: "activity", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(ActivityTab, { timings: tabs.activity.data?.timings ?? null, loading: tabs.activity.loading, error: tabs.activity.error, rejectionFeedback: tabs.activity.data?.rejectionFeedback }) }), _jsx(TabsContent, { value: "log", className: "mt-0 flex-1 overflow-hidden", children: _jsx(LogTab, { content: featureLogs.content, isConnected: featureLogs.isConnected, error: featureLogs.error }) }), _jsx(TabsContent, { value: "plan", className: "mt-0 flex-1 overflow-y-auto", children: _jsx(PlanTab, { plan: tabs.plan.data, loading: tabs.plan.loading, error: tabs.plan.error }) }), visibleTabs.includes('prd-review') ? (_jsx(TabsContent, { value: "prd-review", className: "mt-0 flex min-h-0 flex-1 flex-col", children: prdData ? (_jsx(PrdQuestionnaire, { data: prdData, selections: prdSelections ?? {}, onSelect: onPrdSelect ?? (() => undefined), onApprove: onPrdApprove ?? (() => undefined), onReject: onPrdReject, isProcessing: isPrdLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null, visibleTabs.includes('tech-decisions') ? (_jsx(TabsContent, { value: "tech-decisions", className: "mt-0 flex min-h-0 flex-1 flex-col", children: techData ? (_jsxs("div", { className: "flex min-h-0 flex-1 flex-col", children: [_jsx("div", { className: "flex-1 overflow-y-auto", children: _jsx(TechDecisionsContent, { data: techData }) }), _jsx(DrawerActionBarForTech, { onApprove: onTechApprove ?? (() => undefined), onReject: onTechReject, isProcessing: isTechLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })] })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null, visibleTabs.includes('product-decisions') ? (_jsx(TabsContent, { value: "product-decisions", className: "mt-0 flex-1 overflow-y-auto", children: productData === null ? (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) : productData ? (_jsx(ProductDecisionsSummary, { data: productData })) : (_jsx("p", { className: "text-muted-foreground p-4 text-center text-sm", children: "No product decisions available." })) })) : null, visibleTabs.includes('merge-review') ? (_jsx(TabsContent, { value: "merge-review", className: "mt-0 flex min-h-0 flex-1 flex-col", children: mergeData ? (_jsx(MergeReview, { data: mergeData, readOnly: featureNode.lifecycle === 'maintain', onApprove: onMergeApprove ?? (() => undefined), onReject: onMergeReject, isProcessing: isMergeLoading, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: onChatInputChange })) : (_jsx("div", { className: "flex items-center justify-center p-8", children: _jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin" }) })) })) : null] }) }));
249
248
  }
250
249
  // ── Private helper ──────────────────────────────────────────────────────
251
250
  function DrawerActionBarForTech({ onApprove, onReject, isProcessing, isRejecting, chatInput, onChatInputChange, }) {
@@ -1 +1 @@
1
- {"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAQxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,2CAqCrD"}
1
+ {"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAQxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,2CA+DrD"}
@@ -1,20 +1,26 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState, useEffect, useRef } from 'react';
4
- import { AlertTriangle, Check, ExternalLink, FileSearch, GitBranch, GitCommitHorizontal, ShieldCheck, X, Zap, } from 'lucide-react';
4
+ import { AlertTriangle, Check, ExternalLink, FileSearch, GitBranch, GitCommitHorizontal, RotateCcw, ShieldCheck, Square, X, Zap, } from 'lucide-react';
5
5
  import { InlineAttachments } from '../../common/inline-attachments/index.js';
6
6
  import { PrStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
7
7
  import { cn } from '../../../lib/utils.js';
8
8
  import { Badge } from '../../ui/badge.js';
9
9
  import { Separator } from '../../ui/separator.js';
10
10
  import { CiStatusBadge } from '../../common/ci-status-badge/index.js';
11
- import { featureNodeStateConfig } from '../../common/feature-node/index.js';
11
+ import { CometSpinner } from '../../ui/comet-spinner.js';
12
+ import { featureNodeStateConfig, lifecycleDisplayLabels } from '../../common/feature-node/index.js';
12
13
  import { getAgentTypeIcon, agentTypeLabels, } from '../../common/feature-node/agent-type-icons.js';
13
14
  import { getModelMeta } from '../../../lib/model-metadata.js';
14
15
  import { formatDuration } from '../../../lib/format-duration.js';
15
16
  export function OverviewTab({ data }) {
16
17
  const isCompleted = data.lifecycle === 'maintain';
17
- return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [!isCompleted && data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null, isCompleted && data.pr ? _jsx(FeaturePrInfo, { pr: data.pr }) : null] }), _jsx(FeatureInfo, { data: data }), !isCompleted && data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { className: "p-4", children: _jsx(FeaturePrInfo, { pr: data.pr }) })] })) : null, _jsx(FeatureDetails, { data: data }), _jsx(FeatureSettings, { data: data })] }));
18
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(FeatureStateBadge, { data: data }), data.state === 'error' && data.onRetry ? (_jsxs("button", { "data-testid": "feature-drawer-retry-button", onClick: () => data.onRetry(data.featureId), className: "flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-red-50 px-3 py-1.5 text-sm font-medium text-red-700 transition-colors hover:bg-red-100", children: [_jsx(RotateCcw, { className: "h-3.5 w-3.5" }), "Retry"] })) : null, (data.state === 'running' || data.state === 'action-required') && data.onStop ? (_jsxs("button", { "data-testid": "feature-drawer-stop-button", onClick: () => data.onStop(data.featureId), className: "flex shrink-0 cursor-pointer items-center gap-1.5 rounded-full bg-red-50 px-3 py-1.5 text-sm font-medium text-red-700 transition-colors hover:bg-red-100", children: [_jsx(Square, { className: "h-3.5 w-3.5" }), "Stop"] })) : null] }), !isCompleted && data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null, isCompleted && data.pr ? _jsx(FeaturePrInfo, { pr: data.pr }) : null] }), _jsx(FeatureInfo, { data: data }), !isCompleted && data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx("div", { className: "p-4", children: _jsx(FeaturePrInfo, { pr: data.pr }) })] })) : null, _jsx(FeatureDetails, { data: data }), _jsx(FeatureSettings, { data: data })] }));
19
+ }
20
+ function FeatureStateBadge({ data }) {
21
+ const config = featureNodeStateConfig[data.state];
22
+ const Icon = config.icon;
23
+ return (_jsxs("div", { className: cn('flex items-center gap-2 rounded-full px-3 py-1.5 text-sm font-medium', config.badgeBgClass, config.badgeClass), children: [data.state === 'running' ? (_jsx(CometSpinner, { size: "sm", className: "shrink-0" })) : (_jsx(Icon, { className: "h-4 w-4 shrink-0" })), _jsx("span", { children: config.label })] }));
18
24
  }
19
25
  // ── Feature Info section ─────────────────────────────────────────────
20
26
  function formatRelativeTime(timestamp) {
@@ -15,6 +15,10 @@ export declare const DoneWithMergedPr: Story;
15
15
  export declare const Blocked: Story;
16
16
  /** Error state showing error message detail. */
17
17
  export declare const Error: Story;
18
+ /** Error state with retry button visible. */
19
+ export declare const ErrorWithRetry: Story;
20
+ /** Running state with stop button visible. */
21
+ export declare const RunningWithStop: Story;
18
22
  /** Minimal data — only required fields, no optional details or PR. */
19
23
  export declare const Minimal: Story;
20
24
  /** Fast mode feature — shows lightning icon in details section. */
@@ -1 +1 @@
1
- {"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA0G1C,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAwBF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,KAclC,CAAC;AAqBF,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,EAAE,KAEpC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,KAgB7B,CAAC;AAMF,oFAAoF;AACpF,eAAO,MAAM,eAAe,EAAE,KAY7B,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,uBAAuB,EAAE,KAYrC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,uBAAuB,EAAE,KAYrC,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,EAAE,KAQjC,CAAC"}
1
+ {"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA0G1C,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAOF,6CAA6C;AAC7C,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,eAAe,EAAE,KAE7B,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAwBF,mEAAmE;AACnE,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAMF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,oBAAoB,EAAE,KAclC,CAAC;AAqBF,4DAA4D;AAC5D,eAAO,MAAM,sBAAsB,EAAE,KAEpC,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,EAAE,KAO9B,CAAC;AAEF,+FAA+F;AAC/F,eAAO,MAAM,eAAe,EAAE,KAgB7B,CAAC;AAMF,oFAAoF;AACpF,eAAO,MAAM,eAAe,EAAE,KAY7B,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,uBAAuB,EAAE,KAYrC,CAAC;AAEF,mDAAmD;AACnD,eAAO,MAAM,uBAAuB,EAAE,KAYrC,CAAC;AAEF,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,EAAE,KAQjC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { fn } from '@storybook/test';
2
3
  import { PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
3
4
  import { OverviewTab } from './overview-tab.js';
4
5
  const meta = {
@@ -132,6 +133,18 @@ export const Blocked = {
132
133
  export const Error = {
133
134
  args: { data: errorData },
134
135
  };
136
+ const errorWithRetryData = {
137
+ ...errorData,
138
+ onRetry: fn(),
139
+ };
140
+ /** Error state with retry button visible. */
141
+ export const ErrorWithRetry = {
142
+ args: { data: errorWithRetryData },
143
+ };
144
+ /** Running state with stop button visible. */
145
+ export const RunningWithStop = {
146
+ args: { data: { ...fullData, onStop: fn() } },
147
+ };
135
148
  /** Minimal data — only required fields, no optional details or PR. */
136
149
  export const Minimal = {
137
150
  args: { data: minimalData },
@@ -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