@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
@@ -4,6 +4,7 @@ import { useEffect, useRef, useCallback } from 'react';
4
4
  import { TabulatorFull as Tabulator } from 'tabulator-tables';
5
5
  import { cn } from '../../../lib/utils.js';
6
6
  import './feature-tree-table.css';
7
+ // ── Constants ────────────────────────────────────────────────
7
8
  const STATUS_LABELS = {
8
9
  'action-needed': 'Action Needed',
9
10
  'in-progress': 'In Progress',
@@ -12,119 +13,155 @@ const STATUS_LABELS = {
12
13
  error: 'Error',
13
14
  done: 'Done',
14
15
  };
15
- /** SVG repo icon — lucide FolderGit2 */
16
- const REPO_ICON_SVG = `<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"/><circle cx="12" cy="13" r="2"/><path d="M14 13h3"/><path d="M7 13h3"/></svg>`;
16
+ /** SVG repo icon — lucide FolderGit2 (16px) */
17
+ const REPO_ICON_SVG = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"/><circle cx="12" cy="13" r="2"/><path d="M14 13h3"/><path d="M7 13h3"/></svg>`;
18
+ /** SVG group icon — lucide Layers (16px) */
19
+ const GROUP_ICON_SVG = `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="m12.83 2.18a2 2 0 0 0-1.66 0L2.6 6.08a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z"/><path d="m22.54 12.43-1.42-.65-8.28 3.78a2 2 0 0 1-1.66 0l-8.28-3.78-1.42.65a1 1 0 0 0 0 1.83l8.58 3.91a2 2 0 0 0 1.66 0l8.58-3.9a1 1 0 0 0 0-1.83Z"/></svg>`;
20
+ // ── Formatters ───────────────────────────────────────────────
21
+ function escapeHtml(text) {
22
+ const div = typeof document !== 'undefined' ? document.createElement('div') : null;
23
+ if (div) {
24
+ div.textContent = text;
25
+ return div.innerHTML;
26
+ }
27
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
28
+ }
17
29
  function statusFormatter(cell) {
18
30
  const row = cell.getRow().getData();
19
- if (row._isRepoGroup)
31
+ if (row._isGroupHeader)
20
32
  return '';
21
33
  const value = cell.getValue();
22
34
  const label = STATUS_LABELS[value] ?? value;
23
35
  return `<span class="status-pill status-pill--${value}"><span class="status-dot"></span>${label}</span>`;
24
36
  }
25
- function nameFormatter(cell) {
37
+ function branchFormatter(cell) {
26
38
  const row = cell.getRow().getData();
27
- if (row._isRepoGroup) {
28
- const count = row._featureCount ?? 0;
29
- const countLabel = count === 0 ? 'No features' : count === 1 ? '1 Feature' : `${count} Features`;
30
- const remoteLabel = row.remoteUrl
31
- ? `<span class="repo-remote-url">${escapeHtml(row.remoteUrl)}</span>`
32
- : '';
33
- return `<span class="repo-name-cell">${REPO_ICON_SVG}<span class="repo-name-text"><span class="repo-name-primary"><span class="repo-name-title">${escapeHtml(row.name)}</span><span class="repo-feature-count">${countLabel}</span></span>${remoteLabel}</span></span>`;
34
- }
39
+ if (row._isGroupHeader)
40
+ return '';
41
+ const val = cell.getValue();
42
+ if (!val)
43
+ return '';
44
+ return `<code style="font-size:12px;color:var(--color-muted-foreground,#64748b);font-family:var(--font-mono)">${escapeHtml(val)}</code>`;
45
+ }
46
+ function lifecycleFormatter(cell) {
47
+ const row = cell.getRow().getData();
48
+ if (row._isGroupHeader)
49
+ return '';
35
50
  return escapeHtml(cell.getValue());
36
51
  }
37
- function escapeHtml(text) {
38
- const div = typeof document !== 'undefined' ? document.createElement('div') : null;
39
- if (div) {
40
- div.textContent = text;
41
- return div.innerHTML;
42
- }
43
- return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
52
+ function repoFormatter(cell) {
53
+ const row = cell.getRow().getData();
54
+ if (row._isGroupHeader)
55
+ return '';
56
+ const val = cell.getValue();
57
+ return `<span style="display:inline-flex;align-items:center;gap:6px">${REPO_ICON_SVG}<span>${escapeHtml(val)}</span></span>`;
58
+ }
59
+ function groupHeaderNameFormatter(groupBy) {
60
+ return (cell) => {
61
+ const row = cell.getRow().getData();
62
+ if (!row._isGroupHeader)
63
+ return escapeHtml(cell.getValue());
64
+ const icon = groupBy === 'repositoryName' ? REPO_ICON_SVG : GROUP_ICON_SVG;
65
+ const count = row._groupCount ?? 0;
66
+ const countLabel = count === 1 ? '1 feature' : `${count} features`;
67
+ return `<span style="display:inline-flex;align-items:center;gap:8px;font-weight:600">${icon}<span>${escapeHtml(row.name)}</span><span style="font-weight:400;color:var(--color-muted-foreground,#64748b);font-size:12px">${countLabel}</span></span>`;
68
+ };
44
69
  }
45
- function buildColumns(onFeatureClick) {
46
- return [
70
+ /** All possible columns. We'll filter out the grouped-by column in tree mode. */
71
+ function buildColumns({ onFeatureClick, groupBy }) {
72
+ const clickProps = onFeatureClick
73
+ ? {
74
+ cellClick: (_e, cell) => {
75
+ const data = cell.getRow().getData();
76
+ if (data._isGroupHeader)
77
+ return;
78
+ onFeatureClick(data.id);
79
+ },
80
+ cssClass: 'cursor-pointer',
81
+ }
82
+ : {};
83
+ const isGrouped = !!groupBy;
84
+ const cols = [
47
85
  {
48
86
  title: 'Name',
49
87
  field: 'name',
50
88
  widthGrow: 3,
51
- formatter: nameFormatter,
52
- ...(onFeatureClick && {
53
- cellClick: (_e, cell) => {
54
- const data = cell.getRow().getData();
55
- if (data._isRepoGroup)
56
- return;
57
- onFeatureClick(data.id);
58
- },
59
- cssClass: 'cursor-pointer',
60
- }),
61
- },
62
- {
63
- title: 'Status',
64
- field: 'status',
65
- widthGrow: 1.5,
66
- formatter: statusFormatter,
67
- },
68
- {
69
- title: 'Lifecycle',
70
- field: 'lifecycle',
71
- widthGrow: 1.5,
72
- formatter: (cell) => {
73
- const row = cell.getRow().getData();
74
- if (row._isRepoGroup)
75
- return '';
76
- return cell.getValue();
77
- },
89
+ headerSort: !isGrouped,
90
+ formatter: isGrouped
91
+ ? groupHeaderNameFormatter(groupBy)
92
+ : (cell) => escapeHtml(cell.getValue()),
93
+ ...clickProps,
78
94
  },
95
+ groupBy !== 'repositoryName'
96
+ ? {
97
+ title: 'Repository',
98
+ field: 'repositoryName',
99
+ widthGrow: 2,
100
+ headerSort: !isGrouped,
101
+ formatter: repoFormatter,
102
+ }
103
+ : null,
104
+ groupBy !== 'status'
105
+ ? {
106
+ title: 'Status',
107
+ field: 'status',
108
+ widthGrow: 1.5,
109
+ headerSort: !isGrouped,
110
+ formatter: statusFormatter,
111
+ }
112
+ : null,
113
+ groupBy !== 'lifecycle'
114
+ ? {
115
+ title: 'Lifecycle',
116
+ field: 'lifecycle',
117
+ widthGrow: 1.5,
118
+ headerSort: !isGrouped,
119
+ formatter: lifecycleFormatter,
120
+ }
121
+ : null,
79
122
  {
80
123
  title: 'Branch',
81
124
  field: 'branch',
82
125
  widthGrow: 2,
83
- formatter: (cell) => {
84
- const row = cell.getRow().getData();
85
- if (row._isRepoGroup)
86
- return '';
87
- const val = cell.getValue();
88
- if (!val)
89
- return '';
90
- return `<code style="font-size:12px;color:var(--color-muted-foreground,#64748b);font-family:var(--font-mono)">${escapeHtml(val)}</code>`;
91
- },
126
+ headerSort: !isGrouped,
127
+ formatter: branchFormatter,
92
128
  },
93
129
  ];
130
+ return cols.filter(Boolean);
131
+ }
132
+ // ── Tree builder ─────────────────────────────────────────────
133
+ export function displayLabel(groupBy, value) {
134
+ if (groupBy === 'status')
135
+ return STATUS_LABELS[value] ?? value;
136
+ return value;
94
137
  }
95
138
  /**
96
- * Build tree-structured data grouped by repository.
139
+ * Build tree-structured data grouped by repository (legacy format).
97
140
  * Each repository becomes a parent node with its features as children.
98
141
  * Repos without features are included as empty groups.
99
142
  */
100
143
  export function buildTreeData(flatData, repos) {
101
- // Group features by repository
102
144
  const byRepo = new Map();
103
145
  for (const item of flatData) {
104
146
  const repoName = item.repositoryName || 'Unknown';
105
- if (!byRepo.has(repoName)) {
147
+ if (!byRepo.has(repoName))
106
148
  byRepo.set(repoName, []);
107
- }
108
149
  byRepo.get(repoName).push(item);
109
150
  }
110
- // Ensure all known repos are represented (even without features)
111
151
  const repoMeta = new Map();
112
152
  if (repos) {
113
153
  for (const repo of repos) {
114
154
  repoMeta.set(repo.name, { remoteUrl: repo.remoteUrl });
115
- if (!byRepo.has(repo.name)) {
155
+ if (!byRepo.has(repo.name))
116
156
  byRepo.set(repo.name, []);
117
- }
118
157
  }
119
158
  }
120
159
  const roots = [];
121
160
  for (const [repoName, features] of byRepo) {
122
- // Build parent-child relationships within this repo group
123
161
  const lookup = new Map();
124
162
  const repoChildren = [];
125
- for (const item of features) {
163
+ for (const item of features)
126
164
  lookup.set(item.id, { ...item, _children: [] });
127
- }
128
165
  for (const item of features) {
129
166
  const node = lookup.get(item.id);
130
167
  if (item.parentId && lookup.has(item.parentId)) {
@@ -134,14 +171,12 @@ export function buildTreeData(flatData, repos) {
134
171
  repoChildren.push(node);
135
172
  }
136
173
  }
137
- // Clean up empty _children arrays
138
174
  for (const node of lookup.values()) {
139
- if (node._children?.length === 0) {
175
+ if (node._children?.length === 0)
140
176
  delete node._children;
141
- }
142
177
  }
143
178
  const remoteUrl = repoMeta.get(repoName)?.remoteUrl ?? features[0]?.remoteUrl;
144
- const repoGroup = {
179
+ roots.push({
145
180
  id: `repo-${repoName}`,
146
181
  name: repoName,
147
182
  status: 'pending',
@@ -152,12 +187,51 @@ export function buildTreeData(flatData, repos) {
152
187
  _isRepoGroup: true,
153
188
  _featureCount: features.length,
154
189
  ...(repoChildren.length > 0 ? { _children: repoChildren } : {}),
155
- };
156
- roots.push(repoGroup);
190
+ });
157
191
  }
158
192
  return roots;
159
193
  }
160
- export function FeatureTreeTable({ data, repos, className, onFeatureClick, }) {
194
+ export function buildGroupedTree(flatData, groupBy, groupSortDir, itemSortField, itemSortDir) {
195
+ // Group features by field value
196
+ const groups = new Map();
197
+ for (const item of flatData) {
198
+ const key = item[groupBy] || 'Unknown';
199
+ if (!groups.has(key))
200
+ groups.set(key, []);
201
+ groups.get(key).push(item);
202
+ }
203
+ // Sort items within each group
204
+ const sortItems = (items) => [...items].sort((a, b) => {
205
+ const aVal = String(a[itemSortField] ?? '').toLowerCase();
206
+ const bVal = String(b[itemSortField] ?? '').toLowerCase();
207
+ const cmp = aVal.localeCompare(bVal);
208
+ return itemSortDir === 'asc' ? cmp : -cmp;
209
+ });
210
+ // Build group header rows
211
+ const roots = [];
212
+ for (const [key, features] of groups) {
213
+ const sortedChildren = sortItems(features);
214
+ roots.push({
215
+ id: `group-${groupBy}-${key}`,
216
+ name: displayLabel(groupBy, key),
217
+ status: 'pending',
218
+ lifecycle: '',
219
+ branch: '',
220
+ repositoryName: '',
221
+ _isGroupHeader: true,
222
+ _groupCount: features.length,
223
+ _children: sortedChildren,
224
+ });
225
+ }
226
+ // Sort groups
227
+ roots.sort((a, b) => {
228
+ const cmp = a.name.localeCompare(b.name);
229
+ return groupSortDir === 'asc' ? cmp : -cmp;
230
+ });
231
+ return roots;
232
+ }
233
+ // ── Component ────────────────────────────────────────────────
234
+ export function FeatureTreeTable({ data, className, onFeatureClick, groupBy = null, groupSortDir = 'asc', itemSortField = 'name', itemSortDir = 'asc', }) {
161
235
  const containerRef = useRef(null);
162
236
  const tabulatorRef = useRef(null);
163
237
  const onFeatureClickRef = useRef(onFeatureClick);
@@ -168,29 +242,37 @@ export function FeatureTreeTable({ data, repos, className, onFeatureClick, }) {
168
242
  useEffect(() => {
169
243
  if (!containerRef.current)
170
244
  return;
171
- const treeData = buildTreeData(data, repos);
172
- const columns = buildColumns(stableOnFeatureClick);
245
+ const isGrouped = !!groupBy;
246
+ const columns = buildColumns({ onFeatureClick: stableOnFeatureClick, groupBy });
247
+ const tableData = isGrouped
248
+ ? buildGroupedTree(data, groupBy, groupSortDir, itemSortField, itemSortDir)
249
+ : data;
173
250
  const table = new Tabulator(containerRef.current, {
174
- data: treeData,
251
+ data: tableData,
175
252
  columns,
176
- dataTree: true,
177
- dataTreeStartExpanded: true,
178
253
  layout: 'fitColumns',
179
254
  height: '100%',
180
- placeholder: 'No repositories found',
181
- headerSortClickElement: 'icon',
182
- rowFormatter: (row) => {
183
- const rowData = row.getData();
184
- if (rowData._isRepoGroup) {
185
- row.getElement().classList.add('tabulator-row-repo-group');
255
+ placeholder: 'No features found',
256
+ ...(isGrouped
257
+ ? {
258
+ dataTree: true,
259
+ dataTreeStartExpanded: true,
260
+ rowFormatter: (row) => {
261
+ const rowData = row.getData();
262
+ if (rowData._isGroupHeader) {
263
+ row.getElement().classList.add('tabulator-row-repo-group');
264
+ }
265
+ },
186
266
  }
187
- },
267
+ : {
268
+ initialSort: [{ column: 'repositoryName', dir: 'asc' }],
269
+ }),
188
270
  });
189
271
  tabulatorRef.current = table;
190
272
  return () => {
191
273
  table.destroy();
192
274
  tabulatorRef.current = null;
193
275
  };
194
- }, [data, repos, stableOnFeatureClick]);
276
+ }, [data, stableOnFeatureClick, groupBy, groupSortDir, itemSortField, itemSortDir]);
195
277
  return (_jsx("div", { "data-testid": "feature-tree-table", className: cn('h-full w-full', className), ref: containerRef }));
196
278
  }
@@ -1,3 +1,3 @@
1
- export { FeatureTreeTable, buildTreeData } from './feature-tree-table.js';
2
- export type { FeatureTreeTableProps, FeatureTreeRow, InventoryRepo } from './feature-tree-table.js';
1
+ export { FeatureTreeTable, buildTreeData, buildGroupedTree, displayLabel, } from './feature-tree-table.js';
2
+ export type { FeatureTreeTableProps, FeatureTreeRow, InventoryRepo, GroupByField, SortDir, } from './feature-tree-table.js';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/feature-tree-table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACvE,YAAY,EAAE,qBAAqB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/feature-tree-table/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,qBAAqB,EACrB,cAAc,EACd,aAAa,EACb,YAAY,EACZ,OAAO,GACR,MAAM,sBAAsB,CAAC"}
@@ -1 +1 @@
1
- export { FeatureTreeTable, buildTreeData } from './feature-tree-table.js';
1
+ export { FeatureTreeTable, buildTreeData, buildGroupedTree, displayLabel, } from './feature-tree-table.js';
@@ -36,7 +36,7 @@ export function getFeatureFlags() {
36
36
  ? isEnabled(process.env.NEXT_PUBLIC_FLAG_ENV_DEPLOY)
37
37
  : true,
38
38
  debug: false,
39
- githubImport: false,
39
+ githubImport: true,
40
40
  adoptBranch: false,
41
41
  gitRebaseSync: false,
42
42
  reactFileManager: isEnabled(process.env.NEXT_PUBLIC_FLAG_REACT_FILE_MANAGER),
@@ -209,6 +209,9 @@
209
209
  "injectSkillsOption": "Inject curated skills into the worktree",
210
210
  "noInjectSkillsOption": "Skip skill injection for this invocation",
211
211
  "attachOption": "إرفاق ملف (قابل للتكرار)",
212
+ "remoteOption": "GitHub URL or owner/repo — clone (or fork) then create feature",
213
+ "remoteConflict": "Cannot use --remote with --repo. --remote clones the repo first.",
214
+ "forkedInfo": "Auto-forked (no push access to original)",
212
215
  "parentNotFound": "الميزة الأصلية غير موجودة: {{id}}",
213
216
  "attachmentNotFound": "المرفق غير موجود: {{path}}",
214
217
  "spinnerText": "جارٍ التفكير",
@@ -438,6 +441,15 @@
438
441
  "cloneFailed": "فشل الاستنساخ: {{error}}",
439
442
  "failedToImport": "فشل استيراد المستودع"
440
443
  },
444
+ "initRemote": {
445
+ "description": "Create a GitHub repository from the current local repo",
446
+ "nameArgument": "Repository name (defaults to directory name)",
447
+ "publicOption": "Create a public repository (default: private)",
448
+ "orgOption": "GitHub organization to create the repo under",
449
+ "created": "GitHub repository created: {{name}}",
450
+ "urlLabel": "URL:",
451
+ "failed": "Failed to create GitHub repository"
452
+ },
441
453
  "ls": {
442
454
  "description": "عرض المستودعات المتتبعة",
443
455
  "title": "المستودعات",
@@ -209,6 +209,9 @@
209
209
  "injectSkillsOption": "Inject curated skills into the worktree",
210
210
  "noInjectSkillsOption": "Skip skill injection for this invocation",
211
211
  "attachOption": "Eine Datei anhängen (wiederholbar)",
212
+ "remoteOption": "GitHub URL or owner/repo — clone (or fork) then create feature",
213
+ "remoteConflict": "Cannot use --remote with --repo. --remote clones the repo first.",
214
+ "forkedInfo": "Auto-forked (no push access to original)",
212
215
  "parentNotFound": "Übergeordnetes Feature nicht gefunden: {{id}}",
213
216
  "attachmentNotFound": "Anhang nicht gefunden: {{path}}",
214
217
  "spinnerText": "Denke nach",
@@ -438,6 +441,15 @@
438
441
  "cloneFailed": "Klonen fehlgeschlagen: {{error}}",
439
442
  "failedToImport": "Repository konnte nicht importiert werden"
440
443
  },
444
+ "initRemote": {
445
+ "description": "Create a GitHub repository from the current local repo",
446
+ "nameArgument": "Repository name (defaults to directory name)",
447
+ "publicOption": "Create a public repository (default: private)",
448
+ "orgOption": "GitHub organization to create the repo under",
449
+ "created": "GitHub repository created: {{name}}",
450
+ "urlLabel": "URL:",
451
+ "failed": "Failed to create GitHub repository"
452
+ },
441
453
  "ls": {
442
454
  "description": "Verfolgte Repositories auflisten",
443
455
  "title": "Repositories",
@@ -209,6 +209,9 @@
209
209
  "injectSkillsOption": "Inject curated skills into the worktree",
210
210
  "noInjectSkillsOption": "Skip skill injection for this invocation",
211
211
  "attachOption": "Attach a file (repeatable)",
212
+ "remoteOption": "GitHub URL or owner/repo — clone (or fork) then create feature",
213
+ "remoteConflict": "Cannot use --remote with --repo. --remote clones the repo first.",
214
+ "forkedInfo": "Auto-forked (no push access to original)",
212
215
  "parentNotFound": "Parent feature not found: {{id}}",
213
216
  "attachmentNotFound": "Attachment not found: {{path}}",
214
217
  "spinnerText": "Thinking",
@@ -438,6 +441,15 @@
438
441
  "cloneFailed": "Clone failed: {{error}}",
439
442
  "failedToImport": "Failed to import repository"
440
443
  },
444
+ "initRemote": {
445
+ "description": "Create a GitHub repository from the current local repo",
446
+ "nameArgument": "Repository name (defaults to directory name)",
447
+ "publicOption": "Create a public repository (default: private)",
448
+ "orgOption": "GitHub organization to create the repo under",
449
+ "created": "GitHub repository created: {{name}}",
450
+ "urlLabel": "URL:",
451
+ "failed": "Failed to create GitHub repository"
452
+ },
441
453
  "ls": {
442
454
  "description": "List tracked repositories",
443
455
  "title": "Repositories",
@@ -209,6 +209,9 @@
209
209
  "injectSkillsOption": "Inject curated skills into the worktree",
210
210
  "noInjectSkillsOption": "Skip skill injection for this invocation",
211
211
  "attachOption": "Adjuntar un archivo (repetible)",
212
+ "remoteOption": "GitHub URL or owner/repo — clone (or fork) then create feature",
213
+ "remoteConflict": "Cannot use --remote with --repo. --remote clones the repo first.",
214
+ "forkedInfo": "Auto-forked (no push access to original)",
212
215
  "parentNotFound": "Funcionalidad padre no encontrada: {{id}}",
213
216
  "attachmentNotFound": "Archivo adjunto no encontrado: {{path}}",
214
217
  "spinnerText": "Pensando",
@@ -438,6 +441,15 @@
438
441
  "cloneFailed": "Error al clonar: {{error}}",
439
442
  "failedToImport": "Error al importar el repositorio"
440
443
  },
444
+ "initRemote": {
445
+ "description": "Create a GitHub repository from the current local repo",
446
+ "nameArgument": "Repository name (defaults to directory name)",
447
+ "publicOption": "Create a public repository (default: private)",
448
+ "orgOption": "GitHub organization to create the repo under",
449
+ "created": "GitHub repository created: {{name}}",
450
+ "urlLabel": "URL:",
451
+ "failed": "Failed to create GitHub repository"
452
+ },
441
453
  "ls": {
442
454
  "description": "Listar repositorios rastreados",
443
455
  "title": "Repositorios",
@@ -209,6 +209,9 @@
209
209
  "injectSkillsOption": "Inject curated skills into the worktree",
210
210
  "noInjectSkillsOption": "Skip skill injection for this invocation",
211
211
  "attachOption": "Joindre un fichier (répétable)",
212
+ "remoteOption": "GitHub URL or owner/repo — clone (or fork) then create feature",
213
+ "remoteConflict": "Cannot use --remote with --repo. --remote clones the repo first.",
214
+ "forkedInfo": "Auto-forked (no push access to original)",
212
215
  "parentNotFound": "Fonctionnalité parente introuvable : {{id}}",
213
216
  "attachmentNotFound": "Pièce jointe introuvable : {{path}}",
214
217
  "spinnerText": "Réflexion en cours",
@@ -438,6 +441,15 @@
438
441
  "cloneFailed": "Échec du clonage : {{error}}",
439
442
  "failedToImport": "Échec de l'importation du dépôt"
440
443
  },
444
+ "initRemote": {
445
+ "description": "Create a GitHub repository from the current local repo",
446
+ "nameArgument": "Repository name (defaults to directory name)",
447
+ "publicOption": "Create a public repository (default: private)",
448
+ "orgOption": "GitHub organization to create the repo under",
449
+ "created": "GitHub repository created: {{name}}",
450
+ "urlLabel": "URL:",
451
+ "failed": "Failed to create GitHub repository"
452
+ },
441
453
  "ls": {
442
454
  "description": "Lister les dépôts suivis",
443
455
  "title": "Dépôts",
@@ -209,6 +209,9 @@
209
209
  "injectSkillsOption": "Inject curated skills into the worktree",
210
210
  "noInjectSkillsOption": "Skip skill injection for this invocation",
211
211
  "attachOption": "צרף קובץ (ניתן לחזור)",
212
+ "remoteOption": "GitHub URL or owner/repo — clone (or fork) then create feature",
213
+ "remoteConflict": "Cannot use --remote with --repo. --remote clones the repo first.",
214
+ "forkedInfo": "Auto-forked (no push access to original)",
212
215
  "parentNotFound": "פיצ'ר הורה לא נמצא: {{id}}",
213
216
  "attachmentNotFound": "קובץ מצורף לא נמצא: {{path}}",
214
217
  "spinnerText": "חושב",
@@ -438,6 +441,15 @@
438
441
  "cloneFailed": "השיבוט נכשל: {{error}}",
439
442
  "failedToImport": "ייבוא המאגר נכשל"
440
443
  },
444
+ "initRemote": {
445
+ "description": "Create a GitHub repository from the current local repo",
446
+ "nameArgument": "Repository name (defaults to directory name)",
447
+ "publicOption": "Create a public repository (default: private)",
448
+ "orgOption": "GitHub organization to create the repo under",
449
+ "created": "GitHub repository created: {{name}}",
450
+ "urlLabel": "URL:",
451
+ "failed": "Failed to create GitHub repository"
452
+ },
441
453
  "ls": {
442
454
  "description": "הצג רשימת מאגרים מנוטרים",
443
455
  "title": "מאגרים",
@@ -209,6 +209,9 @@
209
209
  "injectSkillsOption": "Inject curated skills into the worktree",
210
210
  "noInjectSkillsOption": "Skip skill injection for this invocation",
211
211
  "attachOption": "Anexar um arquivo (repetível)",
212
+ "remoteOption": "GitHub URL or owner/repo — clone (or fork) then create feature",
213
+ "remoteConflict": "Cannot use --remote with --repo. --remote clones the repo first.",
214
+ "forkedInfo": "Auto-forked (no push access to original)",
212
215
  "parentNotFound": "Recurso pai não encontrado: {{id}}",
213
216
  "attachmentNotFound": "Anexo não encontrado: {{path}}",
214
217
  "spinnerText": "Pensando",
@@ -438,6 +441,15 @@
438
441
  "cloneFailed": "Clone falhou: {{error}}",
439
442
  "failedToImport": "Falha ao importar repositório"
440
443
  },
444
+ "initRemote": {
445
+ "description": "Create a GitHub repository from the current local repo",
446
+ "nameArgument": "Repository name (defaults to directory name)",
447
+ "publicOption": "Create a public repository (default: private)",
448
+ "orgOption": "GitHub organization to create the repo under",
449
+ "created": "GitHub repository created: {{name}}",
450
+ "urlLabel": "URL:",
451
+ "failed": "Failed to create GitHub repository"
452
+ },
441
453
  "ls": {
442
454
  "description": "Listar repositórios rastreados",
443
455
  "title": "Repositórios",
@@ -209,6 +209,9 @@
209
209
  "injectSkillsOption": "Inject curated skills into the worktree",
210
210
  "noInjectSkillsOption": "Skip skill injection for this invocation",
211
211
  "attachOption": "Прикрепить файл (можно повторять)",
212
+ "remoteOption": "GitHub URL or owner/repo — clone (or fork) then create feature",
213
+ "remoteConflict": "Cannot use --remote with --repo. --remote clones the repo first.",
214
+ "forkedInfo": "Auto-forked (no push access to original)",
212
215
  "parentNotFound": "Родительская функция не найдена: {{id}}",
213
216
  "attachmentNotFound": "Вложение не найдено: {{path}}",
214
217
  "spinnerText": "Обработка",
@@ -438,6 +441,15 @@
438
441
  "cloneFailed": "Ошибка клонирования: {{error}}",
439
442
  "failedToImport": "Не удалось импортировать репозиторий"
440
443
  },
444
+ "initRemote": {
445
+ "description": "Create a GitHub repository from the current local repo",
446
+ "nameArgument": "Repository name (defaults to directory name)",
447
+ "publicOption": "Create a public repository (default: private)",
448
+ "orgOption": "GitHub organization to create the repo under",
449
+ "created": "GitHub repository created: {{name}}",
450
+ "urlLabel": "URL:",
451
+ "failed": "Failed to create GitHub repository"
452
+ },
441
453
  "ls": {
442
454
  "description": "Показать список отслеживаемых репозиториев",
443
455
  "title": "Репозитории",