@shepai/cli 1.161.0-pr504.cfb31f4 → 1.162.0-pr506.4839064

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +20 -0
  2. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -1
  4. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.d.ts +13 -0
  6. package/dist/packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.d.ts.map +1 -0
  7. package/dist/packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.js +35 -0
  8. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/di/container.js +5 -0
  10. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +2 -1
  11. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +20 -0
  13. package/dist/src/presentation/cli/commands/repo/add.command.d.ts.map +1 -1
  14. package/dist/src/presentation/cli/commands/repo/add.command.js +3 -1
  15. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts +5 -2
  16. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts.map +1 -1
  17. package/dist/src/presentation/tui/wizards/github-import.wizard.js +38 -6
  18. package/dist/src/presentation/web/app/actions/list-github-organizations.d.ts +6 -0
  19. package/dist/src/presentation/web/app/actions/list-github-organizations.d.ts.map +1 -0
  20. package/dist/src/presentation/web/app/actions/list-github-organizations.js +17 -0
  21. package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts +1 -0
  22. package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts.map +1 -1
  23. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts +8 -1
  24. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts.map +1 -1
  25. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js +37 -7
  26. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts +1 -0
  27. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts.map +1 -1
  28. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.js +35 -0
  29. package/dist/tsconfig.build.tsbuildinfo +1 -1
  30. package/package.json +1 -1
  31. package/web/.next/BUILD_ID +1 -1
  32. package/web/.next/build-manifest.json +2 -2
  33. package/web/.next/fallback-build-manifest.json +2 -2
  34. package/web/.next/prerender-manifest.json +3 -3
  35. package/web/.next/required-server-files.js +2 -2
  36. package/web/.next/required-server-files.json +2 -2
  37. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +71 -56
  38. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
  39. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  40. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  41. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +67 -52
  42. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +1 -1
  43. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  44. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +73 -58
  46. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  47. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  48. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  49. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +87 -72
  50. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  51. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  52. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  53. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +87 -72
  54. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  55. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  56. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  57. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
  58. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +1 -1
  59. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  60. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  61. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
  62. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  63. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  64. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +67 -52
  66. package/web/.next/server/app/(dashboard)/chat/page.js +1 -1
  67. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  68. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +73 -58
  70. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  71. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +87 -72
  74. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  75. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  76. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +87 -72
  78. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  79. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  80. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  81. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +67 -52
  82. package/web/.next/server/app/(dashboard)/page.js +1 -1
  83. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  84. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +67 -52
  86. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +1 -1
  87. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  88. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +67 -52
  90. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  91. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  92. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/app/_global-error.html +2 -2
  94. package/web/.next/server/app/_global-error.rsc +1 -1
  95. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  96. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  97. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  98. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  99. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  100. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +25 -10
  101. package/web/.next/server/app/_not-found/page.js +1 -1
  102. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  103. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  105. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  106. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  107. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  108. package/web/.next/server/app/settings/page/server-reference-manifest.json +31 -16
  109. package/web/.next/server/app/settings/page.js +1 -1
  110. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  111. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/skills/page/server-reference-manifest.json +35 -20
  113. package/web/.next/server/app/skills/page.js +1 -1
  114. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  115. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/tools/page/server-reference-manifest.json +35 -20
  117. package/web/.next/server/app/tools/page.js +1 -1
  118. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  119. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/app/version/page/server-reference-manifest.json +25 -10
  121. package/web/.next/server/app/version/page.js +1 -1
  122. package/web/.next/server/app/version/page.js.nft.json +1 -1
  123. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  124. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  125. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  126. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  128. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js +4 -0
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__1abe77bb._.js.map +1 -0
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +4 -0
  132. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -0
  133. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  134. package/web/.next/server/chunks/ssr/[root-of-the-server]__512b2c98._.js +4 -0
  135. package/web/.next/server/chunks/ssr/[root-of-the-server]__512b2c98._.js.map +1 -0
  136. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js +4 -0
  137. package/web/.next/server/chunks/ssr/[root-of-the-server]__7562afc6._.js.map +1 -0
  138. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js +1 -1
  139. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b0aac03._.js.map +1 -1
  140. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +4 -0
  141. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -0
  142. package/web/.next/server/chunks/ssr/[root-of-the-server]__bde2d922._.js +4 -0
  143. package/web/.next/server/chunks/ssr/[root-of-the-server]__bde2d922._.js.map +1 -0
  144. package/web/.next/server/chunks/ssr/[root-of-the-server]__c7691da2._.js +4 -0
  145. package/web/.next/server/chunks/ssr/[root-of-the-server]__c7691da2._.js.map +1 -0
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__e5ceba65._.js +3 -0
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__e5ceba65._.js.map +1 -0
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__f1048f45._.js +4 -0
  149. package/web/.next/server/chunks/ssr/[root-of-the-server]__f1048f45._.js.map +1 -0
  150. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  151. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/{_9495d50b._.js → _0727935d._.js} +2 -2
  153. package/web/.next/server/chunks/ssr/{_9495d50b._.js.map → _0727935d._.js.map} +1 -1
  154. package/web/.next/server/chunks/ssr/_075fae20._.js +4 -0
  155. package/web/.next/server/chunks/ssr/_075fae20._.js.map +1 -0
  156. package/web/.next/server/chunks/ssr/{_069d4994._.js → _0fc83881._.js} +2 -2
  157. package/web/.next/server/chunks/ssr/{_069d4994._.js.map → _0fc83881._.js.map} +1 -1
  158. package/web/.next/server/chunks/ssr/_125c55af._.js +4 -0
  159. package/web/.next/server/chunks/ssr/_125c55af._.js.map +1 -0
  160. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  161. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/_22e00a14._.js +4 -0
  163. package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -0
  164. package/web/.next/server/chunks/ssr/_289a182a._.js +3 -0
  165. package/web/.next/server/chunks/ssr/_289a182a._.js.map +1 -0
  166. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  167. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/_628621c7._.js +4 -0
  169. package/web/.next/server/chunks/ssr/_628621c7._.js.map +1 -0
  170. package/web/.next/server/chunks/ssr/_68996e5b._.js +3 -0
  171. package/web/.next/server/chunks/ssr/_68996e5b._.js.map +1 -0
  172. package/web/.next/server/chunks/ssr/{_78a058d6._.js → _71ba6039._.js} +2 -2
  173. package/web/.next/server/chunks/ssr/{_78a058d6._.js.map → _71ba6039._.js.map} +1 -1
  174. package/web/.next/server/chunks/ssr/_9412b27f._.js +4 -0
  175. package/web/.next/server/chunks/ssr/_9412b27f._.js.map +1 -0
  176. package/web/.next/server/chunks/ssr/_a5a5901d._.js +4 -0
  177. package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -0
  178. package/web/.next/server/chunks/ssr/_ac4a3873._.js +1 -1
  179. package/web/.next/server/chunks/ssr/_c3f595c6._.js +4 -0
  180. package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -0
  181. package/web/.next/server/chunks/ssr/{_1c309165._.js → _ce97386b._.js} +2 -2
  182. package/web/.next/server/chunks/ssr/_ce97386b._.js.map +1 -0
  183. package/web/.next/server/chunks/ssr/_f1ba9be6._.js +6 -0
  184. package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -0
  185. package/web/.next/server/chunks/ssr/_f33cd07e._.js +6 -0
  186. package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -0
  187. package/web/.next/server/chunks/ssr/_f8b45233._.js +4 -0
  188. package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -0
  189. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  190. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  191. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  192. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  193. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  195. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js +3 -0
  197. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js.map +1 -0
  198. package/web/.next/server/pages/500.html +2 -2
  199. package/web/.next/server/server-reference-manifest.js +1 -1
  200. package/web/.next/server/server-reference-manifest.json +636 -495
  201. package/web/.next/static/chunks/045afc2f5599f55e.js +7 -0
  202. package/web/.next/static/chunks/{825beb3a36c307c4.js → 0b25e132c6474df2.js} +1 -1
  203. package/web/.next/static/chunks/{a0989f8ee0c3c466.js → 35ec31863fa35a53.js} +1 -1
  204. package/web/.next/static/chunks/{c70264b0d506f0a0.js → 430ebb233af04232.js} +2 -2
  205. package/web/.next/static/chunks/50a500c1cc2dee74.js +1 -0
  206. package/web/.next/static/chunks/{b683d3671f7432ca.js → 63f6860c64adac54.js} +1 -1
  207. package/web/.next/static/chunks/{db53b1e668b05e19.js → 6b7c8cc4aaebde67.js} +1 -1
  208. package/web/.next/static/chunks/{03648b85d5042de5.js → 6dfd3331ed16c17a.js} +1 -1
  209. package/web/.next/static/chunks/9059af01c4765dae.js +1 -0
  210. package/web/.next/static/chunks/{026187c8b725329d.js → b84a4b22a24e32e5.js} +1 -1
  211. package/web/.next/static/chunks/c3a67566f78b5bc3.js +1 -0
  212. package/web/.next/static/chunks/{a5e1b1982b8088ec.js → d98bc2adcbbf962b.js} +3 -3
  213. package/web/.next/static/chunks/{47b33169cbb41440.js → e4f58183caab77d8.js} +1 -1
  214. package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js +0 -4
  215. package/web/.next/server/chunks/ssr/[root-of-the-server]__209c9597._.js.map +0 -1
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js +0 -4
  217. package/web/.next/server/chunks/ssr/[root-of-the-server]__27301e38._.js.map +0 -1
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js +0 -4
  219. package/web/.next/server/chunks/ssr/[root-of-the-server]__56b70465._.js.map +0 -1
  220. package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js +0 -4
  221. package/web/.next/server/chunks/ssr/[root-of-the-server]__6fecf886._.js.map +0 -1
  222. package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js +0 -4
  223. package/web/.next/server/chunks/ssr/[root-of-the-server]__8d27866c._.js.map +0 -1
  224. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js +0 -4
  225. package/web/.next/server/chunks/ssr/[root-of-the-server]__9f3504c7._.js.map +0 -1
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js +0 -4
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd6ed91a._.js.map +0 -1
  228. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js +0 -4
  229. package/web/.next/server/chunks/ssr/[root-of-the-server]__c30f1f82._.js.map +0 -1
  230. package/web/.next/server/chunks/ssr/[root-of-the-server]__ee0eaaf9._.js +0 -3
  231. package/web/.next/server/chunks/ssr/[root-of-the-server]__ee0eaaf9._.js.map +0 -1
  232. package/web/.next/server/chunks/ssr/_1c309165._.js.map +0 -1
  233. package/web/.next/server/chunks/ssr/_3a0b989f._.js +0 -6
  234. package/web/.next/server/chunks/ssr/_3a0b989f._.js.map +0 -1
  235. package/web/.next/server/chunks/ssr/_5f69c13f._.js +0 -4
  236. package/web/.next/server/chunks/ssr/_5f69c13f._.js.map +0 -1
  237. package/web/.next/server/chunks/ssr/_7c5b97c6._.js +0 -4
  238. package/web/.next/server/chunks/ssr/_7c5b97c6._.js.map +0 -1
  239. package/web/.next/server/chunks/ssr/_82c57f10._.js +0 -4
  240. package/web/.next/server/chunks/ssr/_82c57f10._.js.map +0 -1
  241. package/web/.next/server/chunks/ssr/_9a35eaa4._.js +0 -3
  242. package/web/.next/server/chunks/ssr/_9a35eaa4._.js.map +0 -1
  243. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js +0 -4
  244. package/web/.next/server/chunks/ssr/_a0e3f7e4._.js.map +0 -1
  245. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js +0 -4
  246. package/web/.next/server/chunks/ssr/_ca0aa7f0._.js.map +0 -1
  247. package/web/.next/server/chunks/ssr/_cb5a021e._.js +0 -4
  248. package/web/.next/server/chunks/ssr/_cb5a021e._.js.map +0 -1
  249. package/web/.next/server/chunks/ssr/_d86175ae._.js +0 -4
  250. package/web/.next/server/chunks/ssr/_d86175ae._.js.map +0 -1
  251. package/web/.next/server/chunks/ssr/_d8bedf13._.js +0 -4
  252. package/web/.next/server/chunks/ssr/_d8bedf13._.js.map +0 -1
  253. package/web/.next/server/chunks/ssr/_d90b0a06._.js +0 -3
  254. package/web/.next/server/chunks/ssr/_d90b0a06._.js.map +0 -1
  255. package/web/.next/server/chunks/ssr/_fa7efce3._.js +0 -6
  256. package/web/.next/server/chunks/ssr/_fa7efce3._.js.map +0 -1
  257. package/web/.next/static/chunks/1151ab3c2734114a.js +0 -1
  258. package/web/.next/static/chunks/4864ff06a738d58b.js +0 -1
  259. package/web/.next/static/chunks/6441975efa3bce9f.js +0 -7
  260. package/web/.next/static/chunks/eacab219317827e1.js +0 -1
  261. /package/web/.next/static/{8EgN9eyOEfVMEbQGMMM7N → Nr75BQmqg1jHaq9Qff_Wk}/_buildManifest.js +0 -0
  262. /package/web/.next/static/{8EgN9eyOEfVMEbQGMMM7N → Nr75BQmqg1jHaq9Qff_Wk}/_clientMiddlewareManifest.json +0 -0
  263. /package/web/.next/static/{8EgN9eyOEfVMEbQGMMM7N → Nr75BQmqg1jHaq9Qff_Wk}/_ssgManifest.js +0 -0
@@ -58,6 +58,17 @@ export interface ListUserRepositoriesOptions {
58
58
  limit?: number;
59
59
  /** Filter repos by name substring */
60
60
  search?: string;
61
+ /** Owner (user or organization) to list repos for. Omit for the authenticated user's repos. */
62
+ owner?: string;
63
+ }
64
+ /**
65
+ * A GitHub organization the authenticated user belongs to.
66
+ */
67
+ export interface GitHubOrganization {
68
+ /** Organization login handle (e.g. "my-org") */
69
+ login: string;
70
+ /** Organization description (may be empty string) */
71
+ description: string;
61
72
  }
62
73
  /**
63
74
  * Options for cloning a repository.
@@ -101,11 +112,20 @@ export interface IGitHubRepositoryService {
101
112
  /**
102
113
  * List the authenticated user's GitHub repositories.
103
114
  *
115
+ * When `options.owner` is provided, lists repositories for that user or organization instead.
116
+ *
104
117
  * @param options - Optional filtering and pagination
105
118
  * @returns Array of GitHub repositories sorted by most recently pushed
106
119
  * @throws {GitHubRepoListError} if the list operation fails
107
120
  */
108
121
  listUserRepositories(options?: ListUserRepositoriesOptions): Promise<GitHubRepo[]>;
122
+ /**
123
+ * List organizations the authenticated user belongs to.
124
+ *
125
+ * @returns Array of GitHub organizations
126
+ * @throws {GitHubRepoListError} if the list operation fails
127
+ */
128
+ listOrganizations(): Promise<GitHubOrganization[]>;
109
129
  /**
110
130
  * Parse a GitHub URL or shorthand into its owner/repo components.
111
131
  *
@@ -1 +1 @@
1
- {"version":3,"file":"github-repository-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAMD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,SAAS,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;CACvB;AAMD;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3B;;;;;;;OAOG;IACH,eAAe,CACb,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;OAMG;IACH,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEnF;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC;IAE7C;;;;;;;;;OASG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACxD"}
1
+ {"version":3,"file":"github-repository-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH;;GAEG;AACH,qBAAa,eAAgB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAED;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAED;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAED;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK;CAM3C;AAMD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB,mDAAmD;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,SAAS,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+FAA+F;IAC/F,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,4EAA4E;IAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;CACvB;AAMD;;;;GAIG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3B;;;;;;;OAOG;IACH,eAAe,CACb,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB;;;;;;;;OAQG;IACH,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAEnF;;;;;OAKG;IACH,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAEnD;;;;;;;;;;;;OAYG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC;IAE7C;;;;;;;;;OASG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACxD"}
@@ -17,7 +17,7 @@ export { GitPrError, GitPrErrorCode } from './git-pr-service.interface.js';
17
17
  export type { IIdeLauncherService, LaunchIdeInput, LaunchIdeResult, LaunchIdeSuccess, LaunchIdeFailed, } from './ide-launcher-service.interface.js';
18
18
  export type { IDaemonService, DaemonState } from './daemon-service.interface.js';
19
19
  export type { IDeploymentService, DeploymentStatus } from './deployment-service.interface.js';
20
- export type { IGitHubRepositoryService, GitHubRepo, ListUserRepositoriesOptions, CloneOptions, ParsedGitHubUrl, } from './github-repository-service.interface.js';
20
+ export type { IGitHubRepositoryService, GitHubRepo, GitHubOrganization, ListUserRepositoriesOptions, CloneOptions, ParsedGitHubUrl, } from './github-repository-service.interface.js';
21
21
  export { GitHubAuthError, GitHubCloneError, GitHubUrlParseError, GitHubRepoListError, } from './github-repository-service.interface.js';
22
22
  export type { IInteractiveSessionService, StreamChunk, UnsubscribeFn, ChatState, } from './interactive-session-service.interface.js';
23
23
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EACV,wBAAwB,EACxB,UAAU,EACV,2BAA2B,EAC3B,YAAY,EACZ,eAAe,GAChB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,0BAA0B,EAC1B,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,4CAA4C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACjG,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,YAAY,EACV,wBAAwB,EACxB,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,YAAY,EACZ,eAAe,GAChB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,0CAA0C,CAAC;AAClD,YAAY,EACV,0BAA0B,EAC1B,WAAW,EACX,aAAa,EACb,SAAS,GACV,MAAM,4CAA4C,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * List GitHub Organizations Use Case
3
+ *
4
+ * Checks GitHub CLI auth, then fetches the organizations the authenticated user belongs to.
5
+ * Decouples presentation from the IGitHubRepositoryService infrastructure.
6
+ */
7
+ import type { IGitHubRepositoryService, GitHubOrganization } from '../../ports/output/services/github-repository-service.interface.js';
8
+ export declare class ListGitHubOrganizationsUseCase {
9
+ private readonly gitHubService;
10
+ constructor(gitHubService: IGitHubRepositoryService);
11
+ execute(): Promise<GitHubOrganization[]>;
12
+ }
13
+ //# sourceMappingURL=list-github-organizations.use-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-github-organizations.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,wBAAwB,EACxB,kBAAkB,EACnB,MAAM,oEAAoE,CAAC;AAE5E,qBACa,8BAA8B;IAGvC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,wBAAwB;IAGpD,OAAO,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;CAI/C"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * List GitHub Organizations Use Case
3
+ *
4
+ * Checks GitHub CLI auth, then fetches the organizations the authenticated user belongs to.
5
+ * Decouples presentation from the IGitHubRepositoryService infrastructure.
6
+ */
7
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
8
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
9
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
10
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
11
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
12
+ };
13
+ var __metadata = (this && this.__metadata) || function (k, v) {
14
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
15
+ };
16
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
17
+ return function (target, key) { decorator(target, key, paramIndex); }
18
+ };
19
+ import { injectable, inject } from 'tsyringe';
20
+ let ListGitHubOrganizationsUseCase = class ListGitHubOrganizationsUseCase {
21
+ gitHubService;
22
+ constructor(gitHubService) {
23
+ this.gitHubService = gitHubService;
24
+ }
25
+ async execute() {
26
+ await this.gitHubService.checkAuth();
27
+ return this.gitHubService.listOrganizations();
28
+ }
29
+ };
30
+ ListGitHubOrganizationsUseCase = __decorate([
31
+ injectable(),
32
+ __param(0, inject('IGitHubRepositoryService')),
33
+ __metadata("design:paramtypes", [Object])
34
+ ], ListGitHubOrganizationsUseCase);
35
+ export { ListGitHubOrganizationsUseCase };
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAkJrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA4arE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAmJrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAgbrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -81,6 +81,7 @@ import { ListRepositoriesUseCase } from '../../application/use-cases/repositorie
81
81
  import { DeleteRepositoryUseCase } from '../../application/use-cases/repositories/delete-repository.use-case.js';
82
82
  import { ImportGitHubRepositoryUseCase } from '../../application/use-cases/repositories/import-github-repository.use-case.js';
83
83
  import { ListGitHubRepositoriesUseCase } from '../../application/use-cases/repositories/list-github-repositories.use-case.js';
84
+ import { ListGitHubOrganizationsUseCase } from '../../application/use-cases/repositories/list-github-organizations.use-case.js';
84
85
  import { CheckAndUnblockFeaturesUseCase } from '../../application/use-cases/features/check-and-unblock-features.use-case.js';
85
86
  import { UpdateFeatureLifecycleUseCase } from '../../application/use-cases/features/update/update-feature-lifecycle.use-case.js';
86
87
  import { CleanupFeatureWorktreeUseCase } from '../../application/use-cases/features/cleanup-feature-worktree.use-case.js';
@@ -318,6 +319,7 @@ export async function initializeContainer() {
318
319
  container.registerSingleton(DeleteRepositoryUseCase);
319
320
  container.registerSingleton(ImportGitHubRepositoryUseCase);
320
321
  container.registerSingleton(ListGitHubRepositoriesUseCase);
322
+ container.registerSingleton(ListGitHubOrganizationsUseCase);
321
323
  // CheckAndUnblockFeaturesUseCase must be registered before UpdateFeatureLifecycleUseCase
322
324
  // because the latter injects the former via class token.
323
325
  container.registerSingleton(CheckAndUnblockFeaturesUseCase);
@@ -415,6 +417,9 @@ export async function initializeContainer() {
415
417
  container.register('ListGitHubRepositoriesUseCase', {
416
418
  useFactory: (c) => c.resolve(ListGitHubRepositoriesUseCase),
417
419
  });
420
+ container.register('ListGitHubOrganizationsUseCase', {
421
+ useFactory: (c) => c.resolve(ListGitHubOrganizationsUseCase),
422
+ });
418
423
  container.register('CheckAndUnblockFeaturesUseCase', {
419
424
  useFactory: (c) => c.resolve(CheckAndUnblockFeaturesUseCase),
420
425
  });
@@ -5,12 +5,13 @@
5
5
  * checks, repository listing, cloning (with progress streaming), and URL parsing.
6
6
  */
7
7
  import type { ExecFunction } from '../git/worktree.service.js';
8
- import type { IGitHubRepositoryService, GitHubRepo, ListUserRepositoriesOptions, CloneOptions, ParsedGitHubUrl } from '../../../application/ports/output/services/github-repository-service.interface.js';
8
+ import type { IGitHubRepositoryService, GitHubRepo, GitHubOrganization, ListUserRepositoriesOptions, CloneOptions, ParsedGitHubUrl } from '../../../application/ports/output/services/github-repository-service.interface.js';
9
9
  export declare class GitHubRepositoryService implements IGitHubRepositoryService {
10
10
  private readonly execFile;
11
11
  constructor(execFile: ExecFunction);
12
12
  checkAuth(): Promise<void>;
13
13
  listUserRepositories(options?: ListUserRepositoriesOptions): Promise<GitHubRepo[]>;
14
+ listOrganizations(): Promise<GitHubOrganization[]>;
14
15
  cloneRepository(nameWithOwner: string, destination: string, options?: CloneOptions): Promise<void>;
15
16
  parseGitHubUrl(url: string): ParsedGitHubUrl;
16
17
  getViewerPermission(repoPath: string): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"github-repository.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/external/github-repository.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EACV,wBAAwB,EACxB,UAAU,EACV,2BAA2B,EAC3B,YAAY,EACZ,eAAe,EAChB,MAAM,mFAAmF,CAAC;AAyB3F,qBACa,uBAAwB,YAAW,wBAAwB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB1B,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAsClF,eAAe,CACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,IAAI,CAAC;IAgDhB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;IA2CtC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAyB9C,mBAAmB;CAOlC"}
1
+ {"version":3,"file":"github-repository.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/external/github-repository.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EACV,wBAAwB,EACxB,UAAU,EACV,kBAAkB,EAClB,2BAA2B,EAC3B,YAAY,EACZ,eAAe,EAChB,MAAM,mFAAmF,CAAC;AAyB3F,qBACa,uBAAwB,YAAW,wBAAwB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB1B,oBAAoB,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAuClF,iBAAiB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;IA2BlD,eAAe,CACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,IAAI,CAAC;IAgDhB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe;IA2CtC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAyB9C,mBAAmB;CAOlC"}
@@ -59,6 +59,7 @@ let GitHubRepositoryService = class GitHubRepositoryService {
59
59
  const args = [
60
60
  'repo',
61
61
  'list',
62
+ ...(options?.owner ? [options.owner] : []),
62
63
  '--json',
63
64
  'name,nameWithOwner,description,isPrivate,pushedAt',
64
65
  '--limit',
@@ -82,6 +83,25 @@ let GitHubRepositoryService = class GitHubRepositoryService {
82
83
  throw new GitHubRepoListError(`Failed to list GitHub repositories: ${cause?.message ?? String(error)}`, cause);
83
84
  }
84
85
  }
86
+ async listOrganizations() {
87
+ try {
88
+ const { stdout } = await this.execFile('gh', [
89
+ 'api',
90
+ '/user/orgs',
91
+ '--jq',
92
+ '[.[] | {login: .login, description: (.description // "")}]',
93
+ ]);
94
+ return JSON.parse(stdout);
95
+ }
96
+ catch (error) {
97
+ const cause = error instanceof Error ? error : undefined;
98
+ const errnoCode = error?.code;
99
+ if (errnoCode === 'ENOENT') {
100
+ throw new GitHubRepoListError('GitHub CLI (gh) is not installed. Install it from https://cli.github.com/', cause);
101
+ }
102
+ throw new GitHubRepoListError(`Failed to list GitHub organizations: ${cause?.message ?? String(error)}`, cause);
103
+ }
104
+ }
85
105
  async cloneRepository(nameWithOwner, destination, options) {
86
106
  // Validate destination path — reject path traversal
87
107
  const resolved = resolve(destination);
@@ -1 +1 @@
1
- {"version":3,"file":"add.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/repo/add.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,wBAAgB,gBAAgB,IAAI,OAAO,CAyE1C"}
1
+ {"version":3,"file":"add.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/repo/add.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,wBAAgB,gBAAgB,IAAI,OAAO,CA8E1C"}
@@ -13,6 +13,7 @@ import { container } from '../../../../../packages/core/src/infrastructure/di/co
13
13
  import { getSettings } from '../../../../../packages/core/src/infrastructure/services/settings.service.js';
14
14
  import { ImportGitHubRepositoryUseCase } from '../../../../../packages/core/src/application/use-cases/repositories/import-github-repository.use-case.js';
15
15
  import { ListGitHubRepositoriesUseCase } from '../../../../../packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.js';
16
+ import { ListGitHubOrganizationsUseCase } from '../../../../../packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.js';
16
17
  import { GitHubAuthError, GitHubCloneError, GitHubUrlParseError, } from '../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
17
18
  import { messages } from '../../ui/index.js';
18
19
  import { githubImportWizard } from '../../../tui/wizards/github-import.wizard.js';
@@ -35,7 +36,8 @@ export function createAddCommand() {
35
36
  // Interactive wizard
36
37
  const gitHubService = container.resolve('IGitHubRepositoryService');
37
38
  const listUseCase = container.resolve(ListGitHubRepositoriesUseCase);
38
- const wizardResult = await githubImportWizard(gitHubService, listUseCase);
39
+ const listOrgsUseCase = container.resolve(ListGitHubOrganizationsUseCase);
40
+ const wizardResult = await githubImportWizard(gitHubService, listUseCase, listOrgsUseCase);
39
41
  url = wizardResult.url;
40
42
  if (!dest && wizardResult.dest) {
41
43
  dest = wizardResult.dest;
@@ -3,10 +3,12 @@
3
3
  *
4
4
  * Interactive TUI wizard that guides users through importing a GitHub repository.
5
5
  * Offers two paths: paste a GitHub URL or browse the user's repositories.
6
+ * Supports browsing repos from multiple organizations.
6
7
  * Returns the selected URL/nameWithOwner and optional destination override.
7
8
  */
8
9
  import type { IGitHubRepositoryService } from '../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
9
10
  import type { ListGitHubRepositoriesUseCase } from '../../../../packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.js';
11
+ import type { ListGitHubOrganizationsUseCase } from '../../../../packages/core/src/application/use-cases/repositories/list-github-organizations.use-case.js';
10
12
  /**
11
13
  * Result returned by the GitHub import wizard.
12
14
  */
@@ -22,12 +24,13 @@ export interface GitHubImportWizardResult {
22
24
  * Steps:
23
25
  * 1. Choose import method (URL input or browse repos)
24
26
  * 2a. If URL: prompt for URL, validate with parseGitHubUrl
25
- * 2b. If browse: fetch repos via listUseCase, display select list
27
+ * 2b. If browse: optionally select an org, then fetch repos via listUseCase, display select list
26
28
  * 3. Optionally prompt for destination directory override
27
29
  *
28
30
  * @param gitHubService - Service for URL validation
29
31
  * @param listUseCase - Use case for listing user repos
32
+ * @param listOrgsUseCase - Use case for listing user's organizations
30
33
  * @returns The selected import target and optional destination
31
34
  */
32
- export declare function githubImportWizard(gitHubService: IGitHubRepositoryService, listUseCase: ListGitHubRepositoriesUseCase): Promise<GitHubImportWizardResult>;
35
+ export declare function githubImportWizard(gitHubService: IGitHubRepositoryService, listUseCase: ListGitHubRepositoriesUseCase, listOrgsUseCase?: ListGitHubOrganizationsUseCase): Promise<GitHubImportWizardResult>;
33
36
  //# sourceMappingURL=github-import.wizard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-import.wizard.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/tui/wizards/github-import.wizard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EACV,wBAAwB,EAEzB,MAAM,4EAA4E,CAAC;AAEpF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2EAA2E,CAAC;AAI/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,CAqCnC"}
1
+ {"version":3,"file":"github-import.wizard.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/tui/wizards/github-import.wizard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EACV,wBAAwB,EAEzB,MAAM,4EAA4E,CAAC;AAEpF,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,2EAA2E,CAAC;AAC/H,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,4EAA4E,CAAC;AAIjI;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,yCAAyC;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAuBD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CACtC,aAAa,EAAE,wBAAwB,EACvC,WAAW,EAAE,6BAA6B,EAC1C,eAAe,CAAC,EAAE,8BAA8B,GAC/C,OAAO,CAAC,wBAAwB,CAAC,CAqCnC"}
@@ -3,12 +3,15 @@
3
3
  *
4
4
  * Interactive TUI wizard that guides users through importing a GitHub repository.
5
5
  * Offers two paths: paste a GitHub URL or browse the user's repositories.
6
+ * Supports browsing repos from multiple organizations.
6
7
  * Returns the selected URL/nameWithOwner and optional destination override.
7
8
  */
8
9
  import { select, input } from '@inquirer/prompts';
9
10
  import { GitHubUrlParseError } from '../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
10
11
  import { getTuiI18n } from '../i18n.js';
11
12
  import { shepTheme } from '../themes/shep.theme.js';
13
+ /** Sentinel value representing the authenticated user's personal account */
14
+ const PERSONAL_OWNER = '__personal__';
12
15
  /**
13
16
  * Format a GitHub repo for display in the select list.
14
17
  * Shows name, visibility badge, and truncated description.
@@ -27,14 +30,15 @@ function formatRepoChoice(repo) {
27
30
  * Steps:
28
31
  * 1. Choose import method (URL input or browse repos)
29
32
  * 2a. If URL: prompt for URL, validate with parseGitHubUrl
30
- * 2b. If browse: fetch repos via listUseCase, display select list
33
+ * 2b. If browse: optionally select an org, then fetch repos via listUseCase, display select list
31
34
  * 3. Optionally prompt for destination directory override
32
35
  *
33
36
  * @param gitHubService - Service for URL validation
34
37
  * @param listUseCase - Use case for listing user repos
38
+ * @param listOrgsUseCase - Use case for listing user's organizations
35
39
  * @returns The selected import target and optional destination
36
40
  */
37
- export async function githubImportWizard(gitHubService, listUseCase) {
41
+ export async function githubImportWizard(gitHubService, listUseCase, listOrgsUseCase) {
38
42
  // Step 1: Choose import method
39
43
  const t = getTuiI18n().t;
40
44
  const method = await select({
@@ -58,7 +62,7 @@ export async function githubImportWizard(gitHubService, listUseCase) {
58
62
  url = await promptForUrl(gitHubService);
59
63
  }
60
64
  else {
61
- url = await promptForBrowse(listUseCase);
65
+ url = await promptForBrowse(listUseCase, listOrgsUseCase);
62
66
  }
63
67
  // Step 3: Optional destination override
64
68
  const dest = await promptForDestination();
@@ -97,11 +101,39 @@ async function promptForUrl(gitHubService) {
97
101
  }
98
102
  /**
99
103
  * Prompt the user to browse and select from their GitHub repositories.
100
- * Fetches repos via the list use case and displays them in a select prompt.
104
+ * If organizations are available, first prompts the user to select an owner.
101
105
  */
102
- async function promptForBrowse(listUseCase) {
103
- const repos = await listUseCase.execute({ limit: 30 });
106
+ async function promptForBrowse(listUseCase, listOrgsUseCase) {
104
107
  const t = getTuiI18n().t;
108
+ let owner;
109
+ // Try to load organizations for the owner selector
110
+ if (listOrgsUseCase) {
111
+ try {
112
+ const orgs = await listOrgsUseCase.execute();
113
+ if (orgs.length > 0) {
114
+ const ownerChoices = [
115
+ { name: 'My repositories', value: PERSONAL_OWNER },
116
+ ...orgs.map((org) => ({
117
+ name: org.login,
118
+ value: org.login,
119
+ description: org.description || undefined,
120
+ })),
121
+ ];
122
+ const selectedOwner = await select({
123
+ message: 'Select account',
124
+ choices: ownerChoices,
125
+ theme: shepTheme,
126
+ });
127
+ if (selectedOwner !== PERSONAL_OWNER) {
128
+ owner = selectedOwner;
129
+ }
130
+ }
131
+ }
132
+ catch {
133
+ // Org listing failure is non-critical — proceed with personal repos
134
+ }
135
+ }
136
+ const repos = await listUseCase.execute({ limit: 30, owner });
105
137
  if (repos.length === 0) {
106
138
  throw new Error(t('tui:wizards.githubImport.noRepos'));
107
139
  }
@@ -0,0 +1,6 @@
1
+ import type { GitHubOrganization } from '../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
2
+ export declare function listGitHubOrganizations(): Promise<{
3
+ orgs?: GitHubOrganization[];
4
+ error?: string;
5
+ }>;
6
+ //# sourceMappingURL=list-github-organizations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-github-organizations.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/list-github-organizations.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oFAAoF,CAAC;AAG7H,wBAAsB,uBAAuB,IAAI,OAAO,CAAC;IACvD,IAAI,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAYD"}
@@ -0,0 +1,17 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ import { GitHubAuthError } from '../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
4
+ export async function listGitHubOrganizations() {
5
+ try {
6
+ const useCase = resolve('ListGitHubOrganizationsUseCase');
7
+ const orgs = await useCase.execute();
8
+ return { orgs };
9
+ }
10
+ catch (error) {
11
+ if (error instanceof GitHubAuthError) {
12
+ return { error: 'GitHub CLI is not authenticated. Run `gh auth login` to sign in.' };
13
+ }
14
+ const message = error instanceof Error ? error.message : 'Failed to list organizations';
15
+ return { error: message };
16
+ }
17
+ }
@@ -2,6 +2,7 @@ import type { GitHubRepo } from '../../../../../packages/core/src/application/po
2
2
  interface ListGitHubRepositoriesInput {
3
3
  search?: string;
4
4
  limit?: number;
5
+ owner?: string;
5
6
  }
6
7
  export declare function listGitHubRepositories(input?: ListGitHubRepositoriesInput): Promise<{
7
8
  repos?: GitHubRepo[];
@@ -1 +1 @@
1
- {"version":3,"file":"list-github-repositories.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/list-github-repositories.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oFAAoF,CAAC;AAGrH,UAAU,2BAA2B;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,CAAC,EAAE,2BAA2B,GAClC,OAAO,CAAC;IAAE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAYnD"}
1
+ {"version":3,"file":"list-github-repositories.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/list-github-repositories.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oFAAoF,CAAC;AAGrH,UAAU,2BAA2B;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,sBAAsB,CAC1C,KAAK,CAAC,EAAE,2BAA2B,GAClC,OAAO,CAAC;IAAE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAYnD"}
@@ -1,4 +1,5 @@
1
1
  import type { GitHubRepo } from '../../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
2
+ import type { GitHubOrganization } from '../../../../../../packages/core/src/application/ports/output/services/github-repository-service.interface.js';
2
3
  export interface GitHubRepoBrowserProps {
3
4
  onSelect: (nameWithOwner: string) => void;
4
5
  loading?: boolean;
@@ -6,10 +7,16 @@ export interface GitHubRepoBrowserProps {
6
7
  fetchRepos?: (input?: {
7
8
  search?: string;
8
9
  limit?: number;
10
+ owner?: string;
9
11
  }) => Promise<{
10
12
  repos?: GitHubRepo[];
11
13
  error?: string;
12
14
  }>;
15
+ /** Override the fetch function for testing/stories */
16
+ fetchOrgs?: () => Promise<{
17
+ orgs?: GitHubOrganization[];
18
+ error?: string;
19
+ }>;
13
20
  }
14
- export declare function GitHubRepoBrowser({ onSelect, loading: externalLoading, fetchRepos, }: GitHubRepoBrowserProps): import("react/jsx-runtime").JSX.Element;
21
+ export declare function GitHubRepoBrowser({ onSelect, loading: externalLoading, fetchRepos, fetchOrgs, }: GitHubRepoBrowserProps): import("react/jsx-runtime").JSX.Element;
15
22
  //# sourceMappingURL=github-repo-browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"github-repo-browser.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-repo-browser.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github-repo-browser.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-repo-browser.tsx"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oFAAoF,CAAC;AACrH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oFAAoF,CAAC;AAK7H,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,sDAAsD;IACtD,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE;QACpB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,OAAO,CAAC;QAAE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,sDAAsD;IACtD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,kBAAkB,EAAE,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5E;AAED,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,OAAO,EAAE,eAAuB,EAChC,UAAmC,EACnC,SAAmC,GACpC,EAAE,sBAAsB,2CA+KxB"}
@@ -5,18 +5,44 @@ import { Lock, Globe, Loader2, Search, AlertCircle } from 'lucide-react';
5
5
  import { Input } from '../../ui/input.js';
6
6
  import { Badge } from '../../ui/badge.js';
7
7
  import { Skeleton } from '../../ui/skeleton.js';
8
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/select.js';
8
9
  import { listGitHubRepositories } from '../../../app/actions/list-github-repositories.js';
9
- export function GitHubRepoBrowser({ onSelect, loading: externalLoading = false, fetchRepos = listGitHubRepositories, }) {
10
+ import { listGitHubOrganizations } from '../../../app/actions/list-github-organizations.js';
11
+ /** Sentinel value representing the authenticated user's personal account */
12
+ const PERSONAL_OWNER = '__personal__';
13
+ export function GitHubRepoBrowser({ onSelect, loading: externalLoading = false, fetchRepos = listGitHubRepositories, fetchOrgs = listGitHubOrganizations, }) {
10
14
  const [repos, setRepos] = useState([]);
15
+ const [orgs, setOrgs] = useState([]);
11
16
  const [fetching, setFetching] = useState(true);
12
17
  const [error, setError] = useState('');
13
18
  const [search, setSearch] = useState('');
19
+ const [selectedOwner, setSelectedOwner] = useState(PERSONAL_OWNER);
14
20
  const debounceRef = useRef(null);
15
- const fetchData = useCallback(async (searchTerm) => {
21
+ // Fetch organizations on mount
22
+ useEffect(() => {
23
+ async function loadOrgs() {
24
+ try {
25
+ const result = await fetchOrgs();
26
+ if (result.orgs) {
27
+ setOrgs(result.orgs);
28
+ }
29
+ }
30
+ catch {
31
+ // Org listing failure is non-critical — user can still browse personal repos
32
+ }
33
+ }
34
+ loadOrgs();
35
+ }, [fetchOrgs]);
36
+ const fetchData = useCallback(async (searchTerm, owner) => {
16
37
  setFetching(true);
17
38
  setError('');
18
39
  try {
19
- const result = await fetchRepos(searchTerm ? { search: searchTerm } : undefined);
40
+ const input = {};
41
+ if (searchTerm)
42
+ input.search = searchTerm;
43
+ if (owner && owner !== PERSONAL_OWNER)
44
+ input.owner = owner;
45
+ const result = await fetchRepos(Object.keys(input).length > 0 ? input : undefined);
20
46
  if (result.error) {
21
47
  setError(result.error);
22
48
  setRepos([]);
@@ -34,19 +60,23 @@ export function GitHubRepoBrowser({ onSelect, loading: externalLoading = false,
34
60
  }
35
61
  }, [fetchRepos]);
36
62
  useEffect(() => {
37
- fetchData();
38
- }, [fetchData]);
63
+ fetchData(search || undefined, selectedOwner);
64
+ }, [fetchData, selectedOwner]); // eslint-disable-line react-hooks/exhaustive-deps
39
65
  function handleSearchChange(value) {
40
66
  setSearch(value);
41
67
  if (debounceRef.current)
42
68
  clearTimeout(debounceRef.current);
43
69
  debounceRef.current = setTimeout(() => {
44
- fetchData(value || undefined);
70
+ fetchData(value || undefined, selectedOwner);
45
71
  }, 300);
46
72
  }
73
+ function handleOwnerChange(value) {
74
+ setSelectedOwner(value);
75
+ setSearch('');
76
+ }
47
77
  const disabled = externalLoading;
48
78
  if (error && !fetching) {
49
79
  return (_jsxs("div", { className: "flex flex-col items-center gap-2 py-8 text-center", "data-testid": "repo-browser-error", children: [_jsx(AlertCircle, { className: "text-destructive h-8 w-8" }), _jsx("p", { className: "text-destructive text-sm", children: error })] }));
50
80
  }
51
- return (_jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2" }), _jsx(Input, { placeholder: "Search repositories...", value: search, onChange: (e) => handleSearchChange(e.target.value), className: "ps-9", disabled: disabled, "aria-label": "Search repositories" })] }), _jsx("div", { className: "max-h-64 overflow-x-hidden overflow-y-auto rounded-md border", role: "listbox", "aria-label": "GitHub repositories", children: fetching ? (_jsx("div", { className: "flex flex-col gap-2 p-3", "data-testid": "repo-browser-loading", children: Array.from({ length: 5 }).map((_, i) => (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(Skeleton, { className: "h-4 w-48" }), _jsx(Skeleton, { className: "h-3 w-72" })] }, `skeleton-${String(i)}`))) })) : repos.length === 0 ? (_jsx("div", { className: "text-muted-foreground py-8 text-center text-sm", "data-testid": "repo-browser-empty", children: "No repositories found" })) : (repos.map((repo) => (_jsxs("button", { type: "button", role: "option", "aria-selected": false, className: "hover:bg-accent flex w-full items-start gap-2 border-b px-3 py-2.5 text-start last:border-b-0 disabled:opacity-50", onClick: () => onSelect(repo.nameWithOwner), disabled: disabled, children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "truncate text-sm font-medium", children: repo.nameWithOwner }), _jsx(Badge, { variant: repo.isPrivate ? 'secondary' : 'outline', className: "shrink-0 text-xs", children: repo.isPrivate ? (_jsxs(_Fragment, { children: [_jsx(Lock, { className: "me-1 h-3 w-3" }), "Private"] })) : (_jsxs(_Fragment, { children: [_jsx(Globe, { className: "me-1 h-3 w-3" }), "Public"] })) })] }), repo.description ? (_jsx("p", { className: "text-muted-foreground mt-0.5 truncate text-xs", children: repo.description })) : null] }), disabled ? _jsx(Loader2, { className: "mt-0.5 h-4 w-4 shrink-0 animate-spin" }) : null] }, repo.nameWithOwner)))) })] }));
81
+ return (_jsxs("div", { className: "flex flex-col gap-3", children: [orgs.length > 0 ? (_jsxs(Select, { value: selectedOwner, onValueChange: handleOwnerChange, disabled: disabled, children: [_jsx(SelectTrigger, { "aria-label": "Select owner", children: _jsx(SelectValue, { placeholder: "Select owner" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: PERSONAL_OWNER, children: "My repositories" }), orgs.map((org) => (_jsx(SelectItem, { value: org.login, children: org.login }, org.login)))] })] })) : null, _jsxs("div", { className: "relative", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 h-4 w-4 -translate-y-1/2" }), _jsx(Input, { placeholder: "Search repositories...", value: search, onChange: (e) => handleSearchChange(e.target.value), className: "ps-9", disabled: disabled, "aria-label": "Search repositories" })] }), _jsx("div", { className: "max-h-64 overflow-x-hidden overflow-y-auto rounded-md border", role: "listbox", "aria-label": "GitHub repositories", children: fetching ? (_jsx("div", { className: "flex flex-col gap-2 p-3", "data-testid": "repo-browser-loading", children: Array.from({ length: 5 }).map((_, i) => (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx(Skeleton, { className: "h-4 w-48" }), _jsx(Skeleton, { className: "h-3 w-72" })] }, `skeleton-${String(i)}`))) })) : repos.length === 0 ? (_jsx("div", { className: "text-muted-foreground py-8 text-center text-sm", "data-testid": "repo-browser-empty", children: "No repositories found" })) : (repos.map((repo) => (_jsxs("button", { type: "button", role: "option", "aria-selected": false, className: "hover:bg-accent flex w-full items-start gap-2 border-b px-3 py-2.5 text-start last:border-b-0 disabled:opacity-50", onClick: () => onSelect(repo.nameWithOwner), disabled: disabled, children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "truncate text-sm font-medium", children: repo.nameWithOwner }), _jsx(Badge, { variant: repo.isPrivate ? 'secondary' : 'outline', className: "shrink-0 text-xs", children: repo.isPrivate ? (_jsxs(_Fragment, { children: [_jsx(Lock, { className: "me-1 h-3 w-3" }), "Private"] })) : (_jsxs(_Fragment, { children: [_jsx(Globe, { className: "me-1 h-3 w-3" }), "Public"] })) })] }), repo.description ? (_jsx("p", { className: "text-muted-foreground mt-0.5 truncate text-xs", children: repo.description })) : null] }), disabled ? _jsx(Loader2, { className: "mt-0.5 h-4 w-4 shrink-0 animate-spin" }) : null] }, repo.nameWithOwner)))) })] }));
52
82
  }
@@ -4,6 +4,7 @@ declare const meta: Meta<typeof GitHubRepoBrowser>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof GitHubRepoBrowser>;
6
6
  export declare const Default: Story;
7
+ export declare const WithOrganizations: Story;
7
8
  export declare const Loading: Story;
8
9
  export declare const Empty: Story;
9
10
  export declare const Error: Story;
@@ -1 +1 @@
1
- {"version":3,"file":"github-repo-browser.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;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"}
1
+ {"version":3,"file":"github-repo-browser.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAgE1D,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,iBAAiB,CAiBxC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAEhD,eAAO,MAAM,OAAO,EAAE,KAKrB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAU/B,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAQnB,CAAC"}
@@ -38,6 +38,26 @@ const mockRepos = [
38
38
  pushedAt: '2025-03-11T09:00:00Z',
39
39
  },
40
40
  ];
41
+ const mockOrgRepos = [
42
+ {
43
+ name: 'platform',
44
+ nameWithOwner: 'acme-corp/platform',
45
+ description: 'Core platform monorepo',
46
+ isPrivate: true,
47
+ pushedAt: '2025-03-15T10:00:00Z',
48
+ },
49
+ {
50
+ name: 'design-system',
51
+ nameWithOwner: 'acme-corp/design-system',
52
+ description: 'Shared design system components',
53
+ isPrivate: false,
54
+ pushedAt: '2025-03-14T08:00:00Z',
55
+ },
56
+ ];
57
+ const mockOrgs = [
58
+ { login: 'acme-corp', description: 'Acme Corporation' },
59
+ { login: 'open-source-collective', description: 'Open source projects' },
60
+ ];
41
61
  const meta = {
42
62
  title: 'Composed/GitHubRepoBrowser',
43
63
  component: GitHubRepoBrowser,
@@ -56,17 +76,31 @@ export default meta;
56
76
  export const Default = {
57
77
  args: {
58
78
  fetchRepos: () => Promise.resolve({ repos: mockRepos }),
79
+ fetchOrgs: () => Promise.resolve({ orgs: [] }),
80
+ },
81
+ };
82
+ export const WithOrganizations = {
83
+ args: {
84
+ fetchRepos: (input) => {
85
+ if (input?.owner === 'acme-corp') {
86
+ return Promise.resolve({ repos: mockOrgRepos });
87
+ }
88
+ return Promise.resolve({ repos: mockRepos });
89
+ },
90
+ fetchOrgs: () => Promise.resolve({ orgs: mockOrgs }),
59
91
  },
60
92
  };
61
93
  export const Loading = {
62
94
  args: {
63
95
  // eslint-disable-next-line @typescript-eslint/no-empty-function
64
96
  fetchRepos: () => new Promise(() => { }), // never resolves
97
+ fetchOrgs: () => Promise.resolve({ orgs: [] }),
65
98
  },
66
99
  };
67
100
  export const Empty = {
68
101
  args: {
69
102
  fetchRepos: () => Promise.resolve({ repos: [] }),
103
+ fetchOrgs: () => Promise.resolve({ orgs: [] }),
70
104
  },
71
105
  };
72
106
  export const Error = {
@@ -74,5 +108,6 @@ export const Error = {
74
108
  fetchRepos: () => Promise.resolve({
75
109
  error: 'GitHub CLI is not authenticated. Run `gh auth login` to sign in.',
76
110
  }),
111
+ fetchOrgs: () => Promise.resolve({ orgs: [] }),
77
112
  },
78
113
  };