@shepai/cli 1.136.0-pr440.bb6800a → 1.136.0-pr443.863a0ce

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 (294) hide show
  1. package/apis/json-schema/Feature.yaml +0 -3
  2. package/apis/json-schema/SdlcLifecycle.yaml +0 -1
  3. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts +0 -2
  4. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts.map +1 -1
  5. package/dist/packages/core/src/domain/generated/output.d.ts +1 -6
  6. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  7. package/dist/packages/core/src/domain/generated/output.js +0 -1
  8. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/di/container.js +0 -10
  10. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +0 -1
  11. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +0 -6
  13. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  14. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +2 -7
  15. package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
  16. package/dist/src/presentation/cli/commands/feat/index.js +1 -5
  17. package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
  18. package/dist/src/presentation/cli/commands/feat/ls.command.js +0 -5
  19. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  20. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +1 -6
  21. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  22. package/dist/src/presentation/web/app/api/agent-events/route.js +0 -1
  23. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +0 -6
  25. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +1 -3
  26. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  27. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +1 -11
  28. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  29. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +2 -16
  30. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +0 -5
  31. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  32. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +1 -75
  33. package/dist/src/presentation/web/components/common/merge-review/diff-view.d.ts +3 -0
  34. package/dist/src/presentation/web/components/common/merge-review/diff-view.d.ts.map +1 -1
  35. package/dist/src/presentation/web/components/common/merge-review/diff-view.js +100 -17
  36. package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.d.ts +3 -1
  37. package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.d.ts.map +1 -1
  38. package/dist/src/presentation/web/components/common/merge-review/diff-view.stories.js +31 -1
  39. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  40. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +4 -13
  41. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts +0 -6
  42. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
  43. package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +0 -70
  44. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +0 -6
  45. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  46. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +2 -43
  47. package/dist/src/presentation/web/components/ui/file-tree.d.ts +39 -0
  48. package/dist/src/presentation/web/components/ui/file-tree.d.ts.map +1 -0
  49. package/dist/src/presentation/web/components/ui/file-tree.js +194 -0
  50. package/dist/src/presentation/web/components/ui/file-tree.stories.d.ts +14 -0
  51. package/dist/src/presentation/web/components/ui/file-tree.stories.d.ts.map +1 -0
  52. package/dist/src/presentation/web/components/ui/file-tree.stories.js +92 -0
  53. package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -1
  54. package/dist/src/presentation/web/hooks/sidebar-features-context.js +0 -1
  55. package/dist/src/presentation/web/hooks/use-graph-state.d.ts +1 -1
  56. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  57. package/dist/src/presentation/web/hooks/use-graph-state.js +2 -17
  58. package/dist/src/presentation/web/lib/derive-graph.d.ts +0 -4
  59. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
  60. package/dist/src/presentation/web/lib/derive-graph.js +0 -12
  61. package/dist/tsconfig.build.tsbuildinfo +1 -1
  62. package/package.json +1 -1
  63. package/web/.next/BUILD_ID +1 -1
  64. package/web/.next/build-manifest.json +2 -2
  65. package/web/.next/fallback-build-manifest.json +2 -2
  66. package/web/.next/prerender-manifest.json +3 -3
  67. package/web/.next/required-server-files.js +1 -1
  68. package/web/.next/required-server-files.json +1 -1
  69. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +50 -80
  70. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -2
  71. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  72. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  73. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +50 -80
  74. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  75. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  76. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +62 -92
  78. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
  79. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  80. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  81. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +62 -92
  82. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  83. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  84. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  85. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +46 -76
  86. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  87. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  88. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +50 -80
  90. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  91. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  92. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +62 -92
  94. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
  95. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  96. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  97. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +62 -92
  98. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
  99. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  100. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +46 -76
  102. package/web/.next/server/app/(dashboard)/page.js +2 -2
  103. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  104. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  105. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +46 -76
  106. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  107. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  108. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  109. package/web/.next/server/app/_global-error.html +2 -2
  110. package/web/.next/server/app/_global-error.rsc +1 -1
  111. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  112. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  113. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  114. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  115. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  116. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  117. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  118. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  120. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  121. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  122. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  123. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  124. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  126. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  127. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  129. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  130. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  131. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  132. package/web/.next/server/app/version/page.js.nft.json +1 -1
  133. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  134. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  135. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  136. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  137. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  138. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  139. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js +1 -1
  140. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
  141. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  142. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js +3 -0
  144. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js.map +1 -0
  145. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  146. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js +3 -0
  148. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js.map +1 -0
  149. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js +3 -0
  150. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js.map +1 -0
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  154. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__47ded061._.js +3 -0
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__47ded061._.js.map +1 -0
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__6882232d._.js +3 -0
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__6882232d._.js.map +1 -0
  159. package/web/.next/server/chunks/ssr/[root-of-the-server]__68ce373c._.js +3 -0
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__68ce373c._.js.map +1 -0
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__718766da._.js +3 -0
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__718766da._.js.map +1 -0
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js +2 -2
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js.map +1 -1
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdd058b2._.js +3 -0
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdd058b2._.js.map +1 -0
  175. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  176. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  177. package/web/.next/server/chunks/ssr/_2d94bed7._.js +4 -0
  178. package/web/.next/server/chunks/ssr/_2d94bed7._.js.map +1 -0
  179. package/web/.next/server/chunks/ssr/_67104d9e._.js +1 -1
  180. package/web/.next/server/chunks/ssr/_67104d9e._.js.map +1 -1
  181. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  182. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  183. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  184. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +1 -1
  185. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  187. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/_e69a26ba._.js +4 -0
  189. package/web/.next/server/chunks/ssr/_e69a26ba._.js.map +1 -0
  190. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  191. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  192. package/web/.next/server/chunks/ssr/_fefe070a._.js +3 -0
  193. package/web/.next/server/chunks/ssr/{_913fb649._.js.map → _fefe070a._.js.map} +1 -1
  194. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  195. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js +5 -0
  197. package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js.map +1 -0
  198. package/web/.next/server/chunks/ssr/{src_presentation_web_97dc2fb0._.js → src_presentation_web_8213e5ea._.js} +2 -2
  199. package/web/.next/server/chunks/ssr/{src_presentation_web_97dc2fb0._.js.map → src_presentation_web_8213e5ea._.js.map} +1 -1
  200. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js +3 -0
  201. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js.map +1 -0
  202. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  203. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  204. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  205. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  207. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  208. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  209. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  211. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_scroll-area_tsx_53ae5be7._.js +3 -0
  213. package/web/.next/server/chunks/ssr/src_presentation_web_components_ui_scroll-area_tsx_53ae5be7._.js.map +1 -0
  214. package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js +5 -0
  215. package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js.map +1 -0
  216. package/web/.next/server/pages/500.html +2 -2
  217. package/web/.next/server/server-reference-manifest.js +1 -1
  218. package/web/.next/server/server-reference-manifest.json +307 -463
  219. package/web/.next/static/chunks/{cd14232b3d8f5052.js → 13cb84d179d5b4ec.js} +1 -1
  220. package/web/.next/static/chunks/{3a7ff215d6a2c489.js → 15ac82422c6ff481.js} +2 -2
  221. package/web/.next/static/chunks/2a6fc81b4d79edd5.js +1 -0
  222. package/web/.next/static/chunks/{4b3e7454c2b07877.js → 311e3e6daae41529.js} +1 -1
  223. package/web/.next/static/chunks/4942206ecc6050b3.js +1 -0
  224. package/web/.next/static/chunks/66e554b3fb85d07b.js +1 -0
  225. package/web/.next/static/chunks/{dd8f2197640aea64.js → 6ce910f8eca9c744.js} +1 -1
  226. package/web/.next/static/chunks/72813fbc89b39798.js +1 -0
  227. package/web/.next/static/chunks/72fb66a9a892b323.js +1 -0
  228. package/web/.next/static/chunks/76fe6d79d9531082.js +1 -0
  229. package/web/.next/static/chunks/8445a8933ec13b8f.css +1 -0
  230. package/web/.next/static/chunks/9403c53377b1bfee.js +1 -0
  231. package/web/.next/static/chunks/{791e64500a080d4f.js → c2e2ff7e444af0fb.js} +1 -1
  232. package/web/.next/static/chunks/d7cf75b9d218a74a.js +1 -0
  233. package/web/.next/static/chunks/e49b53761421e978.js +2 -0
  234. package/web/.next/static/chunks/{fc442d957b35bd5e.js → ef02305e9eeeae2d.js} +1 -1
  235. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.d.ts +0 -20
  236. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.d.ts.map +0 -1
  237. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.js +0 -74
  238. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.d.ts +0 -20
  239. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.d.ts.map +0 -1
  240. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.js +0 -65
  241. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.d.ts +0 -12
  242. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.d.ts.map +0 -1
  243. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.js +0 -16
  244. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts +0 -18
  245. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts.map +0 -1
  246. package/dist/src/presentation/cli/commands/feat/archive.command.js +0 -54
  247. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts +0 -17
  248. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts.map +0 -1
  249. package/dist/src/presentation/cli/commands/feat/unarchive.command.js +0 -42
  250. package/dist/src/presentation/web/app/actions/archive-feature.d.ts +0 -6
  251. package/dist/src/presentation/web/app/actions/archive-feature.d.ts.map +0 -1
  252. package/dist/src/presentation/web/app/actions/archive-feature.js +0 -16
  253. package/dist/src/presentation/web/app/actions/unarchive-feature.d.ts +0 -6
  254. package/dist/src/presentation/web/app/actions/unarchive-feature.d.ts.map +0 -1
  255. package/dist/src/presentation/web/app/actions/unarchive-feature.js +0 -16
  256. package/web/.next/server/chunks/ssr/[root-of-the-server]__61564698._.js +0 -4
  257. package/web/.next/server/chunks/ssr/[root-of-the-server]__61564698._.js.map +0 -1
  258. package/web/.next/server/chunks/ssr/[root-of-the-server]__74ab160c._.js +0 -4
  259. package/web/.next/server/chunks/ssr/[root-of-the-server]__74ab160c._.js.map +0 -1
  260. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd16cded._.js +0 -4
  261. package/web/.next/server/chunks/ssr/[root-of-the-server]__bd16cded._.js.map +0 -1
  262. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +0 -3
  263. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +0 -1
  264. package/web/.next/server/chunks/ssr/[root-of-the-server]__f14fffe1._.js +0 -4
  265. package/web/.next/server/chunks/ssr/[root-of-the-server]__f14fffe1._.js.map +0 -1
  266. package/web/.next/server/chunks/ssr/_2fdfd9ab._.js +0 -4
  267. package/web/.next/server/chunks/ssr/_2fdfd9ab._.js.map +0 -1
  268. package/web/.next/server/chunks/ssr/_36059d08._.js +0 -4
  269. package/web/.next/server/chunks/ssr/_36059d08._.js.map +0 -1
  270. package/web/.next/server/chunks/ssr/_65f6e0e0._.js +0 -6
  271. package/web/.next/server/chunks/ssr/_65f6e0e0._.js.map +0 -1
  272. package/web/.next/server/chunks/ssr/_913fb649._.js +0 -3
  273. package/web/.next/server/chunks/ssr/_a51673dd._.js +0 -4
  274. package/web/.next/server/chunks/ssr/_a51673dd._.js.map +0 -1
  275. package/web/.next/server/chunks/ssr/_ae587066._.js +0 -4
  276. package/web/.next/server/chunks/ssr/_ae587066._.js.map +0 -1
  277. package/web/.next/server/chunks/ssr/_d162e30d._.js +0 -4
  278. package/web/.next/server/chunks/ssr/_d162e30d._.js.map +0 -1
  279. package/web/.next/server/chunks/ssr/_d763f022._.js +0 -6
  280. package/web/.next/server/chunks/ssr/_d763f022._.js.map +0 -1
  281. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +0 -3
  282. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +0 -1
  283. package/web/.next/static/chunks/2d6eb4409cc6324d.js +0 -1
  284. package/web/.next/static/chunks/688971d5bad5dc7c.js +0 -1
  285. package/web/.next/static/chunks/79c9871d46b22bf8.css +0 -1
  286. package/web/.next/static/chunks/7ee0606f698b032c.js +0 -1
  287. package/web/.next/static/chunks/87640f53f3bff3a6.js +0 -1
  288. package/web/.next/static/chunks/bb5bd1b5aafc70cd.js +0 -1
  289. package/web/.next/static/chunks/bf0a401666f990e2.js +0 -1
  290. package/web/.next/static/chunks/c4c3fcf18262b386.js +0 -2
  291. package/web/.next/static/chunks/d0dff217a94d4ee1.js +0 -1
  292. /package/web/.next/static/{JaRBeVSDLWZLQIl_k7ChK → 6xm4SoE6w_Z_XqNQlMkvd}/_buildManifest.js +0 -0
  293. /package/web/.next/static/{JaRBeVSDLWZLQIl_k7ChK → 6xm4SoE6w_Z_XqNQlMkvd}/_clientMiddlewareManifest.json +0 -0
  294. /package/web/.next/static/{JaRBeVSDLWZLQIl_k7ChK → 6xm4SoE6w_Z_XqNQlMkvd}/_ssgManifest.js +0 -0
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useMemo } from 'react';
3
- import { expect, fn, userEvent, waitFor, within } from '@storybook/test';
3
+ import { expect, fn, waitFor } from '@storybook/test';
4
4
  import { ReactFlowProvider, ReactFlow, useNodesState } from '@xyflow/react';
5
5
  import { DeploymentState, PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
6
6
  import { FeatureNode } from './feature-node.js';
@@ -213,16 +213,6 @@ const allStatesData = [
213
213
  agentType: 'claude-code',
214
214
  hasAgentRun: true,
215
215
  },
216
- {
217
- name: 'Old Dashboard',
218
- description: 'Previous iteration of the admin dashboard',
219
- featureId: '#f8',
220
- lifecycle: 'maintain',
221
- state: 'archived',
222
- progress: 100,
223
- repositoryPath: '/home/user/my-repo',
224
- branch: 'feat/old-dashboard',
225
- },
226
216
  ];
227
217
  export const AllStates = {
228
218
  render: () => (_jsx("div", { className: "flex flex-wrap gap-6", children: allStatesData.map((data) => (_jsx(FeatureNodeCanvas, { style: { width: 500, height: 350 }, data: data }, data.featureId))) })),
@@ -604,67 +594,3 @@ export const PendingWithStart = {
604
594
  },
605
595
  render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
606
596
  };
607
- export const Archived = {
608
- args: {
609
- name: 'Old Dashboard',
610
- description: 'Previous iteration of the admin dashboard',
611
- featureId: '#a1',
612
- lifecycle: 'maintain',
613
- state: 'archived',
614
- progress: 100,
615
- },
616
- render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
617
- };
618
- export const ArchivedWithUnarchive = {
619
- args: {
620
- name: 'Old Dashboard',
621
- description: 'Previous iteration of the admin dashboard',
622
- featureId: '#a2',
623
- lifecycle: 'maintain',
624
- state: 'archived',
625
- progress: 100,
626
- onUnarchive: fn(),
627
- },
628
- render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
629
- };
630
- export const DoneWithArchive = {
631
- args: {
632
- name: 'Completed Feature',
633
- description: 'A feature ready to be archived',
634
- featureId: '#ar1',
635
- lifecycle: 'maintain',
636
- state: 'done',
637
- progress: 100,
638
- runtime: '2h 30m',
639
- onArchive: fn(),
640
- onDelete: fn(),
641
- },
642
- render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
643
- };
644
- /** Shows the archive confirmation dialog in its open state. */
645
- export const ArchiveConfirmationDialog = {
646
- args: {
647
- name: 'Payment Gateway',
648
- description: 'Stripe integration for subscriptions',
649
- featureId: '#cd1',
650
- lifecycle: 'maintain',
651
- state: 'done',
652
- progress: 100,
653
- runtime: '1h 42m',
654
- onArchive: fn(),
655
- },
656
- render: (args) => _jsx(FeatureNodeCanvas, { data: args, style: { width: 600, height: 500 } }),
657
- play: async ({ canvasElement }) => {
658
- const canvas = within(canvasElement);
659
- // Hover over the node to reveal the archive button
660
- const card = await waitFor(() => canvas.getByTestId('feature-node-card'));
661
- await userEvent.hover(card);
662
- // Click the archive button to open the confirmation dialog
663
- const archiveButton = await waitFor(() => canvas.getByTestId('feature-node-archive-button'));
664
- await userEvent.click(archiveButton);
665
- // Verify the dialog is open
666
- await waitFor(() => {
667
- expect(document.querySelector('[role="alertdialog"]')).toBeTruthy();
668
- });
669
- },
670
- };
@@ -1,4 +1,7 @@
1
+ import { type TreeViewElement } from '../../ui/file-tree.js';
1
2
  import type { MergeReviewFileDiff } from './merge-review-config.js';
3
+ /** Build a tree structure from flat file paths. */
4
+ export declare function buildFileTree(fileDiffs: MergeReviewFileDiff[]): TreeViewElement[];
2
5
  export interface DiffViewProps {
3
6
  fileDiffs: MergeReviewFileDiff[];
4
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"diff-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/diff-view.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,uBAAuB,CAAC;AA4GtF,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,aAAa,kDAmBpD"}
1
+ {"version":3,"file":"diff-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/diff-view.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAsB,KAAK,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACrF,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,uBAAuB,CAAC;AAStF,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,SAAS,EAAE,mBAAmB,EAAE,GAAG,eAAe,EAAE,CAoCjF;AAoJD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,EAAE,aAAa,kDAkEpD"}
@@ -1,30 +1,113 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import { useState } from 'react';
4
- import { ChevronRight, FileText, FilePlus, FileMinus, FileEdit } from 'lucide-react';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useState, useMemo, useCallback } from 'react';
4
+ import { FileText, FilePlus, FileMinus, FileEdit } from 'lucide-react';
5
5
  import { cn } from '../../../lib/utils.js';
6
+ import { Tree, Folder, File } from '../../ui/file-tree.js';
6
7
  const STATUS_CONFIG = {
7
- added: { icon: FilePlus, label: 'A', className: 'text-green-600' },
8
- modified: { icon: FileEdit, label: 'M', className: 'text-amber-600' },
9
- deleted: { icon: FileMinus, label: 'D', className: 'text-red-600' },
10
- renamed: { icon: FileEdit, label: 'R', className: 'text-blue-600' },
8
+ added: { icon: FilePlus, className: 'text-green-600' },
9
+ modified: { icon: FileEdit, className: 'text-amber-600' },
10
+ deleted: { icon: FileMinus, className: 'text-red-600' },
11
+ renamed: { icon: FileEdit, className: 'text-blue-600' },
11
12
  };
12
- function FileStatusIcon({ status }) {
13
- const config = STATUS_CONFIG[status];
14
- const Icon = config.icon;
15
- return _jsx(Icon, { className: cn('h-3.5 w-3.5 shrink-0', config.className) });
13
+ /** Build a tree structure from flat file paths. */
14
+ export function buildFileTree(fileDiffs) {
15
+ const root = [];
16
+ for (const diff of fileDiffs) {
17
+ const parts = diff.path.split('/');
18
+ let currentLevel = root;
19
+ for (let i = 0; i < parts.length; i++) {
20
+ const part = parts[i];
21
+ const isFile = i === parts.length - 1;
22
+ const pathSoFar = parts.slice(0, i + 1).join('/');
23
+ const existing = currentLevel.find((el) => el.name === part && el.type === (isFile ? 'file' : 'folder'));
24
+ if (existing) {
25
+ if (!isFile && existing.children) {
26
+ currentLevel = existing.children;
27
+ }
28
+ }
29
+ else {
30
+ const node = {
31
+ id: pathSoFar,
32
+ name: part,
33
+ type: isFile ? 'file' : 'folder',
34
+ ...(isFile ? {} : { children: [] }),
35
+ };
36
+ currentLevel.push(node);
37
+ if (!isFile && node.children) {
38
+ currentLevel = node.children;
39
+ }
40
+ }
41
+ }
42
+ }
43
+ return collapseSingleChildFolders(root);
44
+ }
45
+ /** Collapse folders that contain only one child folder (e.g. src/components -> src/components). */
46
+ function collapseSingleChildFolders(elements) {
47
+ return elements.map((el) => {
48
+ if (el.type === 'folder' && el.children) {
49
+ const collapsed = collapseSingleChildFolders(el.children);
50
+ if (collapsed.length === 1 && collapsed[0].type === 'folder' && collapsed[0].children) {
51
+ return {
52
+ ...collapsed[0],
53
+ id: `${el.id}/${collapsed[0].name}`,
54
+ name: `${el.name}/${collapsed[0].name}`,
55
+ children: collapsed[0].children,
56
+ };
57
+ }
58
+ return { ...el, children: collapsed };
59
+ }
60
+ return el;
61
+ });
62
+ }
63
+ /** Count the total number of file descendants under an element. */
64
+ function countFiles(element) {
65
+ if (element.type === 'file')
66
+ return 1;
67
+ if (!element.children)
68
+ return 0;
69
+ return element.children.reduce((sum, child) => sum + countFiles(child), 0);
70
+ }
71
+ /** Get folder IDs for the first level of folders only (top-level). */
72
+ function getTopLevelFolderIds(elements) {
73
+ return elements.filter((el) => el.type === 'folder').map((el) => el.id);
16
74
  }
17
75
  function HunkView({ hunk }) {
18
76
  return (_jsxs("div", { className: "border-border border-t first:border-t-0", children: [_jsx("div", { className: "bg-muted/50 text-muted-foreground px-3 py-1 font-mono text-[10px]", children: hunk.header }), _jsx("div", { className: "font-mono text-[11px] leading-[18px]", children: hunk.lines.map((line) => (_jsxs("div", { className: cn('flex', line.type === 'added' && 'bg-green-50 dark:bg-green-950/30', line.type === 'removed' && 'bg-red-50 dark:bg-red-950/30'), children: [_jsx("span", { className: "text-muted-foreground w-10 shrink-0 px-1 text-right text-[10px] select-none", children: line.oldNumber ?? '' }), _jsx("span", { className: "text-muted-foreground w-10 shrink-0 px-1 text-right text-[10px] select-none", children: line.newNumber ?? '' }), _jsx("span", { className: cn('w-4 shrink-0 text-center select-none', line.type === 'added' && 'text-green-700 dark:text-green-400', line.type === 'removed' && 'text-red-700 dark:text-red-400'), children: line.type === 'added' ? '+' : line.type === 'removed' ? '-' : ' ' }), _jsx("span", { className: "min-w-0 flex-1 pr-2 break-all whitespace-pre-wrap", children: line.content })] }, `${line.type}-${line.oldNumber ?? ''}-${line.newNumber ?? ''}`))) })] }));
19
77
  }
20
- function FileDiffItem({ file }) {
21
- const [isOpen, setIsOpen] = useState(false);
22
- const fileName = file.path.split('/').pop() ?? file.path;
23
- const dirPath = file.path.includes('/') ? file.path.slice(0, file.path.lastIndexOf('/')) : '';
24
- return (_jsxs("div", { className: "border-border border-b last:border-b-0", children: [_jsxs("button", { type: "button", onClick: () => setIsOpen(!isOpen), className: "hover:bg-muted/50 flex w-full items-center gap-2 px-3 py-2 text-left", children: [_jsx(ChevronRight, { className: cn('text-muted-foreground h-3 w-3 shrink-0 transition-transform duration-150', isOpen && 'rotate-90') }), _jsx(FileStatusIcon, { status: file.status }), _jsx("span", { className: "text-foreground min-w-0 flex-1 truncate text-xs", children: dirPath ? (_jsxs(_Fragment, { children: [_jsxs("span", { className: "text-muted-foreground", children: [dirPath, "/"] }), fileName] })) : (fileName) }), file.oldPath ? (_jsxs("span", { className: "text-muted-foreground truncate text-[10px]", children: ["\u2190 ", file.oldPath.split('/').pop()] })) : null, _jsxs("span", { className: "shrink-0 text-[10px]", children: [file.additions > 0 ? _jsxs("span", { className: "text-green-600", children: ["+", file.additions] }) : null, file.additions > 0 && file.deletions > 0 ? ' ' : null, file.deletions > 0 ? _jsxs("span", { className: "text-red-600", children: ["-", file.deletions] }) : null] })] }), isOpen && file.hunks.length > 0 ? (_jsx("div", { className: "border-border overflow-x-auto border-t", children: file.hunks.map((hunk) => (_jsx(HunkView, { hunk: hunk }, hunk.header))) })) : null] }));
78
+ function DiffFileIcon({ status }) {
79
+ const config = STATUS_CONFIG[status];
80
+ const Icon = config.icon;
81
+ return _jsx(Icon, { className: cn('size-4 shrink-0', config.className) });
82
+ }
83
+ function DiffStats({ additions, deletions }) {
84
+ return (_jsxs("span", { className: "ml-auto shrink-0 text-[10px]", children: [additions > 0 ? _jsxs("span", { className: "text-green-600", children: ["+", additions] }) : null, additions > 0 && deletions > 0 ? ' ' : null, deletions > 0 ? _jsxs("span", { className: "text-red-600", children: ["-", deletions] }) : null] }));
85
+ }
86
+ function FileTreeNode({ element, diffMap, selectedFile, onSelectFile, }) {
87
+ if (element.type === 'folder' && element.children) {
88
+ const fileCount = countFiles(element);
89
+ return (_jsx(Folder, { value: element.id, element: `${element.name} (${fileCount})`, className: "text-muted-foreground", children: element.children.map((child) => (_jsx(FileTreeNode, { element: child, diffMap: diffMap, selectedFile: selectedFile, onSelectFile: onSelectFile }, child.id))) }, element.id));
90
+ }
91
+ const diff = diffMap.get(element.id);
92
+ const status = diff?.status ?? 'modified';
93
+ return (_jsx(File, { value: element.id, fileIcon: _jsx(DiffFileIcon, { status: status }), isSelect: selectedFile === element.id, handleSelect: onSelectFile, className: "w-full", children: _jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-1", children: [_jsx("span", { className: "truncate", children: element.name }), diff?.oldPath ? (_jsxs("span", { className: "text-muted-foreground truncate text-[10px]", children: ["\u2190 ", diff.oldPath.split('/').pop()] })) : null, diff ? _jsx(DiffStats, { additions: diff.additions, deletions: diff.deletions }) : null] }) }, element.id));
25
94
  }
26
95
  export function DiffView({ fileDiffs }) {
96
+ const [selectedFile, setSelectedFile] = useState(null);
97
+ const treeElements = useMemo(() => buildFileTree(fileDiffs), [fileDiffs]);
98
+ const topLevelFolderIds = useMemo(() => getTopLevelFolderIds(treeElements), [treeElements]);
99
+ const diffMap = useMemo(() => {
100
+ const map = new Map();
101
+ for (const diff of fileDiffs) {
102
+ map.set(diff.path, diff);
103
+ }
104
+ return map;
105
+ }, [fileDiffs]);
106
+ const handleSelectFile = useCallback((path) => {
107
+ setSelectedFile((prev) => (prev === path ? null : path));
108
+ }, []);
109
+ const selectedDiff = selectedFile ? diffMap.get(selectedFile) : null;
27
110
  if (fileDiffs.length === 0)
28
111
  return null;
29
- return (_jsxs("div", { className: "border-border rounded-lg border", children: [_jsx("div", { className: "px-4 py-3", children: _jsxs("div", { className: "mb-2 flex items-center gap-2", children: [_jsx(FileText, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changed Files" }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: ["(", fileDiffs.length, ")"] })] }) }), _jsx("div", { className: "border-border border-t", children: fileDiffs.map((file) => (_jsx(FileDiffItem, { file: file }, `${file.status}-${file.path}`))) })] }));
112
+ return (_jsxs("div", { className: "border-border rounded-lg border", children: [_jsx("div", { className: "px-4 py-3", children: _jsxs("div", { className: "mb-2 flex items-center gap-2", children: [_jsx(FileText, { className: "text-muted-foreground h-4 w-4" }), _jsx("span", { className: "text-foreground text-xs font-semibold", children: "Changed Files" }), _jsxs("span", { className: "text-muted-foreground text-[10px]", children: ["(", fileDiffs.length, ")"] })] }) }), _jsxs("div", { className: "border-border border-t", children: [_jsx("div", { className: "py-2", children: _jsx(Tree, { elements: treeElements, initialExpandedItems: topLevelFolderIds, indicator: true, sort: "none", className: "text-xs", children: treeElements.map((element) => (_jsx(FileTreeNode, { element: element, diffMap: diffMap, selectedFile: selectedFile, onSelectFile: handleSelectFile }, element.id))) }) }), selectedDiff && selectedDiff.hunks.length > 0 ? (_jsxs("div", { className: "border-border overflow-x-auto border-t", children: [_jsxs("div", { className: "bg-muted/30 flex items-center gap-2 px-3 py-1.5", children: [_jsx(DiffFileIcon, { status: selectedDiff.status }), _jsx("span", { className: "text-foreground font-mono text-xs", children: selectedDiff.path }), _jsx(DiffStats, { additions: selectedDiff.additions, deletions: selectedDiff.deletions })] }), selectedDiff.hunks.map((hunk) => (_jsx(HunkView, { hunk: hunk }, hunk.header)))] })) : null] })] }));
30
113
  }
@@ -3,7 +3,7 @@ import { DiffView } from './diff-view.js';
3
3
  declare const meta: Meta<typeof DiffView>;
4
4
  export default meta;
5
5
  type Story = StoryObj<typeof DiffView>;
6
- /** Default — multiple files with various change types. */
6
+ /** Default — multiple files with various change types shown in a file tree. */
7
7
  export declare const Default: Story;
8
8
  /** Single modified file. */
9
9
  export declare const SingleFile: Story;
@@ -15,4 +15,6 @@ export declare const OnlyDeletions: Story;
15
15
  export declare const RenamedFile: Story;
16
16
  /** Empty diff list — renders nothing. */
17
17
  export declare const EmptyDiffs: Story;
18
+ /** Root-level files without directory nesting. */
19
+ export declare const RootLevelFiles: Story;
18
20
  //# sourceMappingURL=diff-view.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"diff-view.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/diff-view.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA2HvC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,QAAQ,CAuB/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEvC,0DAA0D;AAC1D,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC"}
1
+ {"version":3,"file":"diff-view.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/merge-review/diff-view.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA2HvC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,QAAQ,CAuB/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,QAAQ,CAAC,CAAC;AAEvC,+EAA+E;AAC/E,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC;AAEF,4BAA4B;AAC5B,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,0BAA0B;AAC1B,eAAO,MAAM,aAAa,EAAE,KAI3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAIzB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,UAAU,EAAE,KAIxB,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,cAAc,EAAE,KA4B5B,CAAC"}
@@ -136,7 +136,7 @@ const meta = {
136
136
  ],
137
137
  };
138
138
  export default meta;
139
- /** Default — multiple files with various change types. */
139
+ /** Default — multiple files with various change types shown in a file tree. */
140
140
  export const Default = {
141
141
  args: {
142
142
  fileDiffs: sampleFiles,
@@ -172,3 +172,33 @@ export const EmptyDiffs = {
172
172
  fileDiffs: [],
173
173
  },
174
174
  };
175
+ /** Root-level files without directory nesting. */
176
+ export const RootLevelFiles = {
177
+ args: {
178
+ fileDiffs: [
179
+ {
180
+ path: 'package.json',
181
+ additions: 3,
182
+ deletions: 1,
183
+ status: 'modified',
184
+ hunks: [
185
+ {
186
+ header: '@@ -10,3 +10,5 @@',
187
+ lines: [
188
+ { type: 'context', content: ' "dependencies": {', oldNumber: 10, newNumber: 10 },
189
+ { type: 'added', content: ' "new-dep": "^1.0.0",', newNumber: 11 },
190
+ { type: 'context', content: ' }', oldNumber: 11, newNumber: 12 },
191
+ ],
192
+ },
193
+ ],
194
+ },
195
+ {
196
+ path: 'README.md',
197
+ additions: 10,
198
+ deletions: 0,
199
+ status: 'modified',
200
+ hunks: [],
201
+ },
202
+ ],
203
+ },
204
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAKpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAoYzF"}
1
+ {"version":3,"file":"control-center-inner.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-inner.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAY,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAuB5E,UAAU,uBAAuB;IAC/B,YAAY,EAAE,cAAc,EAAE,CAAC;IAC/B,YAAY,EAAE,IAAI,EAAE,CAAC;CACtB;AAED,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE,uBAAuB,2CAuWzF"}
@@ -1,10 +1,8 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
- import { Panel, useReactFlow } from '@xyflow/react';
6
- import { Eye, EyeOff } from 'lucide-react';
7
- import { cn } from '../../../lib/utils.js';
5
+ import { useReactFlow } from '@xyflow/react';
8
6
  import { FeaturesCanvas } from '../../features/features-canvas/index.js';
9
7
  import { useSidebarFeaturesContext, mapNodeStateToSidebarStatus, } from '../../../hooks/sidebar-features-context.js';
10
8
  import { useSelectedFeatureId } from '../../../hooks/use-selected-feature-id.js';
@@ -28,7 +26,7 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
28
26
  const { fitView } = useReactFlow();
29
27
  const drawerTimerRef = useRef(null);
30
28
  const { defaultViewport, onMoveEnd: handleViewportChange, resetViewport, } = useViewportPersistence();
31
- const { nodes, edges, onNodesChange, handleConnect, handleAddRepository, handleArchiveFeature, handleDeleteFeature, handleRetryFeature, handleStartFeature, handleStopFeature, handleUnarchiveFeature, handleDeleteRepository, createFeatureNode, showArchived, setShowArchived, setCallbacks, } = useControlCenterState(initialNodes, initialEdges);
29
+ const { nodes, edges, onNodesChange, handleConnect, handleAddRepository, handleDeleteFeature, handleRetryFeature, handleStartFeature, handleStopFeature, handleDeleteRepository, createFeatureNode, setCallbacks, } = useControlCenterState(initialNodes, initialEdges);
32
30
  // Publish sidebar features + repo state to context
33
31
  const { setFeatures: setSidebarFeatures, setHasRepositories: setSidebarHasRepos } = useSidebarFeaturesContext();
34
32
  const featureNodes = useMemo(() => nodes.filter((n) => n.type === 'featureNode'), [nodes]);
@@ -203,8 +201,6 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
203
201
  onRetryFeature: handleRetryFeature,
204
202
  onStartFeature: handleStartFeature,
205
203
  onStopFeature: handleStopFeature,
206
- onArchiveFeature: handleArchiveFeature,
207
- onUnarchiveFeature: handleUnarchiveFeature,
208
204
  onRepositoryAdd: handleAddFeatureToRepo,
209
205
  onRepositoryClick: handleRepositoryClick,
210
206
  onRepositoryDelete: handleDeleteRepository,
@@ -212,12 +208,10 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
212
208
  }, [
213
209
  setCallbacks,
214
210
  handleAddFeatureToFeature,
215
- handleArchiveFeature,
216
211
  handleDeleteFeature,
217
212
  handleRetryFeature,
218
213
  handleStartFeature,
219
214
  handleStopFeature,
220
- handleUnarchiveFeature,
221
215
  handleAddFeatureToRepo,
222
216
  handleRepositoryClick,
223
217
  handleDeleteRepository,
@@ -269,8 +263,5 @@ export function ControlCenterInner({ initialNodes, initialEdges }) {
269
263
  return nodes;
270
264
  return nodes.map((n) => n.type === 'repositoryNode' ? { ...n, data: { ...n.data, pulseAdd: true } } : n);
271
265
  }, [nodes, isCreateDrawerOpen]);
272
- const archiveToggle = (_jsx(Panel, { position: "top-right", children: _jsxs("button", { type: "button", "aria-label": showArchived ? 'Hide archived features' : 'Show archived features', "data-testid": "archive-toggle-button", onClick: () => setShowArchived(!showArchived), className: cn('bg-card flex items-center gap-1.5 rounded-md border px-2.5 py-1.5 text-xs font-medium shadow-sm transition-colors', showArchived
273
- ? 'border-primary/30 text-primary'
274
- : 'text-muted-foreground hover:text-foreground'), children: [showArchived ? _jsx(Eye, { className: "h-3.5 w-3.5" }) : _jsx(EyeOff, { className: "h-3.5 w-3.5" }), showArchived ? 'Archived visible' : 'Show archived'] }) }));
275
- return (_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? edges : [], selectedFeatureId: selectedFeatureId, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, onResetViewport: resetViewport, toolbar: archiveToggle, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: addRepoAndFocus }) }));
266
+ return (_jsx(FeaturesCanvas, { nodes: showCanvas ? displayNodes : [], edges: showCanvas ? edges : [], selectedFeatureId: selectedFeatureId, defaultViewport: defaultViewport, onNodesChange: onNodesChange, onConnect: handleConnect, onAddFeature: handleAddFeature, onNodeClick: handleNodeClick, onPaneClick: handleClearDrawers, onMoveEnd: handleMoveEnd, onResetViewport: resetViewport, emptyState: _jsx(ControlCenterEmptyState, { onRepositorySelect: addRepoAndFocus }) }));
276
267
  }
@@ -15,10 +15,4 @@ export declare const WithNodeActions: Story;
15
15
  * "Horizontal" to switch back.
16
16
  */
17
17
  export declare const DagreLayout: Story;
18
- /**
19
- * Canvas with active and archived features.
20
- * The archive toggle button appears in the top-right corner ("Show archived").
21
- * Click the toggle to reveal the dimmed archived feature node.
22
- */
23
- export declare const WithArchivedFeatures: Story;
24
18
  //# sourceMappingURL=control-center.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"control-center.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAkBpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0EnC,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAQ1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAS7B,CAAC;AAiIF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AA4DF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KASlC,CAAC"}
1
+ {"version":3,"file":"control-center.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,aAAa,CAkBpC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AA0EnC,eAAO,MAAM,KAAK,EAAE,KAKnB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAQ1B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAS7B,CAAC;AAiIF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,EAAE,KAKzB,CAAC"}
@@ -245,73 +245,3 @@ export const DagreLayout = {
245
245
  initialEdges: dagreLayoutedEdges,
246
246
  },
247
247
  };
248
- // --- Archive toggle stories ---
249
- const archiveRepoNode = {
250
- id: 'repo-archive',
251
- type: 'repositoryNode',
252
- position: { x: 50, y: 115 },
253
- data: { name: 'shep-ai/cli' },
254
- };
255
- const archivedFeatureNodes = [
256
- {
257
- id: 'feat-active',
258
- type: 'featureNode',
259
- position: { x: 400, y: 0 },
260
- data: {
261
- name: 'Auth Module',
262
- description: 'OAuth2 authentication flow',
263
- featureId: '#f1',
264
- lifecycle: 'implementation',
265
- state: 'running',
266
- progress: 65,
267
- repositoryPath: '/home/user/my-repo',
268
- branch: 'feat/auth-module',
269
- },
270
- },
271
- {
272
- id: 'feat-done',
273
- type: 'featureNode',
274
- position: { x: 400, y: 230 },
275
- data: {
276
- name: 'Payment Gateway',
277
- description: 'Stripe integration for subscriptions',
278
- featureId: '#f2',
279
- lifecycle: 'deploy',
280
- state: 'done',
281
- progress: 100,
282
- runtime: '1h 42m',
283
- repositoryPath: '/home/user/my-repo',
284
- branch: 'feat/payment-gateway',
285
- },
286
- },
287
- {
288
- id: 'feat-archived',
289
- type: 'featureNode',
290
- position: { x: 800, y: 115 },
291
- data: {
292
- name: 'Old Dashboard',
293
- description: 'Previous iteration of the admin dashboard',
294
- featureId: '#f3',
295
- lifecycle: 'maintain',
296
- state: 'archived',
297
- progress: 100,
298
- repositoryPath: '/home/user/my-repo',
299
- branch: 'feat/old-dashboard',
300
- },
301
- },
302
- ];
303
- /**
304
- * Canvas with active and archived features.
305
- * The archive toggle button appears in the top-right corner ("Show archived").
306
- * Click the toggle to reveal the dimmed archived feature node.
307
- */
308
- export const WithArchivedFeatures = {
309
- args: {
310
- initialNodes: [archiveRepoNode, ...archivedFeatureNodes],
311
- initialEdges: [
312
- { id: 'e-repo-active', source: 'repo-archive', target: 'feat-active', ...dashedEdge },
313
- { id: 'e-repo-done', source: 'repo-archive', target: 'feat-done', ...dashedEdge },
314
- { id: 'e-repo-archived', source: 'repo-archive', target: 'feat-archived', ...dashedEdge },
315
- ],
316
- },
317
- };
@@ -14,18 +14,12 @@ export interface ControlCenterState {
14
14
  repoPath: string;
15
15
  };
16
16
  handleLayout: (direction: LayoutDirection) => void;
17
- handleArchiveFeature: (featureId: string) => void;
18
17
  handleDeleteFeature: (featureId: string, cleanup?: boolean, cascadeDelete?: boolean, closePr?: boolean) => void;
19
18
  handleRetryFeature: (featureId: string) => void;
20
19
  handleStartFeature: (featureId: string) => void;
21
20
  handleStopFeature: (featureId: string) => void;
22
- handleUnarchiveFeature: (featureId: string) => void;
23
21
  handleDeleteRepository: (repositoryId: string) => Promise<void>;
24
22
  createFeatureNode: (sourceNodeId: string | null, dataOverride?: Partial<FeatureNodeData>, edgeType?: string) => string;
25
- /** Whether archived features are shown on the canvas. */
26
- showArchived: boolean;
27
- /** Toggle archived feature visibility. */
28
- setShowArchived: (show: boolean) => void;
29
23
  /** Stable lookup: repositoryPath for a feature node. */
30
24
  getFeatureRepositoryPath: (featureNodeId: string) => string | undefined;
31
25
  /** Stable lookup: repository data by nodeId. */
@@ -1 +1 @@
1
- {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAkBjC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM7E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,mBAAmB,EAAE,CACnB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,EACjB,aAAa,CAAC,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,OAAO,KACd,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sBAAsB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;IACZ,yDAAyD;IACzD,YAAY,EAAE,OAAO,CAAC;IACtB,0CAA0C;IAC1C,eAAe,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,wDAAwD;IACxD,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,gDAAgD;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,0EAA0E;IAC1E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAQD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAwkBpB"}
1
+ {"version":3,"file":"use-control-center-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/use-control-center-state.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,yBAAyB,CAAC;AAgBjC,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAM7E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,cAAc,CAAC,EAAE,KAAK,IAAI,CAAC;IAC/D,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,YAAY,EAAE,CAAC,SAAS,EAAE,eAAe,KAAK,IAAI,CAAC;IACnD,mBAAmB,EAAE,CACnB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,EACjB,aAAa,CAAC,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,OAAO,KACd,IAAI,CAAC;IACV,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,kBAAkB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,iBAAiB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,sBAAsB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,iBAAiB,EAAE,CACjB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,YAAY,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,EACvC,QAAQ,CAAC,EAAE,MAAM,KACd,MAAM,CAAC;IACZ,wDAAwD;IACxD,wBAAwB,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IACxE,gDAAgD;IAChD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,GAAG,SAAS,CAAC;IACtE,0EAA0E;IAC1E,YAAY,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;CACnD;AAQD,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,cAAc,EAAE,EAC9B,YAAY,EAAE,IAAI,EAAE,GACnB,kBAAkB,CAwhBpB"}
@@ -1,14 +1,12 @@
1
1
  'use client';
2
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { useCallback, useEffect, useMemo, useRef } from 'react';
3
3
  import { useRouter } from 'next/navigation';
4
4
  import { toast } from 'sonner';
5
5
  import { layoutWithDagre, CANVAS_LAYOUT_DEFAULTS, } from '../../../lib/layout-with-dagre.js';
6
- import { archiveFeature } from '../../../app/actions/archive-feature.js';
7
6
  import { deleteFeature } from '../../../app/actions/delete-feature.js';
8
7
  import { resumeFeature } from '../../../app/actions/resume-feature.js';
9
8
  import { startFeature } from '../../../app/actions/start-feature.js';
10
9
  import { stopFeature } from '../../../app/actions/stop-feature.js';
11
- import { unarchiveFeature } from '../../../app/actions/unarchive-feature.js';
12
10
  import { addRepository } from '../../../app/actions/add-repository.js';
13
11
  import { deleteRepository } from '../../../app/actions/delete-repository.js';
14
12
  import { getFeatureMetadata } from '../../../app/actions/get-feature-metadata.js';
@@ -27,9 +25,7 @@ export function useControlCenterState(initialNodes, initialEdges) {
27
25
  const router = useRouter();
28
26
  const deleteSound = useSoundAction('delete');
29
27
  const createSound = useSoundAction('create');
30
- // Archive toggle: persists during session, resets on page reload (FR-10)
31
- const [showArchived, setShowArchived] = useState(false);
32
- const { nodes, edges, reconcile, updateFeature, addPendingFeature, removeFeature, restoreFeature, addRepository: addRepositoryToMap, removeRepository, replaceRepository, getFeatureRepositoryPath, getRepositoryData, getRepoMapSize, setCallbacks, beginMutation, endMutation, isMutating, } = useGraphState(initialNodes, initialEdges, showArchived);
28
+ const { nodes, edges, reconcile, updateFeature, addPendingFeature, removeFeature, restoreFeature, addRepository: addRepositoryToMap, removeRepository, replaceRepository, getFeatureRepositoryPath, getRepositoryData, getRepoMapSize, setCallbacks, beginMutation, endMutation, isMutating, } = useGraphState(initialNodes, initialEdges);
33
29
  // Refs for stable access to latest nodes/edges without callback recreation
34
30
  const nodesRef = useRef(nodes);
35
31
  const edgesRef = useRef(edges);
@@ -283,39 +279,6 @@ export function useControlCenterState(initialNodes, initialEdges) {
283
279
  })
284
280
  .finally(() => endMutation());
285
281
  }, [beginMutation, endMutation]);
286
- const handleArchiveFeature = useCallback((featureId) => {
287
- beginMutation();
288
- archiveFeature(featureId)
289
- .then((result) => {
290
- if (result.error) {
291
- toast.error(result.error);
292
- }
293
- else {
294
- toast.success('Feature archived');
295
- }
296
- })
297
- .catch(() => {
298
- toast.error('Failed to archive feature');
299
- })
300
- .finally(() => endMutation());
301
- }, [beginMutation, endMutation]);
302
- const handleUnarchiveFeature = useCallback((featureId) => {
303
- beginMutation();
304
- unarchiveFeature(featureId)
305
- .then((result) => {
306
- if (result.error) {
307
- toast.error(result.error);
308
- }
309
- else {
310
- // The next poll/reconcile will restore the correct state and lifecycle
311
- toast.success('Feature unarchived');
312
- }
313
- })
314
- .catch(() => {
315
- toast.error('Failed to unarchive feature');
316
- })
317
- .finally(() => endMutation());
318
- }, [beginMutation, endMutation]);
319
282
  const handleDeleteFeature = useCallback((featureId, cleanup, cascadeDelete, closePr) => {
320
283
  const nodeId = `feat-${featureId}`;
321
284
  const shouldCascade = cascadeDelete === true;
@@ -492,17 +455,13 @@ export function useControlCenterState(initialNodes, initialEdges) {
492
455
  onNodesChange,
493
456
  handleConnect,
494
457
  handleAddRepository,
495
- handleArchiveFeature,
496
458
  handleLayout,
497
459
  handleDeleteFeature,
498
460
  handleRetryFeature,
499
461
  handleStartFeature,
500
462
  handleStopFeature,
501
- handleUnarchiveFeature,
502
463
  handleDeleteRepository,
503
464
  createFeatureNode,
504
- showArchived,
505
- setShowArchived,
506
465
  getFeatureRepositoryPath,
507
466
  getRepositoryData,
508
467
  setCallbacks,
@@ -0,0 +1,39 @@
1
+ import React from 'react';
2
+ import { Accordion as AccordionPrimitive } from 'radix-ui';
3
+ interface TreeViewElement {
4
+ id: string;
5
+ name: string;
6
+ type?: 'file' | 'folder';
7
+ isSelectable?: boolean;
8
+ children?: TreeViewElement[];
9
+ }
10
+ type TreeSortMode = 'default' | 'none' | ((a: TreeViewElement, b: TreeViewElement) => number);
11
+ declare const Tree: React.ForwardRefExoticComponent<{
12
+ initialSelectedId?: string;
13
+ indicator?: boolean;
14
+ elements?: TreeViewElement[];
15
+ initialExpandedItems?: string[];
16
+ openIcon?: React.ReactNode;
17
+ closeIcon?: React.ReactNode;
18
+ sort?: TreeSortMode;
19
+ } & Omit<Omit<AccordionPrimitive.AccordionSingleProps & React.RefAttributes<HTMLDivElement>, "ref"> | Omit<AccordionPrimitive.AccordionMultipleProps & React.RefAttributes<HTMLDivElement>, "ref">, "type" | "value" | "defaultValue" | "onValueChange"> & React.RefAttributes<HTMLDivElement>>;
20
+ declare const Folder: React.ForwardRefExoticComponent<{
21
+ expandedItems?: string[];
22
+ element: string;
23
+ isSelectable?: boolean;
24
+ isSelect?: boolean;
25
+ } & Omit<AccordionPrimitive.AccordionItemProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.HTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
26
+ declare const File: React.ForwardRefExoticComponent<{
27
+ value: string;
28
+ handleSelect?: (id: string) => void;
29
+ isSelectable?: boolean;
30
+ isSelect?: boolean;
31
+ fileIcon?: React.ReactNode;
32
+ } & React.ButtonHTMLAttributes<HTMLButtonElement> & React.RefAttributes<HTMLButtonElement>>;
33
+ declare const CollapseButton: React.ForwardRefExoticComponent<{
34
+ elements: TreeViewElement[];
35
+ expandAll?: boolean;
36
+ } & React.HTMLAttributes<HTMLButtonElement> & React.RefAttributes<HTMLButtonElement>>;
37
+ export { CollapseButton, File, Folder, Tree, type TreeViewElement };
38
+ export type { TreeSortMode };
39
+ //# sourceMappingURL=file-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-tree.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/ui/file-tree.tsx"],"names":[],"mappings":"AAEA,OAAO,KAON,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,IAAI,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAO3D,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;CAC9B;AAED,KAAK,YAAY,GAAG,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,eAAe,KAAK,MAAM,CAAC,CAAC;AAsH9F,QAAA,MAAM,IAAI;wBAZY,MAAM;gBACd,OAAO;eACR,eAAe,EAAE;2BACL,MAAM,EAAE;eACpB,KAAK,CAAC,SAAS;gBACd,KAAK,CAAC,SAAS;WACpB,YAAY;+RA4GpB,CAAC;AA+BF,QAAA,MAAM,MAAM;oBANM,MAAM,EAAE;aACf,MAAM;mBACA,OAAO;eACX,OAAO;0KAuDnB,CAAC;AAIF,QAAA,MAAM,IAAI;WAGC,MAAM;mBACE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI;mBACpB,OAAO;eACX,OAAO;eACP,KAAK,CAAC,SAAS;2FA6C7B,CAAC;AAIF,QAAA,MAAM,cAAc;cAGN,eAAe,EAAE;gBACf,OAAO;qFAmDrB,CAAC;AAIH,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,eAAe,EAAE,CAAC;AACpE,YAAY,EAAE,YAAY,EAAE,CAAC"}