@shepai/cli 1.127.3 → 1.129.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (388) hide show
  1. package/apis/json-schema/EnvironmentConfig.yaml +3 -0
  2. package/apis/json-schema/FeatureFlags.yaml +5 -0
  3. package/apis/json-schema/Repository.yaml +3 -0
  4. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +4 -0
  5. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +118 -0
  7. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts.map +1 -0
  8. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.js +58 -0
  9. package/dist/packages/core/src/application/ports/output/services/index.d.ts +2 -0
  10. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  11. package/dist/packages/core/src/application/ports/output/services/index.js +1 -0
  12. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts +1 -0
  13. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.d.ts.map +1 -1
  14. package/dist/packages/core/src/application/use-cases/features/delete-feature.use-case.js +46 -15
  15. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts +31 -0
  16. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts.map +1 -0
  17. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.js +86 -0
  18. package/dist/packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.d.ts +13 -0
  19. package/dist/packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.d.ts.map +1 -0
  20. package/dist/packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.js +35 -0
  21. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  22. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +2 -0
  23. package/dist/packages/core/src/domain/generated/output.d.ts +12 -0
  24. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  25. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  26. package/dist/packages/core/src/infrastructure/di/container.js +12 -0
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts +1 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts.map +1 -1
  29. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js +2 -0
  30. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  31. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  32. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -0
  33. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-add-repository-remote-url.d.ts +12 -0
  34. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-add-repository-remote-url.d.ts.map +1 -0
  35. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/040-add-repository-remote-url.js +29 -0
  36. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/041-add-feature-flag-github-import.d.ts +11 -0
  37. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/041-add-feature-flag-github-import.d.ts.map +1 -0
  38. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/041-add-feature-flag-github-import.js +17 -0
  39. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +3 -0
  40. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -1
  41. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +38 -2
  42. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  43. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  44. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +18 -0
  45. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -0
  46. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +171 -0
  47. package/dist/src/presentation/cli/commands/feat/del.command.d.ts +2 -1
  48. package/dist/src/presentation/cli/commands/feat/del.command.d.ts.map +1 -1
  49. package/dist/src/presentation/cli/commands/feat/del.command.js +28 -2
  50. package/dist/src/presentation/cli/commands/repo/add.command.d.ts +13 -0
  51. package/dist/src/presentation/cli/commands/repo/add.command.d.ts.map +1 -0
  52. package/dist/src/presentation/cli/commands/repo/add.command.js +82 -0
  53. package/dist/src/presentation/cli/commands/repo/index.d.ts +1 -0
  54. package/dist/src/presentation/cli/commands/repo/index.d.ts.map +1 -1
  55. package/dist/src/presentation/cli/commands/repo/index.js +4 -1
  56. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts +33 -0
  57. package/dist/src/presentation/tui/wizards/github-import.wizard.d.ts.map +1 -0
  58. package/dist/src/presentation/tui/wizards/github-import.wizard.js +121 -0
  59. package/dist/src/presentation/web/app/actions/delete-feature.d.ts +1 -1
  60. package/dist/src/presentation/web/app/actions/delete-feature.d.ts.map +1 -1
  61. package/dist/src/presentation/web/app/actions/delete-feature.js +3 -1
  62. package/dist/src/presentation/web/app/actions/import-github-repository.d.ts +11 -0
  63. package/dist/src/presentation/web/app/actions/import-github-repository.d.ts.map +1 -0
  64. package/dist/src/presentation/web/app/actions/import-github-repository.js +27 -0
  65. package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts +11 -0
  66. package/dist/src/presentation/web/app/actions/list-github-repositories.d.ts.map +1 -0
  67. package/dist/src/presentation/web/app/actions/list-github-repositories.js +17 -0
  68. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.d.ts +4 -3
  69. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.d.ts.map +1 -1
  70. package/dist/src/presentation/web/components/common/add-repository-button/add-repository-button.js +22 -5
  71. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  72. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +3 -3
  73. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog-config.d.ts +2 -1
  74. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog-config.d.ts.map +1 -1
  75. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.d.ts +1 -1
  76. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.d.ts.map +1 -1
  77. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.js +12 -2
  78. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.d.ts +3 -0
  79. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.d.ts.map +1 -1
  80. package/dist/src/presentation/web/components/common/delete-feature-dialog/delete-feature-dialog.stories.js +17 -0
  81. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +1 -1
  82. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  83. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  84. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +3 -3
  85. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.d.ts +8 -0
  86. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.d.ts.map +1 -0
  87. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.js +33 -0
  88. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.d.ts +10 -0
  89. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.d.ts.map +1 -0
  90. package/dist/src/presentation/web/components/common/github-import-dialog/github-import-dialog.stories.js +26 -0
  91. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts +15 -0
  92. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.d.ts.map +1 -0
  93. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.js +52 -0
  94. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts +10 -0
  95. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.d.ts.map +1 -0
  96. package/dist/src/presentation/web/components/common/github-import-dialog/github-repo-browser.stories.js +78 -0
  97. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.d.ts +7 -0
  98. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.d.ts.map +1 -0
  99. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.js +46 -0
  100. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.stories.d.ts +10 -0
  101. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.stories.d.ts.map +1 -0
  102. package/dist/src/presentation/web/components/common/github-import-dialog/github-url-input.stories.js +29 -0
  103. package/dist/src/presentation/web/components/common/github-import-dialog/index.d.ts +4 -0
  104. package/dist/src/presentation/web/components/common/github-import-dialog/index.d.ts.map +1 -0
  105. package/dist/src/presentation/web/components/common/github-import-dialog/index.js +3 -0
  106. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  107. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +2 -2
  108. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +1 -1
  109. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  110. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +2 -2
  111. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  112. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +9 -1
  113. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  114. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +3 -0
  115. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  116. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +5 -0
  117. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  118. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
  119. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  120. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +56 -27
  121. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  122. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +7 -1
  123. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  124. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
  125. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  126. package/dist/src/presentation/web/hooks/use-graph-state.js +1 -1
  127. package/dist/src/presentation/web/lib/derive-graph.d.ts +1 -1
  128. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
  129. package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
  130. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  131. package/dist/src/presentation/web/lib/feature-flags.js +5 -0
  132. package/dist/tsconfig.build.tsbuildinfo +1 -1
  133. package/package.json +1 -1
  134. package/web/.next/BUILD_ID +1 -1
  135. package/web/.next/build-manifest.json +2 -2
  136. package/web/.next/fallback-build-manifest.json +2 -2
  137. package/web/.next/prerender-manifest.json +3 -3
  138. package/web/.next/required-server-files.js +2 -2
  139. package/web/.next/required-server-files.json +2 -2
  140. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +74 -44
  141. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
  142. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  143. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +74 -44
  145. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  146. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  147. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  148. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +86 -56
  149. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
  150. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  151. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  152. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +86 -56
  153. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  154. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  155. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  156. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +70 -40
  157. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  158. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  159. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  160. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +74 -44
  161. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  162. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  163. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  164. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +86 -56
  165. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
  166. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  167. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  168. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +86 -56
  169. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  170. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  171. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  172. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +70 -40
  173. package/web/.next/server/app/(dashboard)/page.js +3 -3
  174. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  175. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  176. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +70 -40
  177. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  178. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  179. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  180. package/web/.next/server/app/_global-error.html +2 -2
  181. package/web/.next/server/app/_global-error.rsc +1 -1
  182. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  183. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  184. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  185. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  186. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  187. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +32 -2
  188. package/web/.next/server/app/_not-found/page.js +1 -1
  189. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  190. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  191. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  192. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  193. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  194. package/web/.next/server/app/settings/page/server-reference-manifest.json +42 -12
  195. package/web/.next/server/app/settings/page.js +2 -2
  196. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  197. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  198. package/web/.next/server/app/skills/page/server-reference-manifest.json +42 -12
  199. package/web/.next/server/app/skills/page.js +2 -1
  200. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  201. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  202. package/web/.next/server/app/tools/page/server-reference-manifest.json +42 -12
  203. package/web/.next/server/app/tools/page.js +2 -1
  204. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  205. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  206. package/web/.next/server/app/version/page/server-reference-manifest.json +32 -2
  207. package/web/.next/server/app/version/page.js +2 -2
  208. package/web/.next/server/app/version/page.js.nft.json +1 -1
  209. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  210. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  211. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  212. package/web/.next/server/chunks/[root-of-the-server]__dcd4f847._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +3 -0
  214. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +1 -0
  215. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  216. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  217. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_8b618f7d._.js +3 -0
  218. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_8b618f7d._.js.map +1 -0
  219. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +3 -0
  220. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +1 -0
  221. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +3 -0
  222. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +1 -0
  223. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js +3 -0
  224. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js.map +1 -0
  225. package/web/.next/server/chunks/ssr/[root-of-the-server]__2f886f77._.js +4 -0
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__2f886f77._.js.map +1 -0
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +3 -0
  228. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js.map +1 -0
  229. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +4 -0
  230. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -0
  231. package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js +4 -0
  232. package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js.map +1 -0
  233. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  234. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  235. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6cc70784._.js → [root-of-the-server]__755cfe02._.js} +2 -2
  236. package/web/.next/server/chunks/ssr/{[root-of-the-server]__430169b6._.js.map → [root-of-the-server]__755cfe02._.js.map} +1 -1
  237. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +4 -0
  238. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -0
  239. package/web/.next/server/chunks/ssr/{[root-of-the-server]__34323a67._.js → [root-of-the-server]__a21eef5a._.js} +2 -2
  240. package/web/.next/server/chunks/ssr/[root-of-the-server]__a21eef5a._.js.map +1 -0
  241. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1aa034e9._.js → [root-of-the-server]__a628fb91._.js} +2 -2
  242. package/web/.next/server/chunks/ssr/{[root-of-the-server]__e44ae5ca._.js.map → [root-of-the-server]__a628fb91._.js.map} +1 -1
  243. package/web/.next/server/chunks/ssr/{[root-of-the-server]__e44ae5ca._.js → [root-of-the-server]__bfba58e6._.js} +2 -2
  244. package/web/.next/server/chunks/ssr/{[root-of-the-server]__6cc70784._.js.map → [root-of-the-server]__bfba58e6._.js.map} +1 -1
  245. package/web/.next/server/chunks/ssr/{[root-of-the-server]__430169b6._.js → [root-of-the-server]__c3ab8422._.js} +2 -2
  246. package/web/.next/server/chunks/ssr/{[root-of-the-server]__1aa034e9._.js.map → [root-of-the-server]__c3ab8422._.js.map} +1 -1
  247. package/web/.next/server/chunks/ssr/[root-of-the-server]__d61bd462._.js +3 -0
  248. package/web/.next/server/chunks/ssr/[root-of-the-server]__d61bd462._.js.map +1 -0
  249. package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js +4 -0
  250. package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js.map +1 -0
  251. package/web/.next/server/chunks/ssr/{_918887c5._.js → _0020fddd._.js} +2 -2
  252. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -0
  253. package/web/.next/server/chunks/ssr/_01046927._.js +9 -0
  254. package/web/.next/server/chunks/ssr/_01046927._.js.map +1 -0
  255. package/web/.next/server/chunks/ssr/{_2f6f48b8._.js → _02ec1aea._.js} +2 -2
  256. package/web/.next/server/chunks/ssr/{_2f6f48b8._.js.map → _02ec1aea._.js.map} +1 -1
  257. package/web/.next/server/chunks/ssr/_04c9e229._.js +3 -0
  258. package/web/.next/server/chunks/ssr/_04c9e229._.js.map +1 -0
  259. package/web/.next/server/chunks/ssr/_67104d9e._.js +3 -0
  260. package/web/.next/server/chunks/ssr/_67104d9e._.js.map +1 -0
  261. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  262. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  263. package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
  264. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
  265. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  266. package/web/.next/server/chunks/ssr/{_4207f708._.js → _ade68272._.js} +2 -2
  267. package/web/.next/server/chunks/ssr/_ade68272._.js.map +1 -0
  268. package/web/.next/server/chunks/ssr/_b4b8a636._.js +3 -0
  269. package/web/.next/server/chunks/ssr/_b4b8a636._.js.map +1 -0
  270. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  271. package/web/.next/server/chunks/ssr/_d8575088._.js +3 -0
  272. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -0
  273. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  274. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  275. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  276. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  277. package/web/.next/server/chunks/ssr/node_modules__pnpm_55c7a131._.js +3 -0
  278. package/web/.next/server/chunks/ssr/node_modules__pnpm_55c7a131._.js.map +1 -0
  279. package/web/.next/server/chunks/ssr/{src_presentation_web_0f98f202._.js → src_presentation_web_12d7d3c5._.js} +2 -2
  280. package/web/.next/server/chunks/ssr/{src_presentation_web_0f98f202._.js.map → src_presentation_web_12d7d3c5._.js.map} +1 -1
  281. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +5 -0
  282. package/web/.next/server/chunks/ssr/{src_presentation_web_9db47db7._.js.map → src_presentation_web_8e7fe0d1._.js.map} +1 -1
  283. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +3 -0
  284. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +1 -0
  285. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +3 -0
  286. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -0
  287. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +3 -0
  288. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -0
  289. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +5 -0
  290. package/web/.next/server/chunks/ssr/{src_presentation_web_ede4a227._.js.map → src_presentation_web_b9023017._.js.map} +1 -1
  291. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +3 -0
  292. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js.map +1 -0
  293. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  294. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  295. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  296. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  297. package/web/.next/server/pages/500.html +2 -2
  298. package/web/.next/server/server-reference-manifest.js +1 -1
  299. package/web/.next/server/server-reference-manifest.json +520 -294
  300. package/web/.next/static/chunks/114347d98fd69f40.js +1 -0
  301. package/web/.next/static/chunks/20ff528aadba66aa.js +1 -0
  302. package/web/.next/static/chunks/278f99f8cc87ab17.js +1 -0
  303. package/web/.next/static/chunks/29535b9b36889453.js +1 -0
  304. package/web/.next/static/chunks/314b8314f77d6921.js +1 -0
  305. package/web/.next/static/chunks/3e1e0f9bde3530d2.js +1 -0
  306. package/web/.next/static/chunks/601d93593f5f664f.js +1 -0
  307. package/web/.next/static/chunks/{fa373c6f8139a712.js → 60464e75e7dff8f4.js} +2 -2
  308. package/web/.next/static/chunks/60fabfee2f9ae935.js +1 -0
  309. package/web/.next/static/chunks/688971d5bad5dc7c.js +1 -0
  310. package/web/.next/static/chunks/6c6ab4d42b07fb4b.js +1 -0
  311. package/web/.next/static/chunks/6cba93f351d29ae4.js +1 -0
  312. package/web/.next/static/chunks/{41c7cee55ef51fc8.js → 83ae4f574f3dee4d.js} +1 -1
  313. package/web/.next/static/chunks/{62a58d2f3cd5f35f.js → 98b6ea0af565042f.js} +2 -2
  314. package/web/.next/static/chunks/98dfbecc5ee30ce1.css +1 -0
  315. package/web/.next/static/chunks/ab3f7ac1960397d9.js +1 -0
  316. package/web/.next/static/chunks/c975a20b880c47ea.js +1 -0
  317. package/web/.next/static/chunks/d34a91958ca566fa.js +13 -0
  318. package/web/.next/static/chunks/f259386f4875e70c.js +1 -0
  319. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_fbb88113.js +0 -3
  320. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_fbb88113.js.map +0 -1
  321. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_fdfbf5cc.js +0 -3
  322. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_fdfbf5cc.js.map +0 -1
  323. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_d8fa0b5f.js +0 -3
  324. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_d8fa0b5f.js.map +0 -1
  325. package/web/.next/server/chunks/ssr/[root-of-the-server]__02c84e6b._.js +0 -3
  326. package/web/.next/server/chunks/ssr/[root-of-the-server]__02c84e6b._.js.map +0 -1
  327. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js +0 -3
  328. package/web/.next/server/chunks/ssr/[root-of-the-server]__06fef644._.js.map +0 -1
  329. package/web/.next/server/chunks/ssr/[root-of-the-server]__34323a67._.js.map +0 -1
  330. package/web/.next/server/chunks/ssr/[root-of-the-server]__357de47c._.js +0 -4
  331. package/web/.next/server/chunks/ssr/[root-of-the-server]__357de47c._.js.map +0 -1
  332. package/web/.next/server/chunks/ssr/[root-of-the-server]__67fe07fe._.js +0 -4
  333. package/web/.next/server/chunks/ssr/[root-of-the-server]__67fe07fe._.js.map +0 -1
  334. package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js +0 -3
  335. package/web/.next/server/chunks/ssr/[root-of-the-server]__68c2d48e._.js.map +0 -1
  336. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +0 -4
  337. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +0 -1
  338. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +0 -4
  339. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +0 -1
  340. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js +0 -4
  341. package/web/.next/server/chunks/ssr/[root-of-the-server]__8c553503._.js.map +0 -1
  342. package/web/.next/server/chunks/ssr/[root-of-the-server]__a50a7e39._.js +0 -4
  343. package/web/.next/server/chunks/ssr/[root-of-the-server]__a50a7e39._.js.map +0 -1
  344. package/web/.next/server/chunks/ssr/_1bb79fe8._.js +0 -3
  345. package/web/.next/server/chunks/ssr/_1bb79fe8._.js.map +0 -1
  346. package/web/.next/server/chunks/ssr/_4207f708._.js.map +0 -1
  347. package/web/.next/server/chunks/ssr/_583a83fb._.js +0 -3
  348. package/web/.next/server/chunks/ssr/_583a83fb._.js.map +0 -1
  349. package/web/.next/server/chunks/ssr/_918887c5._.js.map +0 -1
  350. package/web/.next/server/chunks/ssr/_9f56cf8f._.js +0 -3
  351. package/web/.next/server/chunks/ssr/_9f56cf8f._.js.map +0 -1
  352. package/web/.next/server/chunks/ssr/_a187fd7e._.js +0 -3
  353. package/web/.next/server/chunks/ssr/_a187fd7e._.js.map +0 -1
  354. package/web/.next/server/chunks/ssr/_a5aa6371._.js +0 -9
  355. package/web/.next/server/chunks/ssr/_a5aa6371._.js.map +0 -1
  356. package/web/.next/server/chunks/ssr/_b730ac57._.js +0 -3
  357. package/web/.next/server/chunks/ssr/_b730ac57._.js.map +0 -1
  358. package/web/.next/server/chunks/ssr/_fae9e550._.js +0 -3
  359. package/web/.next/server/chunks/ssr/_fae9e550._.js.map +0 -1
  360. package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js +0 -3
  361. package/web/.next/server/chunks/ssr/f7870_sonner_dist_index_mjs_dbf63824._.js.map +0 -1
  362. package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js +0 -3
  363. package/web/.next/server/chunks/ssr/node_modules__pnpm_026172d1._.js.map +0 -1
  364. package/web/.next/server/chunks/ssr/src_presentation_web_9db47db7._.js +0 -5
  365. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f66cd328.js +0 -3
  366. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_f66cd328.js.map +0 -1
  367. package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js +0 -3
  368. package/web/.next/server/chunks/ssr/src_presentation_web_components_bdcfba35._.js.map +0 -1
  369. package/web/.next/server/chunks/ssr/src_presentation_web_ede4a227._.js +0 -5
  370. package/web/.next/static/chunks/01ba448cf76c6014.js +0 -1
  371. package/web/.next/static/chunks/05e9c71e5e4cf531.js +0 -1
  372. package/web/.next/static/chunks/33d2f67ad4814aba.css +0 -1
  373. package/web/.next/static/chunks/534e18ee1fbd8452.js +0 -1
  374. package/web/.next/static/chunks/8080c842b0358904.js +0 -1
  375. package/web/.next/static/chunks/9b2a23851096f1aa.js +0 -1
  376. package/web/.next/static/chunks/a67c9c6125c1aa32.js +0 -1
  377. package/web/.next/static/chunks/a8ba3f3e2b0f87aa.js +0 -1
  378. package/web/.next/static/chunks/abc3f71a05ccbdfe.js +0 -1
  379. package/web/.next/static/chunks/c1f3db103c2b226f.js +0 -1
  380. package/web/.next/static/chunks/cca0f5112a9260d8.js +0 -1
  381. package/web/.next/static/chunks/cd45aed9c46e1bf5.js +0 -11
  382. package/web/.next/static/chunks/d04de4be30ab78ca.js +0 -3
  383. package/web/.next/static/chunks/d47658be0870a4b9.js +0 -1
  384. package/web/.next/static/chunks/d8e86e8e5bb7cc0a.js +0 -1
  385. package/web/.next/static/chunks/f9667ee1e5b445b7.js +0 -1
  386. /package/web/.next/static/{hWrKuop_3FR0syZrFWLvn → _hAwvNHgk12VPT5IIxRV6}/_buildManifest.js +0 -0
  387. /package/web/.next/static/{hWrKuop_3FR0syZrFWLvn → _hAwvNHgk12VPT5IIxRV6}/_clientMiddlewareManifest.json +0 -0
  388. /package/web/.next/static/{hWrKuop_3FR0syZrFWLvn → _hAwvNHgk12VPT5IIxRV6}/_ssgManifest.js +0 -0
@@ -14,6 +14,9 @@ properties:
14
14
  $ref: TerminalType.yaml
15
15
  default: system
16
16
  description: Preferred terminal emulator
17
+ defaultCloneDirectory:
18
+ type: string
19
+ description: Default directory for cloning GitHub repositories (e.g. ~/repos)
17
20
  required:
18
21
  - defaultEditor
19
22
  - shellPreference
@@ -14,6 +14,10 @@ properties:
14
14
  type: boolean
15
15
  default: false
16
16
  description: Enable debug UI elements and verbose client-side logging
17
+ githubImport:
18
+ type: boolean
19
+ default: false
20
+ description: Enable GitHub repository import in the web UI
17
21
  adoptBranch:
18
22
  type: boolean
19
23
  default: false
@@ -22,5 +26,6 @@ required:
22
26
  - skills
23
27
  - envDeploy
24
28
  - debug
29
+ - githubImport
25
30
  - adoptBranch
26
31
  description: Feature flag toggles for runtime feature control
@@ -8,6 +8,9 @@ properties:
8
8
  path:
9
9
  type: string
10
10
  description: Absolute file system path to the repository root (unique)
11
+ remoteUrl:
12
+ type: string
13
+ description: "Remote GitHub URL this repository was cloned from (normalized: lowercase, no .git suffix)"
11
14
  required:
12
15
  - name
13
16
  - path
@@ -10,10 +10,14 @@ export interface IRepositoryRepository {
10
10
  findByPath(path: string): Promise<Repository | null>;
11
11
  /** Find by path including soft-deleted records (for re-activation). */
12
12
  findByPathIncludingDeleted(path: string): Promise<Repository | null>;
13
+ /** Find a non-deleted repository by its remote URL (normalized: lowercase, no .git suffix). */
14
+ findByRemoteUrl(url: string): Promise<Repository | null>;
13
15
  list(): Promise<Repository[]>;
14
16
  remove(id: string): Promise<void>;
15
17
  softDelete(id: string): Promise<void>;
16
18
  /** Restore a soft-deleted repository by clearing deletedAt. */
17
19
  restore(id: string): Promise<void>;
20
+ /** Update specific fields on an existing repository. */
21
+ update(id: string, fields: Partial<Pick<Repository, 'name' | 'path' | 'remoteUrl'>>): Promise<Repository>;
18
22
  }
19
23
  //# sourceMappingURL=repository-repository.interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository-repository.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/repositories/repository-repository.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrD,uEAAuE;IACvE,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrE,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC"}
1
+ {"version":3,"file":"repository-repository.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/repositories/repository-repository.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrD,uEAAuE;IACvE,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrE,+FAA+F;IAC/F,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACzD,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,wDAAwD;IACxD,MAAM,CACJ,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,WAAW,CAAC,CAAC,GAC/D,OAAO,CAAC,UAAU,CAAC,CAAC;CACxB"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * GitHub Repository Service Interface
3
+ *
4
+ * Output port for GitHub repository operations via the gh CLI.
5
+ * Implementations manage authentication checks, repository cloning,
6
+ * user repository listing, and GitHub URL parsing.
7
+ */
8
+ /**
9
+ * Thrown when the GitHub CLI is not authenticated.
10
+ */
11
+ export declare class GitHubAuthError extends Error {
12
+ constructor(message: string, cause?: Error);
13
+ }
14
+ /**
15
+ * Thrown when a `gh repo clone` operation fails.
16
+ */
17
+ export declare class GitHubCloneError extends Error {
18
+ constructor(message: string, cause?: Error);
19
+ }
20
+ /**
21
+ * Thrown when a GitHub URL cannot be parsed into owner/repo.
22
+ */
23
+ export declare class GitHubUrlParseError extends Error {
24
+ constructor(message: string, cause?: Error);
25
+ }
26
+ /**
27
+ * Thrown when listing the user's GitHub repositories fails.
28
+ */
29
+ export declare class GitHubRepoListError extends Error {
30
+ constructor(message: string, cause?: Error);
31
+ }
32
+ /**
33
+ * A GitHub repository as returned by `gh repo list --json`.
34
+ */
35
+ export interface GitHubRepo {
36
+ /** Repository name (e.g. "my-project") */
37
+ name: string;
38
+ /** Full owner/repo identifier (e.g. "octocat/my-project") */
39
+ nameWithOwner: string;
40
+ /** Repository description (may be empty string) */
41
+ description: string;
42
+ /** Whether the repository is private */
43
+ isPrivate: boolean;
44
+ /** ISO 8601 timestamp of the most recent push */
45
+ pushedAt: string;
46
+ }
47
+ /**
48
+ * Options for listing user repositories.
49
+ */
50
+ export interface ListUserRepositoriesOptions {
51
+ /** Maximum number of repos to return (default: 30) */
52
+ limit?: number;
53
+ /** Filter repos by name substring */
54
+ search?: string;
55
+ }
56
+ /**
57
+ * Options for cloning a repository.
58
+ */
59
+ export interface CloneOptions {
60
+ /** Callback invoked with stderr chunks during clone for progress display */
61
+ onProgress?: (data: string) => void;
62
+ }
63
+ /**
64
+ * Result of parsing a GitHub URL.
65
+ */
66
+ export interface ParsedGitHubUrl {
67
+ /** Repository owner (e.g. "octocat") */
68
+ owner: string;
69
+ /** Repository name (e.g. "my-project") */
70
+ repo: string;
71
+ /** Combined owner/repo (e.g. "octocat/my-project") */
72
+ nameWithOwner: string;
73
+ }
74
+ /**
75
+ * Output port for GitHub repository operations.
76
+ *
77
+ * Implementations use the `gh` CLI for all GitHub interactions.
78
+ */
79
+ export interface IGitHubRepositoryService {
80
+ /**
81
+ * Verify that the GitHub CLI is authenticated.
82
+ *
83
+ * @throws {GitHubAuthError} if `gh auth status` indicates the user is not logged in
84
+ */
85
+ checkAuth(): Promise<void>;
86
+ /**
87
+ * Clone a GitHub repository to a local destination directory.
88
+ *
89
+ * @param nameWithOwner - Full owner/repo identifier (e.g. "octocat/my-project")
90
+ * @param destination - Absolute path to clone into
91
+ * @param options - Optional clone configuration (e.g. progress callback)
92
+ * @throws {GitHubCloneError} if the clone subprocess fails
93
+ */
94
+ cloneRepository(nameWithOwner: string, destination: string, options?: CloneOptions): Promise<void>;
95
+ /**
96
+ * List the authenticated user's GitHub repositories.
97
+ *
98
+ * @param options - Optional filtering and pagination
99
+ * @returns Array of GitHub repositories sorted by most recently pushed
100
+ * @throws {GitHubRepoListError} if the list operation fails
101
+ */
102
+ listUserRepositories(options?: ListUserRepositoriesOptions): Promise<GitHubRepo[]>;
103
+ /**
104
+ * Parse a GitHub URL or shorthand into its owner/repo components.
105
+ *
106
+ * Supported formats:
107
+ * - `https://github.com/owner/repo`
108
+ * - `https://github.com/owner/repo.git`
109
+ * - `git@github.com:owner/repo.git`
110
+ * - `owner/repo` (shorthand)
111
+ *
112
+ * @param url - The GitHub URL or shorthand to parse
113
+ * @returns Parsed owner, repo, and nameWithOwner
114
+ * @throws {GitHubUrlParseError} if the URL does not match any supported format
115
+ */
116
+ parseGitHubUrl(url: string): ParsedGitHubUrl;
117
+ }
118
+ //# sourceMappingURL=github-repository-service.interface.d.ts.map
@@ -0,0 +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;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;CAC9C"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * GitHub Repository Service Interface
3
+ *
4
+ * Output port for GitHub repository operations via the gh CLI.
5
+ * Implementations manage authentication checks, repository cloning,
6
+ * user repository listing, and GitHub URL parsing.
7
+ */
8
+ // ---------------------------------------------------------------------------
9
+ // Error classes
10
+ // ---------------------------------------------------------------------------
11
+ /**
12
+ * Thrown when the GitHub CLI is not authenticated.
13
+ */
14
+ export class GitHubAuthError extends Error {
15
+ constructor(message, cause) {
16
+ super(message);
17
+ this.name = 'GitHubAuthError';
18
+ Object.setPrototypeOf(this, new.target.prototype);
19
+ if (cause)
20
+ this.cause = cause;
21
+ }
22
+ }
23
+ /**
24
+ * Thrown when a `gh repo clone` operation fails.
25
+ */
26
+ export class GitHubCloneError extends Error {
27
+ constructor(message, cause) {
28
+ super(message);
29
+ this.name = 'GitHubCloneError';
30
+ Object.setPrototypeOf(this, new.target.prototype);
31
+ if (cause)
32
+ this.cause = cause;
33
+ }
34
+ }
35
+ /**
36
+ * Thrown when a GitHub URL cannot be parsed into owner/repo.
37
+ */
38
+ export class GitHubUrlParseError extends Error {
39
+ constructor(message, cause) {
40
+ super(message);
41
+ this.name = 'GitHubUrlParseError';
42
+ Object.setPrototypeOf(this, new.target.prototype);
43
+ if (cause)
44
+ this.cause = cause;
45
+ }
46
+ }
47
+ /**
48
+ * Thrown when listing the user's GitHub repositories fails.
49
+ */
50
+ export class GitHubRepoListError extends Error {
51
+ constructor(message, cause) {
52
+ super(message);
53
+ this.name = 'GitHubRepoListError';
54
+ Object.setPrototypeOf(this, new.target.prototype);
55
+ if (cause)
56
+ this.cause = cause;
57
+ }
58
+ }
@@ -17,4 +17,6 @@ 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';
21
+ export { GitHubAuthError, GitHubCloneError, GitHubUrlParseError, GitHubRepoListError, } from './github-repository-service.interface.js';
20
22
  //# 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,MAAM,6BAA6B,CAAC;AACzE,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"}
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,MAAM,6BAA6B,CAAC;AACzE,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"}
@@ -6,3 +6,4 @@
6
6
  export { IssueFetcherError, IssueNotFoundError, IssueAuthenticationError, IssueServiceUnavailableError, } from './external-issue-fetcher.interface.js';
7
7
  export { WorktreeError, WorktreeErrorCode } from './worktree-service.interface.js';
8
8
  export { GitPrError, GitPrErrorCode } from './git-pr-service.interface.js';
9
+ export { GitHubAuthError, GitHubCloneError, GitHubUrlParseError, GitHubRepoListError, } from './github-repository-service.interface.js';
@@ -21,6 +21,7 @@ import type { IGitPrService } from '../../ports/output/services/git-pr-service.i
21
21
  export interface DeleteFeatureOptions {
22
22
  cleanup?: boolean;
23
23
  cascadeDelete?: boolean;
24
+ closePr?: boolean;
24
25
  }
25
26
  export declare class DeleteFeatureUseCase {
26
27
  private readonly featureRepo;
@@ -1 +1 @@
1
- {"version":3,"file":"delete-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/delete-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBACa,oBAAoB;IAEC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAE5D,OAAO,CAAC,QAAQ,CAAC,cAAc;IACA,OAAO,CAAC,QAAQ,CAAC,OAAO;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBALP,WAAW,EAAE,kBAAkB,EACjC,eAAe,EAAE,gBAAgB,EAE7D,cAAc,EAAE,2BAA2B,EACZ,OAAO,EAAE,mBAAmB,EAClC,YAAY,EAAE,aAAa;IAGjE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IA8BlF,oGAAoG;YACtF,gBAAgB;IAW9B,0DAA0D;YAC5C,iBAAiB;IAQ/B,6DAA6D;YAC/C,yBAAyB;IAWvC,sDAAsD;YACxC,sBAAsB;IAYpC,6EAA6E;YAC/D,oBAAoB;CAsDnC"}
1
+ {"version":3,"file":"delete-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/delete-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAEnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAClG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yDAAyD,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBACa,oBAAoB;IAEC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAE5D,OAAO,CAAC,QAAQ,CAAC,cAAc;IACA,OAAO,CAAC,QAAQ,CAAC,OAAO;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBALP,WAAW,EAAE,kBAAkB,EACjC,eAAe,EAAE,gBAAgB,EAE7D,cAAc,EAAE,2BAA2B,EACZ,OAAO,EAAE,mBAAmB,EAClC,YAAY,EAAE,aAAa;IAGjE,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IA8BlF,oGAAoG;YACtF,gBAAgB;IAW9B,0DAA0D;YAC5C,iBAAiB;IAQ/B,6DAA6D;YAC/C,yBAAyB;IAevC,sDAAsD;YACxC,sBAAsB;IAYpC,6EAA6E;YAC/D,oBAAoB;CA+EnC"}
@@ -25,7 +25,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
25
25
  return function (target, key) { decorator(target, key, paramIndex); }
26
26
  };
27
27
  import { injectable, inject } from 'tsyringe';
28
- import { AgentRunStatus, SdlcLifecycle } from '../../../domain/generated/output.js';
28
+ import { AgentRunStatus, PrStatus, SdlcLifecycle } from '../../../domain/generated/output.js';
29
29
  let DeleteFeatureUseCase = class DeleteFeatureUseCase {
30
30
  featureRepo;
31
31
  worktreeService;
@@ -93,6 +93,10 @@ let DeleteFeatureUseCase = class DeleteFeatureUseCase {
93
93
  });
94
94
  // Soft-delete: sets deletedAt, hiding from normal queries
95
95
  await this.featureRepo.softDelete(feature.id);
96
+ // Sync the in-memory feature object so subsequent update() calls
97
+ // (e.g. PR status update in cleanup) don't overwrite deleted_at back to null.
98
+ feature.lifecycle = SdlcLifecycle.Deleting;
99
+ feature.deletedAt = new Date();
96
100
  }
97
101
  /** Recursively cleanup all children (depth-first). */
98
102
  async cascadeCleanupChildren(parentId, options) {
@@ -133,22 +137,49 @@ let DeleteFeatureUseCase = class DeleteFeatureUseCase {
133
137
  }
134
138
  const cleanup = options?.cleanup !== false;
135
139
  if (cleanup) {
136
- // Delete local feature branch
137
- try {
138
- await this.gitPrService.deleteBranch(feature.repositoryPath, feature.branch);
139
- }
140
- catch {
141
- // Branch might not exist
142
- }
143
- // Delete remote feature branch if it exists
144
- try {
145
- const remoteExists = await this.worktreeService.remoteBranchExists(feature.repositoryPath, feature.branch);
146
- if (remoteExists) {
147
- await this.gitPrService.deleteBranch(feature.repositoryPath, feature.branch, true);
140
+ const shouldDeleteRemote = options?.closePr !== false;
141
+ // Delete local branch, and also remote if closePr is enabled.
142
+ // deleteBranch(cwd, branch, true) deletes local then remote in one call,
143
+ // so we must NOT delete local separately when also deleting remote.
144
+ if (shouldDeleteRemote) {
145
+ let remoteDeleted = false;
146
+ try {
147
+ const remoteExists = await this.worktreeService.remoteBranchExists(feature.repositoryPath, feature.branch);
148
+ if (remoteExists) {
149
+ // Delete local + remote in one call (deleteBranch does local first, then remote)
150
+ await this.gitPrService.deleteBranch(feature.repositoryPath, feature.branch, true);
151
+ remoteDeleted = true;
152
+ }
153
+ else {
154
+ // No remote branch — just delete local
155
+ await this.gitPrService.deleteBranch(feature.repositoryPath, feature.branch);
156
+ }
157
+ }
158
+ catch {
159
+ // Branch cleanup is best-effort
160
+ }
161
+ // Update pr.status to Closed after remote branch deletion (GitHub auto-closes the PR)
162
+ if (remoteDeleted && feature.pr?.status === PrStatus.Open) {
163
+ try {
164
+ await this.featureRepo.update({
165
+ ...feature,
166
+ pr: { ...feature.pr, status: PrStatus.Closed },
167
+ updatedAt: new Date(),
168
+ });
169
+ }
170
+ catch {
171
+ // PR status update is best-effort
172
+ }
148
173
  }
149
174
  }
150
- catch {
151
- // Remote branch cleanup is best-effort
175
+ else {
176
+ // closePr is false — only delete local branch, preserve remote (and the PR)
177
+ try {
178
+ await this.gitPrService.deleteBranch(feature.repositoryPath, feature.branch);
179
+ }
180
+ catch {
181
+ // Branch might not exist
182
+ }
152
183
  }
153
184
  }
154
185
  }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Import GitHub Repository Use Case
3
+ *
4
+ * Orchestrates importing a GitHub repository: validates the URL, checks auth,
5
+ * detects duplicates by remoteUrl, clones via IGitHubRepositoryService,
6
+ * delegates local registration to AddRepositoryUseCase, and updates the
7
+ * repository record with the normalized remoteUrl.
8
+ */
9
+ import type { Repository } from '../../../domain/generated/output.js';
10
+ import type { IGitHubRepositoryService, CloneOptions } from '../../ports/output/services/github-repository-service.interface.js';
11
+ import type { IRepositoryRepository } from '../../ports/output/repositories/repository-repository.interface.js';
12
+ import { AddRepositoryUseCase } from './add-repository.use-case.js';
13
+ export interface ImportGitHubRepositoryInput {
14
+ /** GitHub URL or shorthand (e.g. "owner/repo") */
15
+ url: string;
16
+ /** Override clone destination directory */
17
+ dest?: string;
18
+ /** Default base directory for clones (from settings) */
19
+ defaultCloneDir?: string;
20
+ /** Options for the clone subprocess (e.g. progress callback) */
21
+ cloneOptions?: CloneOptions;
22
+ }
23
+ export declare class ImportGitHubRepositoryUseCase {
24
+ private readonly gitHubService;
25
+ private readonly repositoryRepo;
26
+ private readonly addRepositoryUseCase;
27
+ constructor(gitHubService: IGitHubRepositoryService, repositoryRepo: IRepositoryRepository, addRepositoryUseCase: AddRepositoryUseCase);
28
+ execute(input: ImportGitHubRepositoryInput): Promise<Repository>;
29
+ private resolveDestination;
30
+ }
31
+ //# sourceMappingURL=import-github-repository.use-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-github-repository.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/repositories/import-github-repository.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EACV,wBAAwB,EACxB,YAAY,EACb,MAAM,oEAAoE,CAAC;AAC5E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oEAAoE,CAAC;AAChH,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,WAAW,2BAA2B;IAC1C,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,gEAAgE;IAChE,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAUD,qBACa,6BAA6B;IAGtC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,oBAAoB;gBAJpB,aAAa,EAAE,wBAAwB,EAEvC,cAAc,EAAE,qBAAqB,EAErC,oBAAoB,EAAE,oBAAoB;IAGvD,OAAO,CAAC,KAAK,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,CAAC;IAoCtE,OAAO,CAAC,kBAAkB;CAW3B"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Import GitHub Repository Use Case
3
+ *
4
+ * Orchestrates importing a GitHub repository: validates the URL, checks auth,
5
+ * detects duplicates by remoteUrl, clones via IGitHubRepositoryService,
6
+ * delegates local registration to AddRepositoryUseCase, and updates the
7
+ * repository record with the normalized remoteUrl.
8
+ */
9
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
10
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
11
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
12
+ 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;
13
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
14
+ };
15
+ var __metadata = (this && this.__metadata) || function (k, v) {
16
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
17
+ };
18
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
19
+ return function (target, key) { decorator(target, key, paramIndex); }
20
+ };
21
+ import { injectable, inject } from 'tsyringe';
22
+ import { homedir } from 'node:os';
23
+ import { join } from 'node:path';
24
+ import { AddRepositoryUseCase } from './add-repository.use-case.js';
25
+ /**
26
+ * Normalizes a GitHub remote URL for storage and duplicate detection.
27
+ * Lowercases and strips trailing .git suffix.
28
+ */
29
+ function normalizeRemoteUrl(nameWithOwner) {
30
+ return `https://github.com/${nameWithOwner.toLowerCase()}`;
31
+ }
32
+ let ImportGitHubRepositoryUseCase = class ImportGitHubRepositoryUseCase {
33
+ gitHubService;
34
+ repositoryRepo;
35
+ addRepositoryUseCase;
36
+ constructor(gitHubService, repositoryRepo, addRepositoryUseCase) {
37
+ this.gitHubService = gitHubService;
38
+ this.repositoryRepo = repositoryRepo;
39
+ this.addRepositoryUseCase = addRepositoryUseCase;
40
+ }
41
+ async execute(input) {
42
+ // 1. Validate URL — throws GitHubUrlParseError for invalid formats
43
+ const parsed = this.gitHubService.parseGitHubUrl(input.url);
44
+ // 2. Normalize the remote URL for storage and duplicate detection
45
+ const normalizedUrl = normalizeRemoteUrl(parsed.nameWithOwner);
46
+ // 3. Check for duplicate by remoteUrl — skip clone if already tracked
47
+ const existing = await this.repositoryRepo.findByRemoteUrl(normalizedUrl);
48
+ if (existing) {
49
+ return existing;
50
+ }
51
+ // 4. Check auth — throws GitHubAuthError if not authenticated
52
+ await this.gitHubService.checkAuth();
53
+ // 5. Resolve clone destination
54
+ const destination = this.resolveDestination(input, parsed.repo);
55
+ // 6. Clone the repository
56
+ await this.gitHubService.cloneRepository(parsed.nameWithOwner, destination, input.cloneOptions);
57
+ // 7. Register the cloned repo via AddRepositoryUseCase
58
+ const repository = await this.addRepositoryUseCase.execute({
59
+ path: destination,
60
+ name: parsed.repo,
61
+ });
62
+ // 8. Update with normalized remoteUrl
63
+ await this.repositoryRepo.update(repository.id, {
64
+ remoteUrl: normalizedUrl,
65
+ });
66
+ return { ...repository, remoteUrl: normalizedUrl };
67
+ }
68
+ resolveDestination(input, repoName) {
69
+ if (input.dest) {
70
+ return input.dest;
71
+ }
72
+ let baseDir = input.defaultCloneDir ?? join(homedir(), 'repos');
73
+ if (baseDir.startsWith('~/')) {
74
+ baseDir = join(homedir(), baseDir.slice(2));
75
+ }
76
+ return join(baseDir, repoName);
77
+ }
78
+ };
79
+ ImportGitHubRepositoryUseCase = __decorate([
80
+ injectable(),
81
+ __param(0, inject('IGitHubRepositoryService')),
82
+ __param(1, inject('IRepositoryRepository')),
83
+ __param(2, inject(AddRepositoryUseCase)),
84
+ __metadata("design:paramtypes", [Object, Object, AddRepositoryUseCase])
85
+ ], ImportGitHubRepositoryUseCase);
86
+ export { ImportGitHubRepositoryUseCase };
@@ -0,0 +1,13 @@
1
+ /**
2
+ * List GitHub Repositories Use Case
3
+ *
4
+ * Checks GitHub CLI auth, then fetches the authenticated user's repositories.
5
+ * Decouples presentation from the IGitHubRepositoryService infrastructure.
6
+ */
7
+ import type { IGitHubRepositoryService, GitHubRepo, ListUserRepositoriesOptions } from '../../ports/output/services/github-repository-service.interface.js';
8
+ export declare class ListGitHubRepositoriesUseCase {
9
+ private readonly gitHubService;
10
+ constructor(gitHubService: IGitHubRepositoryService);
11
+ execute(options?: ListUserRepositoriesOptions): Promise<GitHubRepo[]>;
12
+ }
13
+ //# sourceMappingURL=list-github-repositories.use-case.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-github-repositories.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/repositories/list-github-repositories.use-case.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EACV,wBAAwB,EACxB,UAAU,EACV,2BAA2B,EAC5B,MAAM,oEAAoE,CAAC;AAE5E,qBACa,6BAA6B;IAGtC,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,wBAAwB;IAGpD,OAAO,CAAC,OAAO,CAAC,EAAE,2BAA2B,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAI5E"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * List GitHub Repositories Use Case
3
+ *
4
+ * Checks GitHub CLI auth, then fetches the authenticated user's repositories.
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 ListGitHubRepositoriesUseCase = class ListGitHubRepositoriesUseCase {
21
+ gitHubService;
22
+ constructor(gitHubService) {
23
+ this.gitHubService = gitHubService;
24
+ }
25
+ async execute(options) {
26
+ await this.gitHubService.checkAuth();
27
+ return this.gitHubService.listUserRepositories(options);
28
+ }
29
+ };
30
+ ListGitHubRepositoriesUseCase = __decorate([
31
+ injectable(),
32
+ __param(0, inject('IGitHubRepositoryService')),
33
+ __metadata("design:paramtypes", [Object])
34
+ ], ListGitHubRepositoriesUseCase);
35
+ export { ListGitHubRepositoriesUseCase };
@@ -1 +1 @@
1
- {"version":3,"file":"settings-defaults.factory.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/domain/factories/settings-defaults.factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,QAAQ,EAUT,MAAM,qBAAqB,CAAC;AA6C7B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,IAAI,QAAQ,CAgFhD"}
1
+ {"version":3,"file":"settings-defaults.factory.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/domain/factories/settings-defaults.factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EACV,QAAQ,EAUT,MAAM,qBAAqB,CAAC;AA6C7B;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,IAAI,QAAQ,CAkFhD"}
@@ -78,6 +78,7 @@ export function createDefaultSettings() {
78
78
  defaultEditor: DEFAULT_EDITOR,
79
79
  shellPreference: DEFAULT_SHELL,
80
80
  terminalPreference: DEFAULT_TERMINAL,
81
+ defaultCloneDirectory: '~/repos',
81
82
  };
82
83
  const system = {
83
84
  autoUpdate: true,
@@ -122,6 +123,7 @@ export function createDefaultSettings() {
122
123
  skills: false,
123
124
  envDeploy: true,
124
125
  debug: false,
126
+ githubImport: false,
125
127
  adoptBranch: false,
126
128
  };
127
129
  return {
@@ -284,6 +284,10 @@ export type EnvironmentConfig = {
284
284
  * Preferred terminal emulator
285
285
  */
286
286
  terminalPreference: TerminalType;
287
+ /**
288
+ * Default directory for cloning GitHub repositories (e.g. ~/repos)
289
+ */
290
+ defaultCloneDirectory?: string;
287
291
  };
288
292
  /**
289
293
  * System configuration
@@ -530,6 +534,10 @@ export type FeatureFlags = {
530
534
  * Enable debug UI elements and verbose client-side logging
531
535
  */
532
536
  debug: boolean;
537
+ /**
538
+ * Enable GitHub repository import in the web UI
539
+ */
540
+ githubImport: boolean;
533
541
  /**
534
542
  * Enable adopt branch feature to import existing branches as tracked features
535
543
  */
@@ -1470,6 +1478,10 @@ export type Repository = SoftDeletableEntity & {
1470
1478
  * Absolute file system path to the repository root (unique)
1471
1479
  */
1472
1480
  path: string;
1481
+ /**
1482
+ * Remote GitHub URL this repository was cloned from (normalized: lowercase, no .git suffix)
1483
+ */
1484
+ remoteUrl?: string;
1473
1485
  };
1474
1486
  /**
1475
1487
  * Single installation suggestion for a tool