@shepai/cli 1.173.0 → 1.174.0-pr530.be90793

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 (298) hide show
  1. package/dist/eslint.config.mjs +2 -0
  2. package/dist/packages/core/src/application/ports/output/services/i-browser-opener.d.ts +28 -0
  3. package/dist/packages/core/src/application/ports/output/services/i-browser-opener.d.ts.map +1 -0
  4. package/dist/packages/core/src/application/ports/output/services/i-browser-opener.js +13 -0
  5. package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.d.ts +29 -0
  6. package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.d.ts.map +1 -0
  7. package/dist/packages/core/src/application/ports/output/services/i-desktop-notifier.js +13 -0
  8. package/dist/packages/core/src/application/ports/output/services/index.d.ts +2 -0
  9. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  10. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/di/container.js +5 -0
  12. package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts +2 -1
  13. package/dist/packages/core/src/infrastructure/services/browser-opener.service.d.ts.map +1 -1
  14. package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts +2 -1
  15. package/dist/packages/core/src/infrastructure/services/notifications/desktop-notifier.d.ts.map +1 -1
  16. package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts +1 -1
  17. package/dist/src/presentation/cli/commands/daemon/start-daemon.js +2 -3
  18. package/dist/src/presentation/cli/commands/ui.command.js +1 -2
  19. package/dist/src/presentation/web/app/features/feature-tree-page-client.d.ts +7 -1
  20. package/dist/src/presentation/web/app/features/feature-tree-page-client.d.ts.map +1 -1
  21. package/dist/src/presentation/web/app/features/feature-tree-page-client.js +142 -3
  22. package/dist/src/presentation/web/app/features/get-feature-tree-data.d.ts.map +1 -1
  23. package/dist/src/presentation/web/app/features/get-feature-tree-data.js +4 -1
  24. package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.d.ts +21 -5
  25. package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.d.ts.map +1 -1
  26. package/dist/src/presentation/web/components/features/feature-tree-table/feature-tree-table.js +169 -87
  27. package/dist/src/presentation/web/components/features/feature-tree-table/index.d.ts +2 -2
  28. package/dist/src/presentation/web/components/features/feature-tree-table/index.d.ts.map +1 -1
  29. package/dist/src/presentation/web/components/features/feature-tree-table/index.js +1 -1
  30. package/dist/tsconfig.build.tsbuildinfo +1 -1
  31. package/package.json +10 -2
  32. package/web/.next/BUILD_ID +1 -1
  33. package/web/.next/build-manifest.json +4 -4
  34. package/web/.next/fallback-build-manifest.json +2 -2
  35. package/web/.next/prerender-manifest.json +3 -3
  36. package/web/.next/required-server-files.js +3 -3
  37. package/web/.next/required-server-files.json +3 -3
  38. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/build-manifest.json +2 -2
  39. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +29 -29
  40. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  41. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  42. package/web/.next/server/app/(dashboard)/@drawer/chat/page/build-manifest.json +2 -2
  43. package/web/.next/server/app/(dashboard)/@drawer/chat/page/server-reference-manifest.json +27 -27
  44. package/web/.next/server/app/(dashboard)/@drawer/chat/page.js.nft.json +1 -1
  45. package/web/.next/server/app/(dashboard)/@drawer/chat/page_client-reference-manifest.js +1 -1
  46. package/web/.next/server/app/(dashboard)/@drawer/create/page/build-manifest.json +2 -2
  47. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +30 -30
  48. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  49. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  50. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +2 -2
  51. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  52. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  53. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  54. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/build-manifest.json +2 -2
  55. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +38 -38
  56. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  57. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/build-manifest.json +2 -2
  59. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  60. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  61. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  62. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/build-manifest.json +2 -2
  63. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  64. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  65. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  66. package/web/.next/server/app/(dashboard)/chat/page/build-manifest.json +2 -2
  67. package/web/.next/server/app/(dashboard)/chat/page/server-reference-manifest.json +27 -27
  68. package/web/.next/server/app/(dashboard)/chat/page.js.nft.json +1 -1
  69. package/web/.next/server/app/(dashboard)/chat/page_client-reference-manifest.js +1 -1
  70. package/web/.next/server/app/(dashboard)/create/page/build-manifest.json +2 -2
  71. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +30 -30
  72. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  73. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +2 -2
  75. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +38 -38
  76. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  77. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/build-manifest.json +2 -2
  79. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +38 -38
  80. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  81. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  82. package/web/.next/server/app/(dashboard)/page/build-manifest.json +2 -2
  83. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +27 -27
  84. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  85. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/build-manifest.json +2 -2
  87. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page/server-reference-manifest.json +28 -28
  88. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page.js.nft.json +1 -1
  89. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/[tab]/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/build-manifest.json +2 -2
  91. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +28 -28
  92. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  93. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/_global-error/page/build-manifest.json +2 -2
  95. package/web/.next/server/app/_global-error.html +2 -2
  96. package/web/.next/server/app/_global-error.rsc +1 -1
  97. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  98. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  99. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  100. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  101. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  102. package/web/.next/server/app/_not-found/page/build-manifest.json +2 -2
  103. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +6 -6
  104. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  105. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  106. package/web/.next/server/app/features/page/build-manifest.json +2 -2
  107. package/web/.next/server/app/features/page/server-reference-manifest.json +6 -6
  108. package/web/.next/server/app/features/page.js.nft.json +1 -1
  109. package/web/.next/server/app/features/page_client-reference-manifest.js +1 -1
  110. package/web/.next/server/app/settings/page/build-manifest.json +2 -2
  111. package/web/.next/server/app/settings/page/server-reference-manifest.json +9 -9
  112. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  113. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  114. package/web/.next/server/app/skills/page/build-manifest.json +2 -2
  115. package/web/.next/server/app/skills/page/server-reference-manifest.json +13 -13
  116. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  117. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  118. package/web/.next/server/app/tools/page/build-manifest.json +2 -2
  119. package/web/.next/server/app/tools/page/server-reference-manifest.json +11 -11
  120. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  121. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  122. package/web/.next/server/app/version/page/build-manifest.json +2 -2
  123. package/web/.next/server/app/version/page/server-reference-manifest.json +6 -6
  124. package/web/.next/server/app/version/page.js.nft.json +1 -1
  125. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  126. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  127. package/web/.next/server/chunks/ssr/403f9_next_dist_a53cb908._.js +1 -1
  128. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_ceb2fa1e._.js +1 -1
  129. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  130. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js +2 -2
  132. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_feature-drawer-client_tsx_e9755fc8._.js.map +1 -1
  133. package/web/.next/server/chunks/ssr/[root-of-the-server]__08c912ab._.js +1 -1
  134. package/web/.next/server/chunks/ssr/[root-of-the-server]__08c912ab._.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/[root-of-the-server]__0c5452c3._.js +1 -1
  136. package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js +1 -1
  137. package/web/.next/server/chunks/ssr/[root-of-the-server]__1cd4327c._.js.map +1 -1
  138. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js +1 -1
  139. package/web/.next/server/chunks/ssr/[root-of-the-server]__1f389e5d._.js.map +1 -1
  140. package/web/.next/server/chunks/ssr/[root-of-the-server]__22d17c66._.js +3 -0
  141. package/web/.next/server/chunks/ssr/[root-of-the-server]__22d17c66._.js.map +1 -0
  142. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  143. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js +1 -1
  144. package/web/.next/server/chunks/ssr/[root-of-the-server]__4fb81977._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js +1 -1
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__6c7d3936._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js +1 -1
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__7dcd0917._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/[root-of-the-server]__851f6adb._.js +1 -1
  150. package/web/.next/server/chunks/ssr/[root-of-the-server]__86ff0bc5._.js +2 -2
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js +2 -2
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__92ffd5ee._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js +2 -2
  154. package/web/.next/server/chunks/ssr/[root-of-the-server]__b020c17d._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js +1 -1
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__b7b96453._.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js +1 -1
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__ba7f5873._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__c5e09f6f._.js.map +1 -1
  161. package/web/.next/server/chunks/ssr/_02e01240._.js +1 -1
  162. package/web/.next/server/chunks/ssr/_02e01240._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/_05c23ad9._.js +1 -1
  164. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/_073183f4._.js +3 -0
  166. package/web/.next/server/chunks/ssr/_073183f4._.js.map +1 -0
  167. package/web/.next/server/chunks/ssr/_16eb4fec._.js +1 -1
  168. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/_1879404a._.js +1 -1
  170. package/web/.next/server/chunks/ssr/_18886033._.js +1 -1
  171. package/web/.next/server/chunks/ssr/_18886033._.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/_1b7dae9a._.js +1 -1
  173. package/web/.next/server/chunks/ssr/_22e00a14._.js +1 -1
  174. package/web/.next/server/chunks/ssr/_22e00a14._.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/{_5119a3df._.js → _295fffde._.js} +2 -2
  176. package/web/.next/server/chunks/ssr/_295fffde._.js.map +1 -0
  177. package/web/.next/server/chunks/ssr/_301ec9cd._.js +3 -0
  178. package/web/.next/server/chunks/ssr/_301ec9cd._.js.map +1 -0
  179. package/web/.next/server/chunks/ssr/_43ba79e7._.js +1 -1
  180. package/web/.next/server/chunks/ssr/{_6f35fb9a._.js → _49b8d085._.js} +2 -2
  181. package/web/.next/server/chunks/ssr/{_6f35fb9a._.js.map → _49b8d085._.js.map} +1 -1
  182. package/web/.next/server/chunks/ssr/_4cbb7f95._.js +1 -1
  183. package/web/.next/server/chunks/ssr/_4cbb7f95._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/_56b9d60f._.js +1 -1
  185. package/web/.next/server/chunks/ssr/_56b9d60f._.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/_6abfa39e._.js +3 -0
  187. package/web/.next/server/chunks/ssr/_6abfa39e._.js.map +1 -0
  188. package/web/.next/server/chunks/ssr/_7476c702._.js +3 -0
  189. package/web/.next/server/chunks/ssr/_7476c702._.js.map +1 -0
  190. package/web/.next/server/chunks/ssr/_7cb0396e._.js +3 -0
  191. package/web/.next/server/chunks/ssr/_7cb0396e._.js.map +1 -0
  192. package/web/.next/server/chunks/ssr/_a5a5901d._.js +1 -1
  193. package/web/.next/server/chunks/ssr/_a5a5901d._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/_ad09f271._.js +1 -1
  195. package/web/.next/server/chunks/ssr/_ad09f271._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/_bb09579b._.js +1 -1
  197. package/web/.next/server/chunks/ssr/_c3f595c6._.js +1 -1
  198. package/web/.next/server/chunks/ssr/_c3f595c6._.js.map +1 -1
  199. package/web/.next/server/chunks/ssr/{_0020fddd._.js → _d9c0a97a._.js} +3 -3
  200. package/web/.next/server/chunks/ssr/_d9c0a97a._.js.map +1 -0
  201. package/web/.next/server/chunks/ssr/_e680c57c._.js +9 -0
  202. package/web/.next/server/chunks/ssr/_e680c57c._.js.map +1 -0
  203. package/web/.next/server/chunks/ssr/_ea9e1556._.js +1 -1
  204. package/web/.next/server/chunks/ssr/_ea9e1556._.js.map +1 -1
  205. package/web/.next/server/chunks/ssr/_f1ba9be6._.js +2 -2
  206. package/web/.next/server/chunks/ssr/_f1ba9be6._.js.map +1 -1
  207. package/web/.next/server/chunks/ssr/_f33cd07e._.js +2 -2
  208. package/web/.next/server/chunks/ssr/_f33cd07e._.js.map +1 -1
  209. package/web/.next/server/chunks/ssr/_f8b45233._.js +1 -1
  210. package/web/.next/server/chunks/ssr/_f8b45233._.js.map +1 -1
  211. package/web/.next/server/chunks/ssr/{_cd92091d._.js → _fa2b5770._.js} +3 -3
  212. package/web/.next/server/chunks/ssr/{_cd92091d._.js.map → _fa2b5770._.js.map} +1 -1
  213. package/web/.next/server/chunks/ssr/{_817ddf8a._.js → _fcb371cf._.js} +3 -3
  214. package/web/.next/server/chunks/ssr/{_817ddf8a._.js.map → _fcb371cf._.js.map} +1 -1
  215. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  216. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  217. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_global-chat-drawer-client_tsx_158c4b12._.js +1 -1
  218. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  219. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/node_modules__pnpm_63d47a3e._.js +3 -0
  221. package/web/.next/server/chunks/ssr/node_modules__pnpm_63d47a3e._.js.map +1 -0
  222. package/web/.next/server/chunks/ssr/node_modules__pnpm_747b43ac._.js +3 -0
  223. package/web/.next/server/chunks/ssr/node_modules__pnpm_747b43ac._.js.map +1 -0
  224. package/web/.next/server/chunks/ssr/node_modules__pnpm_ef15a0bd._.js +1 -1
  225. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  226. package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js +2 -2
  227. package/web/.next/server/chunks/ssr/src_presentation_web_app_features_feature-tree-page-client_tsx_34c5cbbf._.js.map +1 -1
  228. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js +1 -1
  229. package/web/.next/server/chunks/ssr/src_presentation_web_components_895e5bfa._.js.map +1 -1
  230. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +1 -1
  231. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  232. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  233. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js +1 -1
  234. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_skills_8a174cac._.js.map +1 -1
  235. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_tools_tools-page-client_tsx_3d0aa70c._.js +1 -1
  236. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_select_tsx_45d6b8ae._.js +1 -1
  237. package/web/.next/server/middleware-build-manifest.js +2 -2
  238. package/web/.next/server/pages/500.html +2 -2
  239. package/web/.next/server/server-reference-manifest.js +1 -1
  240. package/web/.next/server/server-reference-manifest.json +50 -50
  241. package/web/.next/static/chunks/0344938d662a2440.js +7 -0
  242. package/web/.next/static/chunks/{bb5400da64270df6.js → 1fbf99c66f70876a.js} +1 -1
  243. package/web/.next/static/chunks/{96b63a24ad83be21.js → 32cc9598462bc529.js} +1 -1
  244. package/web/.next/static/chunks/{641583aadf11b219.js → 3e6abcc7898927c4.js} +1 -1
  245. package/web/.next/static/chunks/46e2693dbc9262fd.js +5 -0
  246. package/web/.next/static/chunks/{453ad57269a1004f.js → 4e96a041339b3eea.js} +1 -1
  247. package/web/.next/static/chunks/{51bb2fb93740d2cb.js → 6444b4dbb7fc67b8.js} +3 -3
  248. package/web/.next/static/chunks/{ab5970241b29b648.js → 75ca9c3bb1f35926.js} +2 -2
  249. package/web/.next/static/chunks/8492d8e0b5f9a4e8.js +1 -0
  250. package/web/.next/static/chunks/84b480808bd74fa9.css +1 -0
  251. package/web/.next/static/chunks/98e3a7cf58fc912a.js +1 -0
  252. package/web/.next/static/chunks/{e5c06df7f30a05b9.js → a58034fbc0a805f5.js} +1 -1
  253. package/web/.next/static/chunks/{a1f976e9c8b07306.js → aa0c7fb5373222c5.js} +1 -1
  254. package/web/.next/static/chunks/b49ab0b290e9342d.js +1 -0
  255. package/web/.next/static/chunks/bb479c31b5b53bac.js +8 -0
  256. package/web/.next/static/chunks/{0658f5f58d5b60c5.js → bb74b02014e90cc2.js} +1 -1
  257. package/web/.next/static/chunks/c10c0d6d458453bc.js +1 -0
  258. package/web/.next/static/chunks/c4c2b76688bd4b5e.js +3 -0
  259. package/web/.next/static/chunks/d792e9886fad3e32.js +1 -0
  260. package/web/.next/static/chunks/{819d8097ac0ca319.js → e75bee22d11e18e7.js} +1 -1
  261. package/web/.next/static/chunks/{185e4f36cb6efb24.js → eb1ca1b0a34166f5.js} +1 -1
  262. package/web/.next/static/chunks/{4161d4663009140f.js → fb5e34b3b0dc3091.js} +1 -1
  263. package/web/.next/static/chunks/fc0232384ec2b48d.js +1 -0
  264. package/web/.next/static/chunks/{turbopack-b38a68b1b1c41a87.js → turbopack-fa58b7ea4a4b26e7.js} +1 -1
  265. package/web/.next/server/chunks/ssr/[root-of-the-server]__fa525872._.js +0 -3
  266. package/web/.next/server/chunks/ssr/[root-of-the-server]__fa525872._.js.map +0 -1
  267. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +0 -1
  268. package/web/.next/server/chunks/ssr/_068492bf._.js +0 -3
  269. package/web/.next/server/chunks/ssr/_068492bf._.js.map +0 -1
  270. package/web/.next/server/chunks/ssr/_5119a3df._.js.map +0 -1
  271. package/web/.next/server/chunks/ssr/_560f2971._.js +0 -3
  272. package/web/.next/server/chunks/ssr/_560f2971._.js.map +0 -1
  273. package/web/.next/server/chunks/ssr/_a963dd3c._.js +0 -3
  274. package/web/.next/server/chunks/ssr/_a963dd3c._.js.map +0 -1
  275. package/web/.next/server/chunks/ssr/_df737cce._.js +0 -3
  276. package/web/.next/server/chunks/ssr/_df737cce._.js.map +0 -1
  277. package/web/.next/server/chunks/ssr/_e3f14907._.js +0 -9
  278. package/web/.next/server/chunks/ssr/_e3f14907._.js.map +0 -1
  279. package/web/.next/server/chunks/ssr/_f535d854._.js +0 -3
  280. package/web/.next/server/chunks/ssr/_f535d854._.js.map +0 -1
  281. package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js +0 -3
  282. package/web/.next/server/chunks/ssr/node_modules__pnpm_1300ae39._.js.map +0 -1
  283. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_page-header_index_ts_bdf4db0b._.js +0 -3
  284. package/web/.next/server/chunks/ssr/src_presentation_web_components_common_page-header_index_ts_bdf4db0b._.js.map +0 -1
  285. package/web/.next/static/chunks/3e393d6a78b2ade4.js +0 -1
  286. package/web/.next/static/chunks/4559a403ee40dd19.js +0 -7
  287. package/web/.next/static/chunks/4855528484f00bd6.js +0 -1
  288. package/web/.next/static/chunks/4bacc77e3952f063.js +0 -3
  289. package/web/.next/static/chunks/5ed47e998707b519.js +0 -8
  290. package/web/.next/static/chunks/9f59ea29d6034111.js +0 -1
  291. package/web/.next/static/chunks/cc5fe8d1d9e1e519.js +0 -5
  292. package/web/.next/static/chunks/d5366257d6b9f855.js +0 -1
  293. package/web/.next/static/chunks/dcf8bb4389557a76.css +0 -1
  294. package/web/.next/static/chunks/f37a5e031a5d0f75.js +0 -1
  295. package/web/.next/static/chunks/f998b42b5cddafd6.js +0 -1
  296. /package/web/.next/static/{1awQPFeGEuNwpeu1Kgpxd → tmilUpJw1jXFkR4KRhyc-}/_buildManifest.js +0 -0
  297. /package/web/.next/static/{1awQPFeGEuNwpeu1Kgpxd → tmilUpJw1jXFkR4KRhyc-}/_clientMiddlewareManifest.json +0 -0
  298. /package/web/.next/static/{1awQPFeGEuNwpeu1Kgpxd → tmilUpJw1jXFkR4KRhyc-}/_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';