@shepai/cli 1.174.0 → 1.175.0-pr530.44b3d3f

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