@shepai/cli 1.173.0 → 1.174.0-pr531.0f666b7

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 (407) hide show
  1. package/apis/json-schema/Repository.yaml +6 -0
  2. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +3 -1
  3. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -1
  4. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +28 -0
  5. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.js +2 -0
  7. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts +47 -0
  8. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.d.ts.map +1 -1
  9. package/dist/packages/core/src/application/ports/output/services/github-repository-service.interface.js +12 -0
  10. package/dist/packages/core/src/application/use-cases/features/create/create-feature-from-remote.use-case.d.ts +67 -0
  11. package/dist/packages/core/src/application/use-cases/features/create/create-feature-from-remote.use-case.d.ts.map +1 -0
  12. package/dist/packages/core/src/application/use-cases/features/create/create-feature-from-remote.use-case.js +125 -0
  13. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts +13 -4
  14. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.d.ts.map +1 -1
  15. package/dist/packages/core/src/application/use-cases/repositories/import-github-repository.use-case.js +54 -10
  16. package/dist/packages/core/src/application/use-cases/repositories/init-remote-repository.use-case.d.ts +30 -0
  17. package/dist/packages/core/src/application/use-cases/repositories/init-remote-repository.use-case.d.ts.map +1 -0
  18. package/dist/packages/core/src/application/use-cases/repositories/init-remote-repository.use-case.js +50 -0
  19. package/dist/packages/core/src/domain/generated/output.d.ts +8 -0
  20. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  21. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/di/container.js +10 -0
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts +2 -0
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.d.ts.map +1 -1
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/repository.mapper.js +4 -0
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-repository-fork-fields.d.ts +12 -0
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-repository-fork-fields.d.ts.map +1 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/055-add-repository-fork-fields.js +26 -0
  29. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +2 -1
  30. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -1
  31. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +14 -0
  32. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts +4 -1
  33. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.d.ts.map +1 -1
  34. package/dist/packages/core/src/infrastructure/services/external/github-repository.service.js +55 -1
  35. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +5 -0
  36. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  37. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +32 -0
  38. package/dist/src/presentation/cli/commands/feat/new.command.d.ts.map +1 -1
  39. package/dist/src/presentation/cli/commands/feat/new.command.js +32 -6
  40. package/dist/src/presentation/cli/commands/repo/index.d.ts.map +1 -1
  41. package/dist/src/presentation/cli/commands/repo/index.js +3 -1
  42. package/dist/src/presentation/cli/commands/repo/init-remote.command.d.ts +15 -0
  43. package/dist/src/presentation/cli/commands/repo/init-remote.command.d.ts.map +1 -0
  44. package/dist/src/presentation/cli/commands/repo/init-remote.command.js +44 -0
  45. package/dist/src/presentation/web/app/actions/create-feature-from-remote.d.ts +31 -0
  46. package/dist/src/presentation/web/app/actions/create-feature-from-remote.d.ts.map +1 -0
  47. package/dist/src/presentation/web/app/actions/create-feature-from-remote.js +69 -0
  48. package/dist/src/presentation/web/app/actions/import-github-repository.d.ts +1 -0
  49. package/dist/src/presentation/web/app/actions/import-github-repository.d.ts.map +1 -1
  50. package/dist/src/presentation/web/app/actions/import-github-repository.js +1 -1
  51. package/dist/src/presentation/web/app/features/feature-tree-page-client.d.ts +7 -1
  52. package/dist/src/presentation/web/app/features/feature-tree-page-client.d.ts.map +1 -1
  53. package/dist/src/presentation/web/app/features/feature-tree-page-client.js +142 -3
  54. package/dist/src/presentation/web/app/features/get-feature-tree-data.d.ts.map +1 -1
  55. package/dist/src/presentation/web/app/features/get-feature-tree-data.js +4 -1
  56. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +2 -0
  57. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  58. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +1 -1
  59. package/dist/src/presentation/web/components/common/feature-create-drawer/repository-combobox.stories.d.ts +2 -0
  60. package/dist/src/presentation/web/components/common/feature-create-drawer/repository-combobox.stories.d.ts.map +1 -1
  61. package/dist/src/presentation/web/components/common/feature-create-drawer/repository-combobox.stories.js +22 -0
  62. package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.d.ts +21 -5
  63. package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.d.ts.map +1 -1
  64. package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.js +169 -87
  65. package/dist/src/presentation/web/components/features/feature-tree-table/index.d.ts +2 -2
  66. package/dist/src/presentation/web/components/features/feature-tree-table/index.d.ts.map +1 -1
  67. package/dist/src/presentation/web/components/features/feature-tree-table/index.js +1 -1
  68. package/dist/src/presentation/web/lib/feature-flags.js +1 -1
  69. package/dist/translations/ar/cli.json +12 -0
  70. package/dist/translations/de/cli.json +12 -0
  71. package/dist/translations/en/cli.json +12 -0
  72. package/dist/translations/es/cli.json +12 -0
  73. package/dist/translations/fr/cli.json +12 -0
  74. package/dist/translations/he/cli.json +12 -0
  75. package/dist/translations/pt/cli.json +12 -0
  76. package/dist/translations/ru/cli.json +12 -0
  77. package/dist/tsconfig.build.tsbuildinfo +1 -1
  78. package/package.json +1 -1
  79. package/web/.next/BUILD_ID +1 -1
  80. package/web/.next/build-manifest.json +4 -4
  81. package/web/.next/fallback-build-manifest.json +2 -2
  82. package/web/.next/prerender-manifest.json +3 -3
  83. package/web/.next/required-server-files.js +3 -3
  84. package/web/.next/required-server-files.json +3 -3
  85. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/build-manifest.json +2 -2
  86. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  87. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -1
  88. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  89. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/(dashboard)/@drawer/chat/page/build-manifest.json +2 -2
  91. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  92. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js +2 -1
  93. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  94. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  95. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +2 -2
  96. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
  97. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -1
  98. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  99. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +2 -2
  101. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  102. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -1
  103. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  104. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  105. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +2 -2
  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/build-manifest.json +2 -2
  111. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  112. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js +2 -1
  113. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  114. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  115. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +2 -2
  116. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  117. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -1
  118. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  119. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/app/(dashboard)/chat/page/build-manifest.json +2 -2
  121. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  122. package/web/.next/server/app/(dashboard)/chat/page.js +2 -1
  123. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  124. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +2 -2
  126. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
  127. package/web/.next/server/app/(dashboard)/create/page.js +2 -1
  128. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  129. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  130. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +2 -2
  131. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  132. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -1
  133. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  134. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  135. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +2 -2
  136. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +38 -38
  137. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -1
  138. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  139. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  140. package/web/.next/server/app/(dashboard)/page/build-manifest.json +2 -2
  141. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  142. package/web/.next/server/app/(dashboard)/page.js +2 -1
  143. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  144. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  145. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/build-manifest.json +2 -2
  146. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  147. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js +2 -1
  148. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  149. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  150. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +2 -2
  151. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  152. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -1
  153. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  154. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  155. package/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
  156. package/web/.next/server/app/_global-error.html +2 -2
  157. package/web/.next/server/app/_global-error.rsc +1 -1
  158. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  159. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  160. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  161. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  162. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  163. package/web/.next/server/app/_not-found/page/build-manifest.json +2 -2
  164. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  165. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  166. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  167. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  168. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  169. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  170. package/web/.next/server/app/api/interactive/chat/[featureId]/messages/route.js.nft.json +1 -1
  171. package/web/.next/server/app/features/page/build-manifest.json +2 -2
  172. package/web/.next/server/app/features/page/server-reference-manifest.json +6 -6
  173. package/web/.next/server/app/features/page.js.nft.json +1 -1
  174. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  175. package/web/.next/server/app/settings/page/build-manifest.json +2 -2
  176. package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
  177. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  178. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  179. package/web/.next/server/app/skills/page/build-manifest.json +2 -2
  180. package/web/.next/server/app/skills/page/server-reference-manifest.json +13 -13
  181. package/web/.next/server/app/skills/page.js +2 -1
  182. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  183. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  184. package/web/.next/server/app/tools/page/build-manifest.json +2 -2
  185. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  186. package/web/.next/server/app/tools/page.js +2 -1
  187. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  188. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  189. package/web/.next/server/app/version/page/build-manifest.json +2 -2
  190. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  191. package/web/.next/server/app/version/page.js.nft.json +1 -1
  192. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  193. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  194. package/web/.next/server/chunks/[root-of-the-server]__c78383b1._.js.map +1 -1
  195. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/403f9_next_dist_a53cb908._.js +1 -1
  197. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_ceb2fa1e._.js +1 -1
  198. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js +3 -0
  199. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_ad0071c9.js.map +1 -0
  200. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js +3 -0
  201. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_chat_page_actions_90d98b2b.js.map +1 -0
  202. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.js +3 -0
  203. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_chat_page_actions_d3828105.js.map +1 -0
  204. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  205. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  207. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  208. package/web/.next/server/chunks/ssr/[root-of-the-server]__08c912ab._.js +1 -1
  209. package/web/.next/server/chunks/ssr/[root-of-the-server]__08c912ab._.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/[root-of-the-server]__0c5452c3._.js +1 -1
  211. package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js +1 -1
  212. package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
  214. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
  215. package/web/.next/server/chunks/ssr/[root-of-the-server]__22d17c66._.js +3 -0
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__22d17c66._.js.map +1 -0
  217. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__51ec77a8._.js +3 -0
  219. package/web/.next/server/chunks/ssr/[root-of-the-server]__51ec77a8._.js.map +1 -0
  220. package/web/.next/server/chunks/ssr/{[root-of-the-server]__b020c17d._.js → [root-of-the-server]__540c615f._.js} +3 -3
  221. package/web/.next/server/chunks/ssr/[root-of-the-server]__540c615f._.js.map +1 -0
  222. package/web/.next/server/chunks/ssr/[root-of-the-server]__66047a1b._.js +3 -0
  223. package/web/.next/server/chunks/ssr/[root-of-the-server]__66047a1b._.js.map +1 -0
  224. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +1 -1
  225. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__851f6adb._.js +1 -1
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js +2 -2
  228. package/web/.next/server/chunks/ssr/[root-of-the-server]__a932cd3a._.js +3 -0
  229. package/web/.next/server/chunks/ssr/[root-of-the-server]__a932cd3a._.js.map +1 -0
  230. package/web/.next/server/chunks/ssr/[root-of-the-server]__aa72e794._.js +3 -0
  231. package/web/.next/server/chunks/ssr/[root-of-the-server]__aa72e794._.js.map +1 -0
  232. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
  233. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
  234. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  235. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  236. package/web/.next/server/chunks/ssr/_073183f4._.js +3 -0
  237. package/web/.next/server/chunks/ssr/_073183f4._.js.map +1 -0
  238. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  239. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  240. package/web/.next/server/chunks/ssr/_1879404a._.js +1 -1
  241. package/web/.next/server/chunks/ssr/_1b7dae9a._.js +1 -1
  242. package/web/.next/server/chunks/ssr/{_cd92091d._.js → _1c627e53._.js} +3 -3
  243. package/web/.next/server/chunks/ssr/{_cd92091d._.js.map → _1c627e53._.js.map} +1 -1
  244. package/web/.next/server/chunks/ssr/{_5119a3df._.js → _295fffde._.js} +2 -2
  245. package/web/.next/server/chunks/ssr/_295fffde._.js.map +1 -0
  246. package/web/.next/server/chunks/ssr/{_817ddf8a._.js → _398f5019._.js} +3 -3
  247. package/web/.next/server/chunks/ssr/{_817ddf8a._.js.map → _398f5019._.js.map} +1 -1
  248. package/web/.next/server/chunks/ssr/_43ba79e7._.js +1 -1
  249. package/web/.next/server/chunks/ssr/_45496654._.js +1 -1
  250. package/web/.next/server/chunks/ssr/_45496654._.js.map +1 -1
  251. package/web/.next/server/chunks/ssr/{_6f35fb9a._.js → _49b8d085._.js} +2 -2
  252. package/web/.next/server/chunks/ssr/{_6f35fb9a._.js.map → _49b8d085._.js.map} +1 -1
  253. package/web/.next/server/chunks/ssr/_4cbb7f95._.js +1 -1
  254. package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -1
  255. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  256. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  257. package/web/.next/server/chunks/ssr/_6abfa39e._.js +3 -0
  258. package/web/.next/server/chunks/ssr/_6abfa39e._.js.map +1 -0
  259. package/web/.next/server/chunks/ssr/_7476c702._.js +3 -0
  260. package/web/.next/server/chunks/ssr/_7476c702._.js.map +1 -0
  261. package/web/.next/server/chunks/ssr/_7cb0396e._.js +3 -0
  262. package/web/.next/server/chunks/ssr/_7cb0396e._.js.map +1 -0
  263. package/web/.next/server/chunks/ssr/_bb09579b._.js +1 -1
  264. package/web/.next/server/chunks/ssr/{_0020fddd._.js → _d9c0a97a._.js} +3 -3
  265. package/web/.next/server/chunks/ssr/_d9c0a97a._.js.map +1 -0
  266. package/web/.next/server/chunks/ssr/_e680c57c._.js +9 -0
  267. package/web/.next/server/chunks/ssr/_e680c57c._.js.map +1 -0
  268. package/web/.next/server/chunks/ssr/_f080a56e._.js +3 -0
  269. package/web/.next/server/chunks/ssr/_f080a56e._.js.map +1 -0
  270. package/web/.next/server/chunks/ssr/_f8c55130._.js +4 -0
  271. package/web/.next/server/chunks/ssr/_f8c55130._.js.map +1 -0
  272. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  273. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  274. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_global-chat-drawer-client_tsx_158c4b12._.js +1 -1
  275. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  276. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  277. package/web/.next/server/chunks/ssr/node_modules__pnpm_63d47a3e._.js +3 -0
  278. package/web/.next/server/chunks/ssr/node_modules__pnpm_63d47a3e._.js.map +1 -0
  279. package/web/.next/server/chunks/ssr/node_modules__pnpm_747b43ac._.js +3 -0
  280. package/web/.next/server/chunks/ssr/node_modules__pnpm_747b43ac._.js.map +1 -0
  281. package/web/.next/server/chunks/ssr/node_modules__pnpm_ef15a0bd._.js +1 -1
  282. package/web/.next/server/chunks/ssr/src_presentation_web_17d39233._.js +3 -0
  283. package/web/.next/server/chunks/ssr/src_presentation_web_17d39233._.js.map +1 -0
  284. package/web/.next/server/chunks/ssr/src_presentation_web_54b02639._.js +5 -0
  285. package/web/.next/server/chunks/ssr/src_presentation_web_54b02639._.js.map +1 -0
  286. package/web/.next/server/chunks/ssr/src_presentation_web_7b7b9e3b._.js +5 -0
  287. package/web/.next/server/chunks/ssr/src_presentation_web_7b7b9e3b._.js.map +1 -0
  288. package/web/.next/server/chunks/ssr/src_presentation_web_807cba76._.js +3 -0
  289. package/web/.next/server/chunks/ssr/src_presentation_web_807cba76._.js.map +1 -0
  290. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js +3 -0
  291. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_90b5e66e.js.map +1 -0
  292. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js +3 -0
  293. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_4ce30db7.js.map +1 -0
  294. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js +3 -0
  295. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_e4032193.js.map +1 -0
  296. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  297. package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js +2 -2
  298. package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js.map +1 -1
  299. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  300. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  301. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +1 -1
  302. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  303. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  304. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
  305. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
  306. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +1 -1
  307. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js +1 -1
  308. package/web/.next/server/chunks/ssr/src_presentation_web_e1cd1869._.js +3 -0
  309. package/web/.next/server/chunks/ssr/src_presentation_web_e1cd1869._.js.map +1 -0
  310. package/web/.next/server/chunks/ssr/src_presentation_web_e3a30e30._.js +3 -0
  311. package/web/.next/server/chunks/ssr/src_presentation_web_e3a30e30._.js.map +1 -0
  312. package/web/.next/server/middleware-build-manifest.js +2 -2
  313. package/web/.next/server/pages/500.html +2 -2
  314. package/web/.next/server/server-reference-manifest.js +1 -1
  315. package/web/.next/server/server-reference-manifest.json +50 -50
  316. package/web/.next/static/chunks/{ab5970241b29b648.js → 041bbd573f24c747.js} +1 -1
  317. package/web/.next/static/chunks/{0658f5f58d5b60c5.js → 273d92d4c2d7785c.js} +1 -1
  318. package/web/.next/static/chunks/2ceebcc839ee0d4b.js +1 -0
  319. package/web/.next/static/chunks/46e2693dbc9262fd.js +5 -0
  320. package/web/.next/static/chunks/{51bb2fb93740d2cb.js → 53fc463b54ef2b4b.js} +2 -2
  321. package/web/.next/static/chunks/{641583aadf11b219.js → 6129f01524593835.js} +1 -1
  322. package/web/.next/static/chunks/{e5c06df7f30a05b9.js → 659ee5c3bcd5908a.js} +1 -1
  323. package/web/.next/static/chunks/{96b63a24ad83be21.js → 6adf506943611449.js} +1 -1
  324. package/web/.next/static/chunks/{a1f976e9c8b07306.js → 79b8efa054660be8.js} +1 -1
  325. package/web/.next/static/chunks/7e50572eaeede7f0.js +3 -0
  326. package/web/.next/static/chunks/8492d8e0b5f9a4e8.js +1 -0
  327. package/web/.next/static/chunks/88192bc55f93b89e.js +1 -0
  328. package/web/.next/static/chunks/98e3a7cf58fc912a.js +1 -0
  329. package/web/.next/static/chunks/9f5327851ad07bdf.js +7 -0
  330. package/web/.next/static/chunks/a20f2d6f76f469b7.css +1 -0
  331. package/web/.next/static/chunks/ad7590436eef8a9e.js +1 -0
  332. package/web/.next/static/chunks/{819d8097ac0ca319.js → ae65839330ff1113.js} +1 -1
  333. package/web/.next/static/chunks/b49ab0b290e9342d.js +1 -0
  334. package/web/.next/static/chunks/b88dd71478d03b6a.js +1 -0
  335. package/web/.next/static/chunks/bb479c31b5b53bac.js +8 -0
  336. package/web/.next/static/chunks/c10c0d6d458453bc.js +1 -0
  337. package/web/.next/static/chunks/{4161d4663009140f.js → dbaa2ef826fd65d6.js} +1 -1
  338. package/web/.next/static/chunks/{185e4f36cb6efb24.js → eb1ca1b0a34166f5.js} +1 -1
  339. package/web/.next/static/chunks/fc0232384ec2b48d.js +1 -0
  340. package/web/.next/static/chunks/{turbopack-b38a68b1b1c41a87.js → turbopack-fa58b7ea4a4b26e7.js} +1 -1
  341. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js +0 -4
  342. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js.map +0 -1
  343. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js +0 -4
  344. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js.map +0 -1
  345. package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js +0 -4
  346. package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js.map +0 -1
  347. package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js.map +0 -1
  348. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js +0 -4
  349. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js.map +0 -1
  350. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js +0 -4
  351. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js.map +0 -1
  352. package/web/.next/server/chunks/ssr/[root-of-the-server]__fa525872._.js +0 -3
  353. package/web/.next/server/chunks/ssr/[root-of-the-server]__fa525872._.js.map +0 -1
  354. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +0 -1
  355. package/web/.next/server/chunks/ssr/_02e01240._.js +0 -4
  356. package/web/.next/server/chunks/ssr/_02e01240._.js.map +0 -1
  357. package/web/.next/server/chunks/ssr/_068492bf._.js +0 -3
  358. package/web/.next/server/chunks/ssr/_068492bf._.js.map +0 -1
  359. package/web/.next/server/chunks/ssr/_18886033._.js +0 -4
  360. package/web/.next/server/chunks/ssr/_18886033._.js.map +0 -1
  361. package/web/.next/server/chunks/ssr/_22e00a14._.js +0 -4
  362. package/web/.next/server/chunks/ssr/_22e00a14._.js.map +0 -1
  363. package/web/.next/server/chunks/ssr/_5119a3df._.js.map +0 -1
  364. package/web/.next/server/chunks/ssr/_560f2971._.js +0 -3
  365. package/web/.next/server/chunks/ssr/_560f2971._.js.map +0 -1
  366. package/web/.next/server/chunks/ssr/_a5a5901d._.js +0 -4
  367. package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +0 -1
  368. package/web/.next/server/chunks/ssr/_a963dd3c._.js +0 -3
  369. package/web/.next/server/chunks/ssr/_a963dd3c._.js.map +0 -1
  370. package/web/.next/server/chunks/ssr/_ad09f271._.js +0 -4
  371. package/web/.next/server/chunks/ssr/_ad09f271._.js.map +0 -1
  372. package/web/.next/server/chunks/ssr/_c3f595c6._.js +0 -4
  373. package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +0 -1
  374. package/web/.next/server/chunks/ssr/_df737cce._.js +0 -3
  375. package/web/.next/server/chunks/ssr/_df737cce._.js.map +0 -1
  376. package/web/.next/server/chunks/ssr/_e3f14907._.js +0 -9
  377. package/web/.next/server/chunks/ssr/_e3f14907._.js.map +0 -1
  378. package/web/.next/server/chunks/ssr/_ea9e1556._.js +0 -4
  379. package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +0 -1
  380. package/web/.next/server/chunks/ssr/_f1ba9be6._.js +0 -6
  381. package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +0 -1
  382. package/web/.next/server/chunks/ssr/_f33cd07e._.js +0 -6
  383. package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +0 -1
  384. package/web/.next/server/chunks/ssr/_f535d854._.js +0 -3
  385. package/web/.next/server/chunks/ssr/_f535d854._.js.map +0 -1
  386. package/web/.next/server/chunks/ssr/_f8b45233._.js +0 -4
  387. package/web/.next/server/chunks/ssr/_f8b45233._.js.map +0 -1
  388. package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js +0 -3
  389. package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js.map +0 -1
  390. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_page-header_index_ts_bdf4db0b._.js +0 -3
  391. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_page-header_index_ts_bdf4db0b._.js.map +0 -1
  392. package/web/.next/static/chunks/3e393d6a78b2ade4.js +0 -1
  393. package/web/.next/static/chunks/453ad57269a1004f.js +0 -1
  394. package/web/.next/static/chunks/4559a403ee40dd19.js +0 -7
  395. package/web/.next/static/chunks/4855528484f00bd6.js +0 -1
  396. package/web/.next/static/chunks/4bacc77e3952f063.js +0 -3
  397. package/web/.next/static/chunks/5ed47e998707b519.js +0 -8
  398. package/web/.next/static/chunks/9f59ea29d6034111.js +0 -1
  399. package/web/.next/static/chunks/bb5400da64270df6.js +0 -1
  400. package/web/.next/static/chunks/cc5fe8d1d9e1e519.js +0 -5
  401. package/web/.next/static/chunks/d5366257d6b9f855.js +0 -1
  402. package/web/.next/static/chunks/dcf8bb4389557a76.css +0 -1
  403. package/web/.next/static/chunks/f37a5e031a5d0f75.js +0 -1
  404. package/web/.next/static/chunks/f998b42b5cddafd6.js +0 -1
  405. /package/web/.next/static/{1awQPFeGEuNwpeu1Kgpxd → UWgKy2y_bjIYkCFOMl8Am}/_buildManifest.js +0 -0
  406. /package/web/.next/static/{1awQPFeGEuNwpeu1Kgpxd → UWgKy2y_bjIYkCFOMl8Am}/_clientMiddlewareManifest.json +0 -0
  407. /package/web/.next/static/{1awQPFeGEuNwpeu1Kgpxd → UWgKy2y_bjIYkCFOMl8Am}/_ssgManifest.js +0 -0
@@ -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
+ }
@@ -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) {
@@ -1,7 +1,13 @@
1
- import type { FeatureTreeRow, InventoryRepo } from '../../components/features/feature-tree-table/index.js';
1
+ import type { FeatureTreeRow, InventoryRepo, GroupByField } from '../../components/features/feature-tree-table/index.js';
2
2
  export interface FeatureTreePageClientProps {
3
3
  features: FeatureTreeRow[];
4
4
  repos: InventoryRepo[];
5
5
  }
6
+ /** Item sort fields change based on groupBy — exclude the grouped field. */
7
+ export declare function getItemSortOptions(groupBy: GroupByField | null): {
8
+ value: string;
9
+ label: string;
10
+ }[];
11
+ export declare function isArchived(feature: FeatureTreeRow): boolean;
6
12
  export declare function FeatureTreePageClient({ features, repos }: FeatureTreePageClientProps): import("react/jsx-runtime").JSX.Element;
7
13
  //# sourceMappingURL=feature-tree-page-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-tree-page-client.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/features/feature-tree-page-client.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAG9F,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,wBAAgB,qBAAqB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,0BAA0B,2CAkBpF"}
1
+ {"version":3,"file":"feature-tree-page-client.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/features/feature-tree-page-client.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,cAAc,EACd,aAAa,EACb,YAAY,EAEb,MAAM,0CAA0C,CAAC;AAelD,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAmCD,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;;;IAU9D;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAE3D;AAED,wBAAgB,qBAAqB,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,0BAA0B,2CAuWpF"}
@@ -1,13 +1,152 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useRouter } from 'next/navigation';
4
- import { useCallback } from 'react';
4
+ import { useCallback, useState, useMemo } from 'react';
5
+ import { Search, SlidersHorizontal, Archive, Inbox, X, ArrowDownAZ, ArrowUpAZ } from 'lucide-react';
5
6
  import { FeatureTreeTable } from '../../components/features/feature-tree-table/index.js';
6
7
  import { PageHeader } from '../../components/common/page-header/index.js';
8
+ import { EmptyState } from '../../components/common/empty-state/index.js';
9
+ import { Input } from '../../components/ui/input.js';
10
+ import { Button } from '../../components/ui/button.js';
11
+ import { Badge } from '../../components/ui/badge.js';
12
+ import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../components/ui/select.js';
13
+ const STATUS_LABELS = {
14
+ 'action-needed': 'Action Needed',
15
+ 'in-progress': 'In Progress',
16
+ pending: 'Pending',
17
+ blocked: 'Blocked',
18
+ error: 'Error',
19
+ done: 'Done',
20
+ };
21
+ const STATUS_COLORS = {
22
+ 'action-needed': 'bg-amber-500/15 text-amber-700 dark:text-amber-400 border-amber-500/20',
23
+ 'in-progress': 'bg-blue-500/15 text-blue-700 dark:text-blue-400 border-blue-500/20',
24
+ pending: 'bg-slate-500/15 text-slate-700 dark:text-slate-400 border-slate-500/20',
25
+ blocked: 'bg-gray-500/15 text-gray-700 dark:text-gray-400 border-gray-500/20',
26
+ error: 'bg-red-500/15 text-red-700 dark:text-red-400 border-red-500/20',
27
+ done: 'bg-emerald-500/15 text-emerald-700 dark:text-emerald-400 border-emerald-500/20',
28
+ };
29
+ const GROUP_BY_LABELS = {
30
+ repositoryName: 'Repository',
31
+ status: 'Status',
32
+ lifecycle: 'Lifecycle',
33
+ };
34
+ const GROUP_BY_OPTIONS = [
35
+ { value: '__none__', label: 'No grouping' },
36
+ { value: 'repositoryName', label: 'Repository' },
37
+ { value: 'status', label: 'Status' },
38
+ { value: 'lifecycle', label: 'Lifecycle' },
39
+ ];
40
+ /** Item sort fields change based on groupBy — exclude the grouped field. */
41
+ export function getItemSortOptions(groupBy) {
42
+ const all = [
43
+ { value: 'name', label: 'Name' },
44
+ { value: 'repositoryName', label: 'Repository' },
45
+ { value: 'status', label: 'Status' },
46
+ { value: 'lifecycle', label: 'Lifecycle' },
47
+ { value: 'branch', label: 'Branch' },
48
+ ];
49
+ if (!groupBy)
50
+ return all;
51
+ return all.filter((o) => o.value !== groupBy);
52
+ }
53
+ export function isArchived(feature) {
54
+ return feature.lifecycle === 'Archived';
55
+ }
7
56
  export function FeatureTreePageClient({ features, repos }) {
8
57
  const router = useRouter();
58
+ // Filter state
59
+ const [searchQuery, setSearchQuery] = useState('');
60
+ const [statusFilter, setStatusFilter] = useState(null);
61
+ const [archiveFilter, setArchiveFilter] = useState('active');
62
+ const [repoFilter, setRepoFilter] = useState(null);
63
+ const [showAdvanced, setShowAdvanced] = useState(false);
64
+ // Group + sort state
65
+ const [groupBy, setGroupBy] = useState('repositoryName');
66
+ const [groupSortDir, setGroupSortDir] = useState('asc');
67
+ const [itemSortField, setItemSortField] = useState('name');
68
+ const [itemSortDir, setItemSortDir] = useState('asc');
9
69
  const handleFeatureClick = useCallback((featureId) => {
10
70
  router.push(`/feature/${featureId}/overview`);
11
71
  }, [router]);
12
- return (_jsxs("div", { "data-testid": "feature-tree-page", className: "flex h-full flex-col gap-4", children: [_jsx(PageHeader, { title: "Inventory", description: "All repositories and features" }), _jsx("div", { className: "min-h-0 flex-1", children: _jsx(FeatureTreeTable, { data: features, repos: repos, onFeatureClick: handleFeatureClick }) })] }));
72
+ const handleGroupByChange = (value) => {
73
+ const next = value === '__none__' ? null : value;
74
+ setGroupBy(next);
75
+ // Reset item sort if current field matches the new groupBy
76
+ if (next && itemSortField === next) {
77
+ setItemSortField('name');
78
+ }
79
+ };
80
+ // Compute status counts for pills
81
+ const statusCounts = useMemo(() => {
82
+ const counts = {
83
+ 'action-needed': 0,
84
+ 'in-progress': 0,
85
+ pending: 0,
86
+ blocked: 0,
87
+ error: 0,
88
+ done: 0,
89
+ };
90
+ for (const f of features) {
91
+ counts[f.status]++;
92
+ }
93
+ return counts;
94
+ }, [features]);
95
+ // Unique repo names for advanced filter
96
+ const repoNames = useMemo(() => {
97
+ const names = new Set();
98
+ for (const f of features) {
99
+ names.add(f.repositoryName);
100
+ }
101
+ return Array.from(names).sort();
102
+ }, [features]);
103
+ // Filtered features (sorting handled by table)
104
+ const filteredFeatures = useMemo(() => {
105
+ const query = searchQuery.toLowerCase();
106
+ return features.filter((feature) => {
107
+ if (archiveFilter === 'active' && isArchived(feature))
108
+ return false;
109
+ if (archiveFilter === 'archived' && !isArchived(feature))
110
+ return false;
111
+ if (statusFilter && feature.status !== statusFilter)
112
+ return false;
113
+ if (repoFilter && feature.repositoryName !== repoFilter)
114
+ return false;
115
+ if (query) {
116
+ const matchesName = feature.name.toLowerCase().includes(query);
117
+ const matchesBranch = feature.branch.toLowerCase().includes(query);
118
+ const matchesRepo = feature.repositoryName.toLowerCase().includes(query);
119
+ if (!matchesName && !matchesBranch && !matchesRepo)
120
+ return false;
121
+ }
122
+ return true;
123
+ });
124
+ }, [features, searchQuery, statusFilter, archiveFilter, repoFilter]);
125
+ const hasActiveFilters = searchQuery !== '' ||
126
+ statusFilter !== null ||
127
+ archiveFilter !== 'active' ||
128
+ repoFilter !== null;
129
+ const clearFilters = () => {
130
+ setSearchQuery('');
131
+ setStatusFilter(null);
132
+ setArchiveFilter('active');
133
+ setRepoFilter(null);
134
+ };
135
+ const archivedCount = useMemo(() => features.filter(isArchived).length, [features]);
136
+ const activeCount = features.length - archivedCount;
137
+ const itemSortOptions = useMemo(() => getItemSortOptions(groupBy), [groupBy]);
138
+ return (_jsxs("div", { "data-testid": "feature-tree-page", className: "flex h-full flex-col gap-4", children: [_jsx(PageHeader, { title: "Inventory", description: "All repositories and features" }), _jsxs("div", { className: "flex flex-col gap-3", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs("div", { className: "relative flex-1", children: [_jsx(Search, { className: "text-muted-foreground absolute top-1/2 left-3 size-4 -translate-y-1/2" }), _jsx(Input, { placeholder: "Search by name, branch, or repository...", value: searchQuery, onChange: (e) => setSearchQuery(e.target.value), className: "ps-9" }), searchQuery ? (_jsx("button", { onClick: () => setSearchQuery(''), className: "text-muted-foreground hover:text-foreground absolute top-1/2 right-3 -translate-y-1/2", children: _jsx(X, { className: "size-4" }) })) : null] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium whitespace-nowrap", children: "Group by:" }), _jsxs(Select, { value: groupBy ?? '__none__', onValueChange: handleGroupByChange, children: [_jsx(SelectTrigger, { className: "w-[150px]", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: GROUP_BY_OPTIONS.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] })] }), _jsxs(Button, { variant: showAdvanced ? 'secondary' : 'outline', size: "sm", onClick: () => setShowAdvanced((v) => !v), className: "shrink-0", children: [_jsx(SlidersHorizontal, { className: "mr-1.5 size-3.5" }), "Filters"] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsxs("div", { className: "border-input flex items-center rounded-md border", children: [_jsxs("button", { onClick: () => setArchiveFilter('active'), className: `flex items-center gap-1.5 rounded-l-md px-3 py-1.5 text-xs font-medium transition-colors ${archiveFilter === 'active' ? 'bg-primary text-primary-foreground' : 'hover:bg-muted'}`, children: [_jsx(Inbox, { className: "size-3.5" }), "Active", _jsxs("span", { className: "opacity-70", children: ["(", activeCount, ")"] })] }), _jsxs("button", { onClick: () => setArchiveFilter('archived'), className: `flex items-center gap-1.5 border-x px-3 py-1.5 text-xs font-medium transition-colors ${archiveFilter === 'archived'
139
+ ? 'bg-primary text-primary-foreground'
140
+ : 'hover:bg-muted'}`, children: [_jsx(Archive, { className: "size-3.5" }), "Archived", _jsxs("span", { className: "opacity-70", children: ["(", archivedCount, ")"] })] }), _jsx("button", { onClick: () => setArchiveFilter('all'), className: `rounded-r-md px-3 py-1.5 text-xs font-medium transition-colors ${archiveFilter === 'all' ? 'bg-primary text-primary-foreground' : 'hover:bg-muted'}`, children: "All" })] }), _jsx("div", { className: "bg-border h-6 w-px" }), _jsx("button", { onClick: () => setStatusFilter(null), className: `rounded-full px-2.5 py-1 text-xs font-medium transition-colors ${statusFilter === null
141
+ ? 'bg-foreground text-background'
142
+ : 'bg-muted text-muted-foreground hover:bg-muted/80'}`, children: "All Status" }), Object.entries(STATUS_LABELS).map(([status, label]) => {
143
+ const count = statusCounts[status];
144
+ if (count === 0)
145
+ return null;
146
+ return (_jsxs("button", { onClick: () => setStatusFilter(statusFilter === status ? null : status), className: `rounded-full px-2.5 py-1 text-xs font-medium transition-colors ${statusFilter === status
147
+ ? STATUS_COLORS[status]
148
+ : 'bg-muted text-muted-foreground hover:bg-muted/80'}`, children: [label, _jsx("span", { className: "ml-1 opacity-70", children: count })] }, status));
149
+ }), hasActiveFilters ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "bg-border h-6 w-px" }), _jsxs(Button, { variant: "ghost", size: "sm", onClick: clearFilters, className: "h-7 text-xs", children: [_jsx(X, { className: "mr-1 size-3" }), "Clear"] })] })) : null] }), groupBy ? (_jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: GROUP_BY_LABELS[groupBy] }), _jsxs(Button, { variant: "outline", size: "sm", className: "h-7 gap-1 text-xs", onClick: () => setGroupSortDir((d) => (d === 'asc' ? 'desc' : 'asc')), children: [groupSortDir === 'asc' ? (_jsx(ArrowDownAZ, { className: "size-3.5" })) : (_jsx(ArrowUpAZ, { className: "size-3.5" })), groupSortDir === 'asc' ? 'A-Z' : 'Z-A'] })] }), _jsx("div", { className: "bg-border h-5 w-px" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Sort by" }), _jsxs(Select, { value: itemSortField, onValueChange: setItemSortField, children: [_jsx(SelectTrigger, { className: "h-7 w-[120px] text-xs", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: itemSortOptions.map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value))) })] }), _jsxs(Button, { variant: "outline", size: "sm", className: "h-7 gap-1 text-xs", onClick: () => setItemSortDir((d) => (d === 'asc' ? 'desc' : 'asc')), children: [itemSortDir === 'asc' ? (_jsx(ArrowDownAZ, { className: "size-3.5" })) : (_jsx(ArrowUpAZ, { className: "size-3.5" })), itemSortDir === 'asc' ? 'A-Z' : 'Z-A'] })] })] })) : null, showAdvanced ? (_jsx("div", { className: "bg-muted/50 flex flex-wrap items-center gap-3 rounded-lg border p-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Repository" }), _jsxs(Select, { value: repoFilter ?? '__all__', onValueChange: (v) => setRepoFilter(v === '__all__' ? null : v), children: [_jsx(SelectTrigger, { className: "h-8 w-[200px] text-xs", children: _jsx(SelectValue, { placeholder: "All repositories" }) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "__all__", children: "All repositories" }), repoNames.map((name) => (_jsx(SelectItem, { value: name, children: name }, name)))] })] })] }) })) : null] }), _jsxs("div", { className: "text-muted-foreground flex items-center gap-2 text-xs", children: [_jsxs("span", { children: [filteredFeatures.length, " feature", filteredFeatures.length !== 1 ? 's' : ''] }), hasActiveFilters ? (_jsx(Badge, { variant: "secondary", className: "text-xs", children: "filtered" })) : null] }), _jsx("div", { className: "min-h-0 flex-1", children: filteredFeatures.length > 0 ? (_jsx(FeatureTreeTable, { data: filteredFeatures, repos: repos, onFeatureClick: handleFeatureClick, groupBy: groupBy, groupSortDir: groupSortDir, itemSortField: itemSortField, itemSortDir: itemSortDir })) : (_jsx(EmptyState, { icon: _jsx(Search, { className: "size-10" }), title: "No matching features", description: hasActiveFilters
150
+ ? 'No features match your current filters. Try adjusting your search or filters.'
151
+ : 'No features found in any repository.', action: hasActiveFilters ? (_jsx(Button, { variant: "outline", onClick: clearFilters, children: "Clear all filters" })) : undefined })) })] }));
13
152
  }
@@ -1 +1 @@
1
- {"version":3,"file":"get-feature-tree-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/features/get-feature-tree-data.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAI/E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsBD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAClD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB,CAAC,CAgCD"}
1
+ {"version":3,"file":"get-feature-tree-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/features/get-feature-tree-data.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAI/E,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAsBD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC;IAClD,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB,CAAC,CAmCD"}
@@ -21,7 +21,10 @@ function lifecycleToStatus(lifecycle) {
21
21
  export async function getFeatureTreeData() {
22
22
  const listFeatures = resolve('ListFeaturesUseCase');
23
23
  const listRepos = resolve('ListRepositoriesUseCase');
24
- const [features, repositories] = await Promise.all([listFeatures.execute(), listRepos.execute()]);
24
+ const [features, repositories] = await Promise.all([
25
+ listFeatures.execute({ includeArchived: true }),
26
+ listRepos.execute(),
27
+ ]);
25
28
  const repoByPath = new Map();
26
29
  for (const repo of repositories) {
27
30
  repoByPath.set(repo.path, { name: repo.name, remoteUrl: repo.remoteUrl });
@@ -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":"AA+BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAU5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,SAAS,EAAE,OAAO,CAAC;IACnB,uFAAuF;IACvF,WAAW,EAAE,OAAO,CAAC;IACrB,gFAAgF;IAChF,kBAAkB,EAAE,OAAO,CAAC;IAC5B,uDAAuD;IACvD,YAAY,EAAE,OAAO,CAAC;IACtB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAyED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,+EAA+E;IAC/E,YAAY,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAClC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oEAAoE;IACpE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,yEAAyE;IACzE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,kBAAkB,EAClB,eAAe,GAChB,EAAE,wBAAwB,2CAqgC1B;AAsJD,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;IAC7C,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAAC,EACjC,YAAY,EACZ,KAAK,EACL,QAAQ,EACR,eAAe,EACf,QAAQ,GACT,EAAE,uBAAuB,2CA0NzB"}
@@ -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"}
@@ -7,6 +7,24 @@ const SAMPLE_REPOSITORIES = [
7
7
  { id: 'repo-003', name: 'shared-lib', path: '/Users/dev/libs/shared-lib' },
8
8
  { id: 'repo-004', name: 'docs-site', path: '/Users/dev/projects/docs-site' },
9
9
  ];
10
+ const REPOS_WITH_FORKS = [
11
+ { id: 'repo-001', name: 'my-app', path: '/Users/dev/projects/my-app' },
12
+ {
13
+ id: 'repo-002',
14
+ name: 'api-service',
15
+ path: '/Users/dev/projects/api-service',
16
+ isFork: true,
17
+ upstreamUrl: 'https://github.com/upstream-org/api-service',
18
+ },
19
+ { id: 'repo-003', name: 'shared-lib', path: '/Users/dev/libs/shared-lib' },
20
+ {
21
+ id: 'repo-004',
22
+ name: 'open-source-tool',
23
+ path: '/Users/dev/projects/open-source-tool',
24
+ isFork: true,
25
+ upstreamUrl: 'https://github.com/community/open-source-tool',
26
+ },
27
+ ];
10
28
  const meta = {
11
29
  title: 'Drawers/Feature/RepositoryCombobox',
12
30
  component: RepositoryCombobox,
@@ -40,3 +58,7 @@ export const PreSelected = {
40
58
  export const Disabled = {
41
59
  render: () => _jsx(RepositoryComboboxWrapper, { repositories: SAMPLE_REPOSITORIES, disabled: true }),
42
60
  };
61
+ /** Repositories with fork badges — forked repos show a "Fork" badge next to their name. */
62
+ export const WithForkBadges = {
63
+ render: () => _jsx(RepositoryComboboxWrapper, { repositories: REPOS_WITH_FORKS }),
64
+ };
@@ -9,28 +9,44 @@ export interface FeatureTreeRow {
9
9
  repositoryName: string;
10
10
  remoteUrl?: string;
11
11
  parentId?: string;
12
- /** Child rows for tree hierarchy */
12
+ /** Internal: child rows for tree hierarchy */
13
13
  _children?: FeatureTreeRow[];
14
- /** Whether this row is a repository group header */
14
+ /** Internal: whether this row is a group header */
15
+ _isGroupHeader?: boolean;
16
+ /** Internal: number of features in this group */
17
+ _groupCount?: number;
18
+ /** Internal: whether this row is a repository group header (legacy tree) */
15
19
  _isRepoGroup?: boolean;
16
- /** Number of features in this repo group */
20
+ /** Internal: number of features in this repo group (legacy tree) */
17
21
  _featureCount?: number;
18
22
  }
19
23
  export interface InventoryRepo {
20
24
  name: string;
21
25
  remoteUrl?: string;
22
26
  }
27
+ export type GroupByField = 'repositoryName' | 'status' | 'lifecycle';
28
+ export type SortDir = 'asc' | 'desc';
23
29
  export interface FeatureTreeTableProps {
24
30
  data: FeatureTreeRow[];
25
31
  repos?: InventoryRepo[];
26
32
  className?: string;
27
33
  onFeatureClick?: (featureId: string) => void;
34
+ /** When set, features are grouped into a tree by this field. */
35
+ groupBy?: GroupByField | null;
36
+ /** Sort direction for group headers. */
37
+ groupSortDir?: SortDir;
38
+ /** Field to sort items within each group (or globally in flat mode). */
39
+ itemSortField?: string;
40
+ /** Sort direction for items. */
41
+ itemSortDir?: SortDir;
28
42
  }
43
+ export declare function displayLabel(groupBy: GroupByField, value: string): string;
29
44
  /**
30
- * Build tree-structured data grouped by repository.
45
+ * Build tree-structured data grouped by repository (legacy format).
31
46
  * Each repository becomes a parent node with its features as children.
32
47
  * Repos without features are included as empty groups.
33
48
  */
34
49
  export declare function buildTreeData(flatData: FeatureTreeRow[], repos?: InventoryRepo[]): FeatureTreeRow[];
35
- export declare function FeatureTreeTable({ data, repos, className, onFeatureClick, }: FeatureTreeTableProps): import("react/jsx-runtime").JSX.Element;
50
+ export declare function buildGroupedTree(flatData: FeatureTreeRow[], groupBy: GroupByField, groupSortDir: SortDir, itemSortField: string, itemSortDir: SortDir): FeatureTreeRow[];
51
+ export declare function FeatureTreeTable({ data, className, onFeatureClick, groupBy, groupSortDir, itemSortField, itemSortDir, }: FeatureTreeTableProps): import("react/jsx-runtime").JSX.Element;
36
52
  //# sourceMappingURL=feature-tree-table.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-tree-table.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/feature-tree-table/feature-tree-table.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,0BAA0B,CAAC;AAElC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oCAAoC;IACpC,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,oDAAoD;IACpD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AA+FD;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,cAAc,EAAE,EAC1B,KAAK,CAAC,EAAE,aAAa,EAAE,GACtB,cAAc,EAAE,CAmElB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,KAAK,EACL,SAAS,EACT,cAAc,GACf,EAAE,qBAAqB,2CAgDvB"}
1
+ {"version":3,"file":"feature-tree-table.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/feature-tree-table/feature-tree-table.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,0BAA0B,CAAC;AAElC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,cAAc,EAAE,CAAC;IAC7B,mDAAmD;IACnD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iDAAiD;IACjD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,gBAAgB,GAAG,QAAQ,GAAG,WAAW,CAAC;AACrE,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAErC,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,gEAAgE;IAChE,OAAO,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9B,wCAAwC;IACxC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gCAAgC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAiJD,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAGzE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,cAAc,EAAE,EAC1B,KAAK,CAAC,EAAE,aAAa,EAAE,GACtB,cAAc,EAAE,CAkDlB;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,cAAc,EAAE,EAC1B,OAAO,EAAE,YAAY,EACrB,YAAY,EAAE,OAAO,EACrB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,OAAO,GACnB,cAAc,EAAE,CA8ClB;AAID,wBAAgB,gBAAgB,CAAC,EAC/B,IAAI,EACJ,SAAS,EACT,cAAc,EACd,OAAc,EACd,YAAoB,EACpB,aAAsB,EACtB,WAAmB,GACpB,EAAE,qBAAqB,2CAyDvB"}