@shepai/cli 1.135.2 → 1.135.3-pr425.d3fbb75

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 (227) hide show
  1. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.d.ts.map +1 -1
  2. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/evidence.node.js +2 -1
  3. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.d.ts.map +1 -1
  4. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/fast-implement.node.js +1 -23
  5. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +6 -1
  6. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  7. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +22 -2
  8. package/dist/src/presentation/web/app/actions/check-agent-auth.d.ts +2 -0
  9. package/dist/src/presentation/web/app/actions/check-agent-auth.d.ts.map +1 -1
  10. package/dist/src/presentation/web/app/actions/check-agent-auth.js +8 -1
  11. package/dist/src/presentation/web/app/actions/check-tool-status.d.ts +14 -0
  12. package/dist/src/presentation/web/app/actions/check-tool-status.d.ts.map +1 -0
  13. package/dist/src/presentation/web/app/actions/check-tool-status.js +53 -0
  14. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  15. package/dist/src/presentation/web/app/build-graph-nodes.js +1 -9
  16. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +17 -0
  17. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  18. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +91 -0
  19. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  20. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +54 -64
  21. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  22. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +85 -19
  23. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +6 -4
  25. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
  26. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +35 -9
  27. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.d.ts +17 -1
  28. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.d.ts.map +1 -1
  29. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.js +110 -1
  30. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  31. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +1 -1
  32. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts +1 -0
  33. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts.map +1 -1
  34. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +443 -10
  35. package/dist/src/presentation/web/lib/layout-with-dagre.js +1 -1
  36. package/dist/tsconfig.build.tsbuildinfo +1 -1
  37. package/package.json +1 -1
  38. package/web/.next/BUILD_ID +1 -1
  39. package/web/.next/build-manifest.json +2 -2
  40. package/web/.next/fallback-build-manifest.json +2 -2
  41. package/web/.next/prerender-manifest.json +3 -3
  42. package/web/.next/required-server-files.js +3 -3
  43. package/web/.next/required-server-files.json +3 -3
  44. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +63 -48
  45. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
  46. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +63 -48
  49. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  50. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  51. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  52. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +75 -60
  53. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
  54. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  55. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  56. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +75 -60
  57. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  58. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  59. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +59 -44
  61. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  62. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  63. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  64. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +63 -48
  65. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  66. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  67. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  68. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +75 -60
  69. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
  70. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  71. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +75 -60
  73. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  74. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  75. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +59 -44
  77. package/web/.next/server/app/(dashboard)/page.js +3 -3
  78. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  79. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +59 -44
  81. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  82. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  83. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/_global-error.html +2 -2
  85. package/web/.next/server/app/_global-error.rsc +1 -1
  86. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  87. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  88. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  89. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  90. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  91. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  92. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  93. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  94. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  95. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  96. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  97. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  98. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  99. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  101. package/web/.next/server/app/skills/page.js +1 -1
  102. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  103. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  104. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  105. package/web/.next/server/app/tools/page.js +1 -1
  106. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  107. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  108. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  109. package/web/.next/server/app/version/page.js.nft.json +1 -1
  110. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  111. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  112. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  113. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  114. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js +3 -0
  115. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js.map +1 -0
  116. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  117. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js +3 -0
  119. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js.map +1 -0
  120. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js +3 -0
  121. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js.map +1 -0
  122. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/{[root-of-the-server]__31bc28da._.js → [root-of-the-server]__47ded061._.js} +2 -2
  127. package/web/.next/server/chunks/ssr/{[root-of-the-server]__31bc28da._.js.map → [root-of-the-server]__47ded061._.js.map} +1 -1
  128. package/web/.next/server/chunks/ssr/{[root-of-the-server]__32ecbed9._.js → [root-of-the-server]__68ce373c._.js} +2 -2
  129. package/web/.next/server/chunks/ssr/{[root-of-the-server]__90f9ae71._.js.map → [root-of-the-server]__68ce373c._.js.map} +1 -1
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js +3 -0
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js.map +1 -0
  132. package/web/.next/server/chunks/ssr/{[root-of-the-server]__90f9ae71._.js → [root-of-the-server]__718766da._.js} +2 -2
  133. package/web/.next/server/chunks/ssr/{[root-of-the-server]__90ce4b6d._.js.map → [root-of-the-server]__718766da._.js.map} +1 -1
  134. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  135. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/{[root-of-the-server]__96670392._.js → [root-of-the-server]__a5f9c6e5._.js} +3 -3
  137. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js.map +1 -0
  138. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  139. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  140. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js +1 -1
  141. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js.map +1 -1
  142. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +3 -0
  143. package/web/.next/server/chunks/ssr/{[root-of-the-server]__7894f27f._.js.map → [root-of-the-server]__d48c5b11._.js.map} +1 -1
  144. package/web/.next/server/chunks/ssr/{[root-of-the-server]__90ce4b6d._.js → [root-of-the-server]__fdd058b2._.js} +2 -2
  145. package/web/.next/server/chunks/ssr/{[root-of-the-server]__32ecbed9._.js.map → [root-of-the-server]__fdd058b2._.js.map} +1 -1
  146. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  147. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  148. package/web/.next/server/chunks/ssr/_0ef7c505._.js +3 -0
  149. package/web/.next/server/chunks/ssr/_0ef7c505._.js.map +1 -0
  150. package/web/.next/server/chunks/ssr/{_69699ffe._.js → _40c2d506._.js} +2 -2
  151. package/web/.next/server/chunks/ssr/_40c2d506._.js.map +1 -0
  152. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  153. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  154. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  155. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +1 -1
  156. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  157. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/_e69a26ba._.js +4 -0
  159. package/web/.next/server/chunks/ssr/_e69a26ba._.js.map +1 -0
  160. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  161. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  163. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  164. package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js +5 -0
  165. package/web/.next/server/chunks/ssr/{src_presentation_web_b9023017._.js.map → src_presentation_web_53666118._.js.map} +1 -1
  166. package/web/.next/server/chunks/ssr/{src_presentation_web_731afe96._.js → src_presentation_web_8ac280c1._.js} +2 -2
  167. package/web/.next/server/chunks/ssr/{src_presentation_web_731afe96._.js.map → src_presentation_web_8ac280c1._.js.map} +1 -1
  168. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js +3 -0
  169. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js.map +1 -0
  170. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  171. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  173. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  175. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  176. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  177. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  179. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js +5 -0
  181. package/web/.next/server/chunks/ssr/{src_presentation_web_8e7fe0d1._.js.map → src_presentation_web_e4df6dd7._.js.map} +1 -1
  182. package/web/.next/server/pages/500.html +2 -2
  183. package/web/.next/server/server-reference-manifest.js +1 -1
  184. package/web/.next/server/server-reference-manifest.json +374 -296
  185. package/web/.next/static/chunks/3831dbe7ff6d5717.js +1 -0
  186. package/web/.next/static/chunks/{d54a9af6cc2a0c58.js → 5240821573a037e3.js} +1 -1
  187. package/web/.next/static/chunks/{88a7aed01a628019.js → 6df4c57bc78a94a7.js} +1 -1
  188. package/web/.next/static/chunks/74a9d144a3e27ce2.js +1 -0
  189. package/web/.next/static/chunks/8e293101ac271df2.js +1 -0
  190. package/web/.next/static/chunks/92cd6f523639a6fa.css +1 -0
  191. package/web/.next/static/chunks/{567a5fd9bc141bde.js → 99351a301567a88e.js} +1 -1
  192. package/web/.next/static/chunks/99630cd36967c04f.js +1 -0
  193. package/web/.next/static/chunks/a381d542a7ec04d9.js +2 -0
  194. package/web/.next/static/chunks/{52bbd5a4f8ff74bd.js → b4e468a0f9370e0f.js} +1 -1
  195. package/web/.next/static/chunks/{321178bb6199a3e1.js → b5545c62e743df83.js} +2 -2
  196. package/web/.next/static/chunks/{d4fbedd39504661f.js → b966410b4e88dba6.js} +1 -1
  197. package/web/.next/static/chunks/{39302cb19904d221.js → c80e7077c2e15d7a.js} +1 -1
  198. package/web/.next/static/chunks/d0dff217a94d4ee1.js +1 -0
  199. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +0 -3
  200. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +0 -1
  201. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +0 -3
  202. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +0 -1
  203. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +0 -3
  204. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +0 -1
  205. package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js +0 -3
  206. package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js.map +0 -1
  207. package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js +0 -3
  208. package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js.map +0 -1
  209. package/web/.next/server/chunks/ssr/_1f958cbc._.js +0 -3
  210. package/web/.next/server/chunks/ssr/_1f958cbc._.js.map +0 -1
  211. package/web/.next/server/chunks/ssr/_69699ffe._.js.map +0 -1
  212. package/web/.next/server/chunks/ssr/_b6960ca0._.js +0 -4
  213. package/web/.next/server/chunks/ssr/_b6960ca0._.js.map +0 -1
  214. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +0 -5
  215. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +0 -3
  216. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +0 -1
  217. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +0 -5
  218. package/web/.next/static/chunks/314b8314f77d6921.js +0 -1
  219. package/web/.next/static/chunks/3d1b728f59ca0ae6.js +0 -1
  220. package/web/.next/static/chunks/3e2d7d07926b05bf.css +0 -1
  221. package/web/.next/static/chunks/52d2796a174182a7.js +0 -1
  222. package/web/.next/static/chunks/6709ec190dbf8098.js +0 -1
  223. package/web/.next/static/chunks/9e13ad97d9c1c52a.js +0 -2
  224. package/web/.next/static/chunks/ddb9106ee55ddb62.js +0 -1
  225. /package/web/.next/static/{yv0Tq9-BtqVnENafaiFF6 → 49taRTn4m6kJfWu7WRS6O}/_buildManifest.js +0 -0
  226. /package/web/.next/static/{yv0Tq9-BtqVnENafaiFF6 → 49taRTn4m6kJfWu7WRS6O}/_clientMiddlewareManifest.json +0 -0
  227. /package/web/.next/static/{yv0Tq9-BtqVnENafaiFF6 → 49taRTn4m6kJfWu7WRS6O}/_ssgManifest.js +0 -0
@@ -2,42 +2,30 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState } from 'react';
4
4
  import { Handle, Position } from '@xyflow/react';
5
- import { Plus, FileText, Wrench, GitMerge, Trash2, Zap, Loader2, Globe, RotateCcw, Play, } from 'lucide-react';
5
+ import { Plus, Trash2, Zap, Loader2, Globe, RotateCcw, Play, Eye, } from 'lucide-react';
6
6
  import { cn } from '../../../lib/utils.js';
7
7
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
8
8
  import { DeleteFeatureDialog } from '../../common/delete-feature-dialog/index.js';
9
- import { featureNodeStateConfig, lifecycleDisplayLabels, lifecycleRunningVerbs, } from './feature-node-state-config.js';
10
- import { getAgentTypeIcon, agentTypeLabels } from './agent-type-icons.js';
11
- import { getModelMeta } from '../../../lib/model-metadata.js';
9
+ import { featureNodeStateConfig, lifecycleRunningVerbs, lifecyclePhaseBadge, } from './feature-node-state-config.js';
10
+ import { getAgentTypeIcon } from './agent-type-icons.js';
12
11
  import { DeploymentState } from '../../../../../../packages/core/src/domain/generated/output.js';
13
- import { FeatureSessionsDropdown } from './feature-sessions-dropdown.js';
14
12
  function AgentIcon({ agentType, className }) {
15
13
  const IconComponent = getAgentTypeIcon(agentType);
16
14
  return _jsx(IconComponent, { className: className });
17
15
  }
18
16
  function getBadgeIcon(data) {
19
17
  const config = featureNodeStateConfig[data.state];
20
- if (data.state === 'action-required') {
21
- if (data.lifecycle === 'requirements')
22
- return FileText;
23
- if (data.lifecycle === 'implementation')
24
- return Wrench;
25
- if (data.lifecycle === 'review')
26
- return GitMerge;
27
- }
28
18
  return config.icon;
29
19
  }
30
- /** Returns override badge classes for action-required based on lifecycle phase. */
31
- function getActionRequiredBadgeClasses(data) {
32
- if (data.state !== 'action-required')
33
- return null;
34
- if (data.lifecycle === 'implementation') {
35
- return { badgeClass: 'text-indigo-700', badgeBgClass: 'bg-indigo-50' };
36
- }
37
- if (data.lifecycle === 'review') {
38
- return { badgeClass: 'text-emerald-700', badgeBgClass: 'bg-emerald-50' };
39
- }
40
- return null; // requirements stays amber (default)
20
+ /** Short, friendly label for each action-required gate. */
21
+ function getActionRequiredLabel(data) {
22
+ if (data.lifecycle === 'requirements')
23
+ return 'Review Requirements';
24
+ if (data.lifecycle === 'implementation')
25
+ return 'Review Technical Plan';
26
+ if (data.lifecycle === 'review')
27
+ return 'Review Changes';
28
+ return 'Review';
41
29
  }
42
30
  function getBadgeText(data) {
43
31
  const config = featureNodeStateConfig[data.state];
@@ -53,13 +41,7 @@ function getBadgeText(data) {
53
41
  case 'pending':
54
42
  return 'Pending';
55
43
  case 'action-required':
56
- if (data.lifecycle === 'requirements')
57
- return 'Review Product Requirements';
58
- if (data.lifecycle === 'implementation')
59
- return 'Review Technical Planning';
60
- if (data.lifecycle === 'review')
61
- return 'Review Merge Request';
62
- return config.label;
44
+ return getActionRequiredLabel(data);
63
45
  case 'error':
64
46
  return data.errorMessage ?? 'Something went wrong';
65
47
  default:
@@ -76,40 +58,48 @@ export function FeatureNode({ data, selected, }) {
76
58
  }, className: "bg-card text-muted-foreground hover:border-destructive hover:text-destructive flex h-7 w-7 cursor-pointer items-center justify-center rounded-full border shadow-sm transition-colors", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Delete feature" })] }) }) }), _jsx(DeleteFeatureDialog, { open: confirmOpen, onOpenChange: setConfirmOpen, onConfirm: (cleanup, cascadeDelete, closePr) => {
77
59
  setConfirmOpen(false);
78
60
  data.onDelete?.(data.featureId, cleanup, cascadeDelete, closePr);
79
- }, isDeleting: false, featureName: data.name ?? 'this feature', featureId: data.featureId, hasChildren: data.hasChildren, hasOpenPr: !!data.pr && data.pr.status === 'Open' })] })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' || data.state === 'deleting' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-72 cursor-pointer flex-col rounded-lg border p-3 shadow-sm', selected && 'ring-primary ring-2', data.state === 'deleting' && 'opacity-60'), children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { "data-testid": "feature-node-lifecycle-label", className: cn('text-[10px] font-semibold tracking-wider'), children: data.state === 'blocked'
80
- ? 'BLOCKED'
81
- : data.state === 'pending'
82
- ? 'PENDING'
83
- : lifecycleDisplayLabels[data.lifecycle] }), _jsxs("div", { className: "flex items-center gap-0.5", children: [data.deployment ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": data.deployment.status === DeploymentState.Booting
84
- ? 'Deploying'
85
- : 'Open dev server', "data-testid": "feature-node-deployment-indicator", onClick: (e) => {
61
+ }, isDeleting: false, featureName: data.name ?? 'this feature', featureId: data.featureId, hasChildren: data.hasChildren, hasOpenPr: !!data.pr && data.pr.status === 'Open' })] })) : null, _jsxs("div", { "data-testid": "feature-node-card", "aria-busy": data.state === 'creating' || data.state === 'deleting' ? 'true' : undefined, className: cn('bg-card flex min-h-35 w-97 cursor-pointer flex-col rounded-lg border p-3 shadow-sm dark:bg-neutral-800/80', data.state === 'action-required' && 'border-amber-300/60 dark:border-amber-700/40', selected && 'ring-primary ring-2', data.state === 'deleting' && 'opacity-60'), children: [data.state !== 'creating' ? (_jsx("div", { className: "absolute top-3 right-4", children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { "data-testid": "feature-node-phase-badge", className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-[10px]", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("span", { className: cn('h-1.5 w-1.5 -translate-y-px rounded-full', lifecyclePhaseBadge[data.lifecycle].dot) })] }) }), _jsxs(TooltipContent, { side: "bottom", className: "max-w-56 bg-white text-neutral-900 shadow-lg dark:bg-neutral-100 dark:text-neutral-900", children: [_jsx("p", { className: "font-semibold", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("p", { className: "mt-1 text-xs leading-relaxed text-neutral-500", children: lifecyclePhaseBadge[data.lifecycle].description })] })] }) }) })) : null, _jsxs("div", { className: "flex items-center gap-1.5", children: [data.agentType ? (_jsx(AgentIcon, { agentType: data.agentType, className: "h-4 w-4 shrink-0" })) : null, _jsx("h3", { className: "min-w-0 truncate text-sm font-bold", children: data.name })] }), data.description ? (_jsx("p", { "data-testid": "feature-node-description", className: "text-muted-foreground mt-1 line-clamp-2 text-xs", children: data.description })) : null, _jsxs("div", { className: "mt-auto pt-2", children: [config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground flex items-center justify-end text-[10px]", children: _jsxs("span", { children: [data.progress, "%"] }) }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : null, !config.showProgressBar &&
62
+ ![
63
+ 'deleting',
64
+ 'creating',
65
+ 'running',
66
+ 'done',
67
+ 'action-required',
68
+ 'pending',
69
+ 'blocked',
70
+ ].includes(data.state) ? (_jsxs("div", { "data-testid": "feature-node-badge", className: "relative flex min-w-0 items-center gap-1.5 text-xs", children: [(() => {
71
+ const BadgeIcon = getBadgeIcon(data);
72
+ return _jsx(BadgeIcon, { className: cn('h-3.5 w-3.5 shrink-0', config.badgeClass) });
73
+ })(), _jsx("span", { className: cn('translate-y-px truncate text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : null, _jsxs("div", { className: "mt-1.5 flex min-h-[26px] items-center justify-between gap-2", children: [_jsxs("div", { className: "flex items-center gap-1.5", style: { transform: 'translateY(1px)' }, children: [data.featureId ? (_jsxs("div", { className: "flex items-baseline gap-1", children: [_jsx("span", { className: "text-muted-foreground/50 text-[10px]", children: "ID" }), _jsx("button", { type: "button", "data-testid": "feature-node-id", className: "nodrag text-muted-foreground/60 hover:text-muted-foreground cursor-pointer font-mono text-[10px] transition-colors", onClick: (e) => {
86
74
  e.stopPropagation();
87
- if (data.deployment?.status === DeploymentState.Ready &&
88
- data.deployment.url) {
89
- window.open(data.deployment.url, '_blank', 'noopener,noreferrer');
90
- }
91
- }, className: cn('nodrag -mt-1 p-1', data.deployment.status === DeploymentState.Ready && data.deployment.url
92
- ? 'cursor-pointer opacity-80 transition-opacity hover:opacity-100'
93
- : 'cursor-default'), children: data.deployment.status === DeploymentState.Booting ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin text-blue-500" })) : (_jsx(Globe, { className: "h-3.5 w-3.5 text-green-600" })) }) }), _jsx(TooltipContent, { side: "bottom", children: data.deployment.status === DeploymentState.Booting
94
- ? 'Deploying...'
95
- : (data.deployment.url ?? 'Live') })] }) })) : null, data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", className: "-mt-1 p-1", children: _jsx(Zap, { className: "h-3.5 w-3.5 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "bottom", children: "Fast Mode" })] }) })) : null, data.agentType ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": agentTypeLabels[data.agentType] ?? data.agentType, "data-testid": "feature-node-agent-badge", onClick: (e) => {
96
- e.stopPropagation();
97
- data.onSettings?.();
98
- }, className: cn('nodrag -mt-1 -mr-1 p-1', data.onSettings
99
- ? 'cursor-pointer opacity-80 transition-opacity hover:opacity-100'
100
- : 'cursor-default'), children: _jsx(AgentIcon, { agentType: data.agentType, className: "h-3.5 w-3.5" }) }) }), _jsxs(TooltipContent, { side: "bottom", children: [_jsx("span", { className: "font-medium", children: agentTypeLabels[data.agentType] ?? data.agentType }), data.modelId ? (_jsxs("span", { className: "ml-1 opacity-70", children: ["\u00B7 ", getModelMeta(data.modelId).displayName || data.modelId] })) : null] })] }) })) : null] })] }), _jsx("h3", { className: "mt-1 truncate text-sm font-bold", children: data.name }), data.description ? (_jsx("p", { "data-testid": "feature-node-description", className: "text-muted-foreground mt-0.5 truncate text-xs", children: data.description })) : null, _jsx("div", { className: "mt-auto pt-2", children: data.state === 'deleting' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(Trash2, { className: "h-3.5 w-3.5 shrink-0 text-gray-400" }), _jsx("span", { className: "text-muted-foreground", children: "Deleting\u2026" })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "motion-safe:animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : data.state === 'creating' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "motion-safe:animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : data.state === 'running' ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "mt-1.5 flex items-center gap-1.5 text-xs", children: [_jsx(AgentIcon, { agentType: data.agentType, className: "h-3.5 w-3.5 shrink-0" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: "animate-indeterminate-progress bg-foreground/30 h-full w-1/3 rounded-full" }) })] })) : config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground flex items-center justify-end text-[10px]", children: _jsxs("span", { children: [data.progress, "%"] }) }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-[10px]", children: [_jsx("span", { children: data.featureId }), (data.worktreePath ?? data.repositoryPath) ? (_jsx(FeatureSessionsDropdown, { repositoryPath: data.worktreePath ?? data.repositoryPath })) : null] }), _jsxs("div", { className: "mt-1.5 flex items-center gap-1.5", children: [_jsxs("div", { "data-testid": "feature-node-badge", className: (() => {
101
- const override = getActionRequiredBadgeClasses(data);
102
- return cn('flex min-w-0 flex-1 items-center justify-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium', override?.badgeBgClass ?? config.badgeBgClass, override?.badgeClass ?? config.badgeClass);
103
- })(), children: [(() => {
104
- const BadgeIcon = getBadgeIcon(data);
105
- return _jsx(BadgeIcon, { className: "h-3.5 w-3.5 shrink-0" });
106
- })(), _jsx("span", { className: "truncate", children: getBadgeText(data) })] }), data.state === 'error' && data.onRetry ? (_jsxs("button", { type: "button", "aria-label": "Retry feature", "data-testid": "feature-node-retry-button", onClick: (e) => {
107
- e.stopPropagation();
108
- data.onRetry(data.featureId);
109
- }, className: "nodrag flex shrink-0 cursor-pointer items-center gap-1 rounded-full bg-red-100 px-2.5 py-1 text-[11px] font-medium text-red-700 transition-colors hover:bg-red-200", children: [_jsx(RotateCcw, { className: "h-3 w-3" }), "Retry"] })) : null, data.state === 'pending' && data.onStart ? (_jsxs("button", { type: "button", "aria-label": "Start feature", "data-testid": "feature-node-start-button", onClick: (e) => {
110
- e.stopPropagation();
111
- data.onStart(data.featureId);
112
- }, className: "nodrag flex shrink-0 cursor-pointer items-center gap-1 rounded-full bg-slate-100 px-2.5 py-1 text-[11px] font-medium text-slate-700 transition-colors hover:bg-slate-200", children: [_jsx(Play, { className: "h-3 w-3" }), "Start"] })) : null] })] })) })] }), data.onAction && data.state !== 'deleting' ? (_jsx(Handle, { type: "source", position: Position.Right, className: "h-0! w-0! border-0! bg-transparent!", style: { top: 70 }, children: _jsx("button", { type: "button", "aria-label": "Add", "data-testid": "feature-node-action-button", onClick: (e) => {
75
+ navigator.clipboard.writeText(data.featureId);
76
+ }, title: `Click to copy: ${data.featureId}`, children: data.featureId.slice(0, 6) })] })) : null, data.deployment ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": data.deployment.status === DeploymentState.Booting
77
+ ? 'Deploying'
78
+ : 'Open dev server', "data-testid": "feature-node-deployment-indicator", onClick: (e) => {
79
+ e.stopPropagation();
80
+ if (data.deployment?.status === DeploymentState.Ready &&
81
+ data.deployment.url) {
82
+ window.open(data.deployment.url, '_blank', 'noopener,noreferrer');
83
+ }
84
+ }, className: cn('nodrag', data.deployment.status === DeploymentState.Ready && data.deployment.url
85
+ ? 'cursor-pointer opacity-80 transition-opacity hover:opacity-100'
86
+ : 'cursor-default'), children: data.deployment.status === DeploymentState.Booting ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin text-blue-500" })) : (_jsx(Globe, { className: "h-3 w-3 text-green-600" })) }) }), _jsx(TooltipContent, { side: "top", children: data.deployment.status === DeploymentState.Booting
87
+ ? 'Deploying...'
88
+ : (data.deployment.url ?? 'Live') })] }) })) : null, data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", children: _jsx(Zap, { className: "h-3 w-3 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "top", children: "Fast Mode" })] }) })) : null] }), data.state === 'deleting' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-gray-400" }), _jsx("span", { className: "text-muted-foreground", children: "Deleting\u2026" })] })) : data.state === 'creating' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] })) : data.state === 'running' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin" }), _jsx("span", { className: "text-muted-foreground", children: getBadgeText(data) })] })) : data.state === 'action-required' ? (_jsxs("button", { type: "button", "aria-label": getActionRequiredLabel(data), "data-testid": "feature-node-approve-button",
89
+ // eslint-disable-next-line @typescript-eslint/no-empty-function -- click bubbles to card's onNodeClick
90
+ onClick: () => { }, className: "nodrag relative inline-flex shrink-0 cursor-pointer items-center gap-1.5 overflow-hidden rounded-md bg-gradient-to-b from-neutral-800 via-neutral-900 to-neutral-950 px-3 py-1.5 text-[11px] font-semibold transition-all hover:from-neutral-700 hover:via-neutral-800 hover:to-neutral-900 active:from-neutral-900 active:to-black", children: [_jsx("span", { className: "animate-shimmer pointer-events-none absolute inset-0 bg-gradient-to-r from-transparent via-white/15 to-transparent bg-[length:200%_100%]" }), _jsx(Eye, { className: "relative h-3 w-3 text-amber-400" }), _jsx("span", { className: "animate-shimmer relative bg-gradient-to-r from-amber-400 via-yellow-200 to-amber-400 bg-[length:200%_100%] bg-clip-text text-transparent", children: getActionRequiredLabel(data) })] })) : data.state === 'error' && data.onRetry ? (_jsxs("button", { type: "button", "aria-label": "Retry", "data-testid": "feature-node-retry-button", onClick: (e) => {
91
+ e.stopPropagation();
92
+ data.onRetry(data.featureId);
93
+ }, className: "nodrag inline-flex shrink-0 cursor-pointer items-center gap-1 rounded-md bg-neutral-800 px-2.5 py-1 text-[11px] font-medium text-white shadow-sm transition-all hover:bg-neutral-700 active:bg-neutral-900 dark:bg-neutral-200 dark:text-neutral-900 dark:hover:bg-neutral-300", children: [_jsx(RotateCcw, { className: "h-3 w-3" }), "Retry"] })) : data.state === 'blocked' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", "data-testid": "feature-node-badge", children: [(() => {
94
+ const BadgeIcon = getBadgeIcon(data);
95
+ return _jsx(BadgeIcon, { className: cn('h-3.5 w-3.5 shrink-0', config.badgeClass) });
96
+ })(), _jsx("span", { className: cn('truncate text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : data.state === 'done' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", "data-testid": "feature-node-badge", children: [(() => {
97
+ const BadgeIcon = getBadgeIcon(data);
98
+ return _jsx(BadgeIcon, { className: cn('h-3.5 w-3.5 shrink-0', config.badgeClass) });
99
+ })(), _jsx("span", { className: cn('text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : data.state === 'pending' && data.onStart ? (_jsxs("button", { type: "button", "aria-label": "Start", "data-testid": "feature-node-start-button", onClick: (e) => {
100
+ e.stopPropagation();
101
+ data.onStart(data.featureId);
102
+ }, className: "nodrag inline-flex shrink-0 cursor-pointer items-center gap-1 rounded-md bg-neutral-800 px-2.5 py-1 text-[11px] font-medium text-white shadow-sm transition-all hover:bg-neutral-700 active:bg-neutral-900 dark:bg-neutral-200 dark:text-neutral-900 dark:hover:bg-neutral-300", children: [_jsx(Play, { className: "h-3 w-3" }), "Start"] })) : null] })] })] }), data.onAction && data.state !== 'deleting' ? (_jsx(Handle, { type: "source", position: Position.Right, className: "h-0! w-0! border-0! bg-transparent!", style: { top: 70 }, children: _jsx("button", { type: "button", "aria-label": "Add", "data-testid": "feature-node-action-button", onClick: (e) => {
113
103
  e.stopPropagation();
114
104
  data.onAction?.();
115
105
  }, className: "nodrag absolute top-1/2 left-1/2 flex h-6 w-6 -translate-x-1/2 -translate-y-1/2 cursor-pointer items-center justify-center rounded-full bg-blue-500 text-white opacity-0 shadow-md transition-opacity group-hover:opacity-100 hover:bg-blue-600", children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) })) : data.showHandles ? (_jsx(Handle, { type: "source", position: Position.Right, isConnectable: false, className: "opacity-0!", style: { top: 70 } })) : null] }));
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAiCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAc/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AA0HF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAYF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AA2EF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAUvC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAY5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAatB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAY/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,KAe5C,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC"}
1
+ {"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAMvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAoCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAqB/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAqLF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAYF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AA2EF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAUvC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAY5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAatB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAY/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,KAe5C,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC"}
@@ -2,13 +2,13 @@ import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { useMemo } from 'react';
3
3
  import { expect, fn, waitFor } from '@storybook/test';
4
4
  import { ReactFlowProvider, ReactFlow, useNodesState } from '@xyflow/react';
5
- import { DeploymentState } from '../../../../../../packages/core/src/domain/generated/output.js';
5
+ import { DeploymentState, PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
6
6
  import { FeatureNode } from './feature-node.js';
7
7
  const nodeTypes = { featureNode: FeatureNode };
8
8
  /** Renders a single FeatureNode as a proper React Flow node (with node wrapper + pointer events). */
9
9
  function FeatureNodeCanvas({ data, style = { width: 600, height: 400 }, }) {
10
10
  const nodes = useMemo(() => [{ id: 'node-1', type: 'featureNode', position: { x: 0, y: 0 }, data }], [data]);
11
- return (_jsx("div", { style: style, children: _jsx(ReactFlowProvider, { children: _jsx(ReactFlow, { nodes: nodes, nodeTypes: nodeTypes, nodesDraggable: false, nodesConnectable: false, proOptions: { hideAttribution: true }, fitView: true }) }) }));
11
+ return (_jsx("div", { style: style, children: _jsx(ReactFlowProvider, { children: _jsx(ReactFlow, { nodes: nodes, nodeTypes: nodeTypes, nodesDraggable: false, nodesConnectable: false, panOnDrag: false, zoomOnScroll: false, proOptions: { hideAttribution: true }, fitView: true, className: "[&_.react-flow__pane]:!cursor-default" }) }) }));
12
12
  }
13
13
  const meta = {
14
14
  title: 'Composed/FeatureNode',
@@ -19,10 +19,17 @@ const meta = {
19
19
  args: {
20
20
  name: 'Auth Module',
21
21
  description: 'Implement OAuth2 authentication flow',
22
- featureId: '#f1',
23
- lifecycle: 'requirements',
22
+ featureId: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
23
+ lifecycle: 'implementation',
24
24
  state: 'running',
25
25
  progress: 45,
26
+ agentType: 'claude-code',
27
+ modelId: 'claude-sonnet-4-6',
28
+ repositoryPath: '/home/user/my-repo',
29
+ repositoryName: 'my-repo',
30
+ branch: 'feat/auth-module',
31
+ hasAgentRun: true,
32
+ hasPlan: true,
26
33
  },
27
34
  };
28
35
  export default meta;
@@ -32,66 +39,92 @@ export const Default = {
32
39
  const allStatesData = [
33
40
  {
34
41
  name: 'User Onboarding',
35
- description: 'Implement guided onboarding wizard',
42
+ description: 'Implement guided onboarding wizard with step-by-step tutorial',
36
43
  featureId: '',
37
44
  lifecycle: 'requirements',
38
45
  state: 'creating',
39
46
  progress: 0,
40
47
  repositoryPath: '/home/user/my-repo',
48
+ repositoryName: 'my-repo',
41
49
  branch: '',
42
50
  },
43
51
  {
44
52
  name: 'Auth Module',
45
- description: 'Implement OAuth2 authentication flow',
46
- featureId: '#f1',
53
+ description: 'Implement OAuth2 authentication flow with SSO support',
54
+ featureId: '11111111-1111-1111-1111-111111111111',
47
55
  lifecycle: 'implementation',
48
56
  state: 'running',
49
57
  progress: 45,
50
58
  agentType: 'claude-code',
51
59
  modelId: 'claude-sonnet-4-6',
52
60
  repositoryPath: '/home/user/my-repo',
61
+ repositoryName: 'my-repo',
53
62
  branch: 'feat/auth-module',
63
+ worktreePath: '/home/user/.shep/repos/abc123/wt/feat-auth-module',
64
+ hasAgentRun: true,
65
+ hasPlan: true,
66
+ deployment: { status: DeploymentState.Ready, url: 'http://localhost:3001' },
54
67
  },
55
68
  {
56
69
  name: 'API Rate Limiting',
57
- description: 'Implement sliding window rate limiting for public...',
58
- featureId: '#bi1',
70
+ description: 'Implement sliding window rate limiting for public endpoints',
71
+ featureId: '22222222-2222-2222-2222-222222222222',
59
72
  lifecycle: 'requirements',
60
73
  state: 'action-required',
61
74
  progress: 22,
62
75
  agentType: 'claude-code',
63
76
  modelId: 'claude-sonnet-4-6',
64
77
  repositoryPath: '/home/user/my-repo',
78
+ repositoryName: 'my-repo',
65
79
  branch: 'feat/api-rate-limiting',
80
+ worktreePath: '/home/user/.shep/repos/abc123/wt/feat-api-rate-limiting',
81
+ hasAgentRun: true,
82
+ hasPlan: true,
66
83
  },
67
84
  {
68
85
  name: 'Data Pipeline',
69
86
  description: 'ETL pipeline for analytics dashboard',
70
- featureId: '#bi2',
87
+ featureId: '33333333-3333-3333-3333-333333333333',
71
88
  lifecycle: 'implementation',
72
89
  state: 'action-required',
73
90
  progress: 40,
74
91
  agentType: 'cursor',
75
92
  modelId: 'claude-opus-4-6',
76
93
  repositoryPath: '/home/user/my-repo',
94
+ repositoryName: 'my-repo',
77
95
  branch: 'feat/data-pipeline',
96
+ worktreePath: '/home/user/.shep/repos/abc123/wt/feat-data-pipeline',
97
+ hasAgentRun: true,
98
+ hasPlan: true,
99
+ deployment: { status: DeploymentState.Booting },
78
100
  },
79
101
  {
80
102
  name: 'Merge Review',
81
103
  description: 'PR ready for merge approval',
82
- featureId: '#bi3',
104
+ featureId: '44444444-4444-4444-4444-444444444444',
83
105
  lifecycle: 'review',
84
106
  state: 'action-required',
85
107
  progress: 90,
86
108
  agentType: 'gemini-cli',
87
109
  modelId: 'gemini-2.5-pro',
88
110
  repositoryPath: '/home/user/my-repo',
111
+ repositoryName: 'my-repo',
89
112
  branch: 'feat/merge-review',
113
+ worktreePath: '/home/user/.shep/repos/abc123/wt/feat-merge-review',
114
+ hasAgentRun: true,
115
+ hasPlan: true,
116
+ pr: {
117
+ url: 'https://github.com/user/my-repo/pull/87',
118
+ number: 87,
119
+ status: PrStatus.Open,
120
+ ciStatus: CiStatus.Success,
121
+ mergeable: true,
122
+ },
90
123
  },
91
124
  {
92
125
  name: 'Payment Gateway',
93
126
  description: 'Stripe integration for subscriptions',
94
- featureId: '#f3',
127
+ featureId: '55555555-5555-5555-5555-555555555555',
95
128
  lifecycle: 'deploy',
96
129
  state: 'done',
97
130
  progress: 100,
@@ -99,12 +132,24 @@ const allStatesData = [
99
132
  agentType: 'claude-code',
100
133
  modelId: 'claude-sonnet-4-6',
101
134
  repositoryPath: '/home/user/my-repo',
135
+ repositoryName: 'my-repo',
102
136
  branch: 'feat/payment-gateway',
137
+ worktreePath: '/home/user/.shep/repos/abc123/wt/feat-payment-gateway',
138
+ fastMode: true,
139
+ hasAgentRun: true,
140
+ hasPlan: true,
141
+ pr: {
142
+ url: 'https://github.com/user/my-repo/pull/85',
143
+ number: 85,
144
+ status: PrStatus.Merged,
145
+ ciStatus: CiStatus.Success,
146
+ },
147
+ deployment: { status: DeploymentState.Ready, url: 'http://localhost:3002' },
103
148
  },
104
149
  {
105
150
  name: 'Search Index',
106
151
  description: 'Elasticsearch full-text search setup',
107
- featureId: '#f4',
152
+ featureId: '66666666-6666-6666-6666-666666666666',
108
153
  lifecycle: 'implementation',
109
154
  state: 'blocked',
110
155
  progress: 20,
@@ -112,40 +157,61 @@ const allStatesData = [
112
157
  agentType: 'claude-code',
113
158
  modelId: 'claude-opus-4-6',
114
159
  repositoryPath: '/home/user/my-repo',
160
+ repositoryName: 'my-repo',
115
161
  branch: 'feat/search-index',
162
+ worktreePath: '/home/user/.shep/repos/abc123/wt/feat-search-index',
163
+ hasAgentRun: true,
164
+ hasPlan: true,
116
165
  },
117
166
  {
118
167
  name: 'Email Service',
119
168
  description: 'Transactional email with SendGrid',
120
- featureId: '#f5',
169
+ featureId: '77777777-7777-7777-7777-777777777777',
121
170
  lifecycle: 'review',
122
171
  state: 'error',
123
172
  progress: 30,
124
- errorMessage: 'Build failed: type mismatch',
125
- agentType: 'dev',
126
- modelId: 'gpt-8',
173
+ errorMessage: 'Build failed: Cannot find module @sendgrid/mail',
174
+ agentType: 'aider',
175
+ modelId: 'claude-sonnet-4-6',
127
176
  repositoryPath: '/home/user/my-repo',
177
+ repositoryName: 'my-repo',
128
178
  branch: 'feat/email-service',
179
+ worktreePath: '/home/user/.shep/repos/abc123/wt/feat-email-service',
180
+ hasAgentRun: true,
181
+ hasPlan: true,
182
+ pr: {
183
+ url: 'https://github.com/user/my-repo/pull/86',
184
+ number: 86,
185
+ status: PrStatus.Open,
186
+ ciStatus: CiStatus.Failure,
187
+ },
188
+ onRetry: fn(),
129
189
  },
130
190
  {
131
191
  name: 'Notification Service',
132
192
  description: 'Push notification integration',
133
- featureId: '#f7',
193
+ featureId: '88888888-8888-8888-8888-888888888888',
134
194
  lifecycle: 'pending',
135
195
  state: 'pending',
136
196
  progress: 0,
137
197
  repositoryPath: '/home/user/my-repo',
198
+ repositoryName: 'my-repo',
138
199
  branch: 'feat/notification-service',
200
+ onStart: fn(),
139
201
  },
140
202
  {
141
203
  name: 'Legacy API Cleanup',
142
204
  description: 'Remove deprecated REST endpoints',
143
- featureId: '#f6',
205
+ featureId: '99999999-9999-9999-9999-999999999999',
144
206
  lifecycle: 'implementation',
145
207
  state: 'deleting',
146
208
  progress: 0,
147
209
  repositoryPath: '/home/user/my-repo',
210
+ repositoryName: 'my-repo',
148
211
  branch: 'feat/legacy-api-cleanup',
212
+ worktreePath: '/home/user/.shep/repos/abc123/wt/feat-legacy-api-cleanup',
213
+ agentType: 'claude-code',
214
+ hasAgentRun: true,
149
215
  },
150
216
  ];
151
217
  export const AllStates = {
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CA2Z5F"}
1
+ {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAAE,IAAI,EAAE,EAAE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,2CAqa5F"}
@@ -71,15 +71,17 @@ export function RepositoryNode({ data }) {
71
71
  e.stopPropagation();
72
72
  data.onClick?.();
73
73
  }
74
- }, className: "nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm", children: [_jsxs("div", { className: "flex items-center gap-3 px-4 py-3", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, onCreateFromSession: handleCreateFromSession })] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
74
+ }, className: "nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm dark:bg-neutral-800/80", children: [_jsxs("div", { className: "flex items-center gap-3 px-4 py-3", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, onCreateFromSession: handleCreateFromSession })] })) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { "aria-label": "Add feature", "data-testid": "repository-node-add-button", onClick: (e) => {
75
75
  e.stopPropagation();
76
76
  data.onAdd?.();
77
77
  }, className: cn('text-muted-foreground hover:bg-accent dark:hover:bg-accent/50 flex h-6 w-6 shrink-0 cursor-pointer items-center justify-center rounded-full transition-colors hover:text-blue-500', data.pulseAdd &&
78
- 'animate-pulse-cta bg-blue-100 text-blue-500 dark:bg-blue-900/40'), children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Add feature" })] }) })) : null] })] }), data.branch ? (_jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-git-info", className: "text-muted-foreground border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-3 text-xs", children: [_jsxs("span", { className: "flex items-center gap-1 truncate", "data-testid": "repository-node-branch", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "truncate", children: data.branch })] }), data.behindCount != null && data.behindCount > 0 ? (_jsxs("span", { className: "flex shrink-0 items-center gap-1 whitespace-nowrap text-amber-500", "data-testid": "repository-node-behind", children: [_jsx(ArrowDown, { className: "h-3 w-3 shrink-0" }), data.behindCount, " behind"] })) : null] }) }), data.commitMessage ? (_jsx("div", { "data-testid": "repository-node-commit-info", className: "text-muted-foreground border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(GitCommitHorizontal, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate", "data-testid": "repository-node-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("span", { className: "text-muted-foreground/70 ml-auto flex shrink-0 items-center gap-1", "data-testid": "repository-node-committer", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: data.committer })] })) : null] }) })) : null] })) : data.gitInfoStatus === 'not-a-repo' ? (
78
+ 'animate-pulse-cta bg-blue-100 text-blue-500 dark:bg-blue-900/40'), children: _jsx(Plus, { className: "h-3.5 w-3.5" }) }) }), _jsx(TooltipContent, { children: "Add feature" })] }) })) : null] })] }), data.branch ? (_jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-git-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-3 text-xs", children: [_jsxs("span", { className: "flex items-center gap-1 truncate", "data-testid": "repository-node-branch", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "truncate", children: data.branch })] }), data.behindCount != null && data.behindCount > 0 ? (_jsxs("span", { className: "flex shrink-0 items-center gap-1 whitespace-nowrap text-amber-500", "data-testid": "repository-node-behind", children: [_jsx(ArrowDown, { className: "h-3 w-3 shrink-0" }), data.behindCount, " behind"] })) : null] }) }), data.commitMessage ? (_jsx("div", { "data-testid": "repository-node-commit-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(GitCommitHorizontal, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate", "data-testid": "repository-node-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("span", { className: "text-muted-foreground/70 ml-auto flex shrink-0 items-center gap-1", "data-testid": "repository-node-committer", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: data.committer })] })) : null] }) })) : null] })) : data.gitInfoStatus === 'not-a-repo' ? (
79
79
  /* Not a git repo — two rows for consistency with loading/ready states */
80
- _jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-not-repo", className: "text-muted-foreground border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(FolderOpen, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate opacity-60", children: data.repositoryPath ?? 'Unknown path' })] }) }), _jsx("div", { className: "text-muted-foreground border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs opacity-40", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: "Not a git repository" })] }) })] })) : data.gitInfoStatus !== 'ready' ? (
80
+ _jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-not-repo", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(FolderOpen, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate opacity-60", children: data.repositoryPath ?? 'Unknown path' })] }) }), _jsx("div", { className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs opacity-40", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: "Not a git repository" })] }) })] })) : data.gitInfoStatus !== 'ready' ? (
81
81
  /* Loading — show skeleton placeholders for both rows */
82
- _jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-git-loading", className: "border-t px-4 py-2", children: _jsxs("div", { className: "flex h-4 items-center gap-2 text-xs", children: [_jsx(GitBranch, { className: "text-muted-foreground h-3 w-3 shrink-0" }), _jsx("span", { className: "bg-muted h-3 w-20 animate-pulse rounded" })] }) }), _jsx("div", { className: "border-t px-4 py-2", children: _jsxs("div", { className: "flex h-4 items-center gap-2 text-xs", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3 w-3 shrink-0" }), _jsx("span", { className: "bg-muted h-3 w-36 animate-pulse rounded" })] }) })] })) : null, featureFlags.envDeploy && data.repositoryPath ? (_jsx("div", { "data-testid": "repository-node-dev-preview", className: "border-t px-4 py-2", onClick: (e) => e.stopPropagation(), children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [deployAction.deployError ? (_jsx("span", { className: "truncate text-xs text-red-500", children: deployAction.deployError })) : isDeploymentActive ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "mr-0.5 inline-block h-2 w-2 shrink-0 rounded-full bg-green-500" }), deployAction.url ? (_jsx("a", { href: deployAction.url, target: "_blank", rel: "noopener noreferrer", className: "truncate text-green-700 hover:underline dark:text-green-400", children: deployAction.url })) : (_jsx("span", { className: "text-muted-foreground", children: "Starting..." }))] })) : (_jsxs("span", { className: "text-muted-foreground", children: ["Run", _jsx("span", { className: "text-muted-foreground/50 ml-2 text-[10px]", children: "start local environment" })] })), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "ml-auto flex items-center", children: _jsx(ActionButton, { label: deployAction.deployError
82
+ _jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-git-loading", className: "border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex h-4 items-center gap-2 text-xs", children: [_jsx(GitBranch, { className: "text-muted-foreground h-3 w-3 shrink-0" }), _jsx("span", { className: "bg-muted h-3 w-20 animate-pulse rounded" })] }) }), _jsx("div", { className: "border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex h-4 items-center gap-2 text-xs", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3 w-3 shrink-0" }), _jsx("span", { className: "bg-muted h-3 w-36 animate-pulse rounded" })] }) })] })) : null, featureFlags.envDeploy && data.repositoryPath ? (_jsx("div", { "data-testid": "repository-node-dev-preview", className: "border-border/50 border-t px-4 py-2", onClick: (e) => e.stopPropagation(), children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [deployAction.deployError ? (_jsx("span", { className: "truncate text-xs text-red-500", children: deployAction.deployError })) : isDeploymentActive ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "mr-0.5 inline-block h-2 w-2 shrink-0 rounded-full bg-green-500" }), deployAction.url ? (_jsx("a", { href: deployAction.url, target: "_blank", rel: "noopener noreferrer", className: "truncate text-green-700 hover:underline dark:text-green-400", children: deployAction.url })) : (_jsx("span", { className: "text-muted-foreground", children: "Starting..." }))] })) : (_jsxs("span", { className: "text-muted-foreground", children: ["Run", _jsx("span", { className: "text-muted-foreground/50 ml-2 text-[10px]", children: "start local environment" })] })), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: cn('ml-auto flex items-center', !isDeploymentActive &&
83
+ !deployAction.deployError &&
84
+ '[&_button]:text-green-600 [&_button]:hover:text-green-700 dark:[&_button]:text-green-400 dark:[&_button]:hover:text-green-300'), children: _jsx(ActionButton, { label: deployAction.deployError
83
85
  ? 'Retry'
84
86
  : isDeploymentActive
85
87
  ? 'Stop Dev Server'
@@ -1 +1 @@
1
- {"version":3,"file":"control-center-empty-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-empty-state.tsx"],"names":[],"mappings":"AAsBA,MAAM,WAAW,4BAA4B;IAC3C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,uBAAuB,CAAC,EACtC,kBAAkB,EAClB,SAAS,GACV,EAAE,4BAA4B,kDAuL9B"}
1
+ {"version":3,"file":"control-center-empty-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/features/control-center/control-center-empty-state.tsx"],"names":[],"mappings":"AAyBA,MAAM,WAAW,4BAA4B;IAC3C,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,wBAAgB,uBAAuB,CAAC,EACtC,kBAAkB,EAClB,SAAS,GACV,EAAE,4BAA4B,kDAmM9B"}