@shepai/cli 1.91.0 → 1.91.1-pr270.732dfe6

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 (272) hide show
  1. package/dist/packages/core/src/infrastructure/services/version.service.d.ts.map +1 -1
  2. package/dist/packages/core/src/infrastructure/services/version.service.js +1 -0
  3. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts +11 -0
  4. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.d.ts.map +1 -0
  5. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +49 -0
  6. package/dist/src/presentation/web/app/(dashboard)/feature/[featureId]/[tab]/page.d.ts +3 -0
  7. package/dist/src/presentation/web/app/(dashboard)/feature/[featureId]/[tab]/page.d.ts.map +1 -0
  8. package/dist/src/presentation/web/app/(dashboard)/feature/[featureId]/[tab]/page.js +4 -0
  9. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +4 -0
  10. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -1
  11. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +17 -0
  12. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts +4 -2
  13. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  14. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +2 -2
  15. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +3 -1
  16. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  17. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +94 -5
  18. package/dist/src/presentation/web/components/common/index.d.ts +1 -0
  19. package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
  20. package/dist/src/presentation/web/components/common/index.js +1 -0
  21. package/dist/src/presentation/web/components/common/shep-logo/shep-logo.d.ts +2 -1
  22. package/dist/src/presentation/web/components/common/shep-logo/shep-logo.d.ts.map +1 -1
  23. package/dist/src/presentation/web/components/common/shep-logo/shep-logo.js +2 -2
  24. package/dist/src/presentation/web/components/common/shep-logo/shep-logo.stories.d.ts +1 -0
  25. package/dist/src/presentation/web/components/common/shep-logo/shep-logo.stories.d.ts.map +1 -1
  26. package/dist/src/presentation/web/components/common/shep-logo/shep-logo.stories.js +5 -0
  27. package/dist/src/presentation/web/components/common/version-badge/index.d.ts +3 -0
  28. package/dist/src/presentation/web/components/common/version-badge/index.d.ts.map +1 -0
  29. package/dist/src/presentation/web/components/common/version-badge/index.js +1 -0
  30. package/dist/src/presentation/web/components/common/version-badge/version-badge.d.ts +12 -0
  31. package/dist/src/presentation/web/components/common/version-badge/version-badge.d.ts.map +1 -0
  32. package/dist/src/presentation/web/components/common/version-badge/version-badge.js +17 -0
  33. package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.d.ts +14 -0
  34. package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.d.ts.map +1 -0
  35. package/dist/src/presentation/web/components/common/version-badge/version-badge.stories.js +50 -0
  36. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  37. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +2 -1
  38. package/dist/src/presentation/web/hooks/use-selected-feature-id.js +1 -1
  39. package/dist/src/presentation/web/lib/version.d.ts +2 -0
  40. package/dist/src/presentation/web/lib/version.d.ts.map +1 -1
  41. package/dist/src/presentation/web/lib/version.js +2 -0
  42. package/dist/src/presentation/web/next.config.d.ts.map +1 -1
  43. package/dist/src/presentation/web/next.config.js +12 -0
  44. package/dist/tsconfig.build.tsbuildinfo +1 -1
  45. package/package.json +1 -1
  46. package/web/.next/BUILD_ID +1 -1
  47. package/web/.next/app-path-routes-manifest.json +2 -0
  48. package/web/.next/build-manifest.json +2 -2
  49. package/web/.next/fallback-build-manifest.json +2 -2
  50. package/web/.next/prerender-manifest.json +3 -3
  51. package/web/.next/required-server-files.js +4 -2
  52. package/web/.next/required-server-files.json +4 -2
  53. package/web/.next/routes-manifest.json +9 -0
  54. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
  55. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  56. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  57. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/app-paths-manifest.json +3 -0
  59. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/build-manifest.json +18 -0
  60. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/next-font-manifest.json +6 -0
  61. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/react-loadable-manifest.json +1 -0
  62. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +320 -0
  63. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +20 -0
  64. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.map +5 -0
  65. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -0
  66. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +2 -0
  67. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +21 -21
  68. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  69. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  70. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  71. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  72. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  73. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  74. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  75. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +18 -18
  76. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  77. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  78. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  79. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/app-paths-manifest.json +3 -0
  80. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/build-manifest.json +18 -0
  81. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/next-font-manifest.json +6 -0
  82. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/react-loadable-manifest.json +1 -0
  83. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +320 -0
  84. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +20 -0
  85. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.map +5 -0
  86. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -0
  87. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +2 -0
  88. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +21 -21
  89. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
  90. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  91. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  93. package/web/.next/server/app/(dashboard)/page.js +1 -1
  94. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  95. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  97. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  98. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  99. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  100. package/web/.next/server/app/_global-error/page.js +1 -1
  101. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  102. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  103. package/web/.next/server/app/_global-error.html +2 -2
  104. package/web/.next/server/app/_global-error.rsc +1 -1
  105. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  106. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  107. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  108. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  109. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  110. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  111. package/web/.next/server/app/_not-found/page.js +1 -1
  112. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  113. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  114. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  115. package/web/.next/server/app/api/feature-logs/route.js +1 -1
  116. package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -1
  117. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  118. package/web/.next/server/app/settings/page.js +1 -1
  119. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  120. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  121. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  122. package/web/.next/server/app/skills/page.js +2 -2
  123. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  124. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  126. package/web/.next/server/app/tools/page.js +2 -2
  127. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  128. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  129. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  130. package/web/.next/server/app/version/page.js +1 -1
  131. package/web/.next/server/app/version/page.js.nft.json +1 -1
  132. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  133. package/web/.next/server/app-paths-manifest.json +2 -0
  134. package/web/.next/server/chunks/{[root-of-the-server]__d8037e14._.js → [root-of-the-server]__52c318d1._.js} +2 -2
  135. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_c29a2302.js +4 -0
  136. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_c29a2302.js.map +1 -0
  137. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_d1fd387b.js +4 -0
  138. package/web/.next/server/chunks/ssr/403f9_next_dist_esm_build_templates_app-page_d1fd387b.js.map +1 -0
  139. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  140. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/{7f428_lucide-react_dist_esm_icons_9027d30a._.js → 7f428_lucide-react_dist_esm_icons_81a06555._.js} +2 -2
  142. package/web/.next/server/chunks/ssr/{7f428_lucide-react_dist_esm_icons_9027d30a._.js.map → 7f428_lucide-react_dist_esm_icons_81a06555._.js.map} +1 -1
  143. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js +3 -0
  144. package/web/.next/server/chunks/ssr/7f428_lucide-react_dist_esm_icons_rocket_1575cd4d.js.map +1 -0
  145. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  146. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  148. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  150. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js +1 -1
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  154. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__45aad79d._.js +3 -0
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__45aad79d._.js.map +1 -0
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
  158. package/web/.next/server/chunks/ssr/[root-of-the-server]__5cc4752a._.js +3 -0
  159. package/web/.next/server/chunks/ssr/[root-of-the-server]__5cc4752a._.js.map +1 -0
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  161. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f0d8d054._.js → [root-of-the-server]__89e8a5cc._.js} +3 -3
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +1 -0
  163. package/web/.next/server/chunks/ssr/{[root-of-the-server]__248ee887._.js → [root-of-the-server]__8d9536c4._.js} +2 -2
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__94128fa9._.js +3 -0
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__94128fa9._.js.map +1 -0
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__9bfb8e7c._.js +3 -0
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__9bfb8e7c._.js.map +1 -0
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__9dc40036._.js +3 -0
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__9dc40036._.js.map +1 -0
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__b65f78cf._.js +3 -0
  175. package/web/.next/server/chunks/ssr/{[root-of-the-server]__b3a4cef4._.js → [root-of-the-server]__e630cc47._.js} +2 -2
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__e630cc47._.js.map +1 -0
  177. package/web/.next/server/chunks/ssr/{[root-of-the-server]__b062b383._.js → [root-of-the-server]__f1a05100._.js} +2 -2
  178. package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js → [root-of-the-server]__f8210f45._.js} +2 -2
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  180. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  181. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  182. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  183. package/web/.next/server/chunks/ssr/{_752e01fd._.js → _21c75883._.js} +2 -2
  184. package/web/.next/server/chunks/ssr/{_752e01fd._.js.map → _21c75883._.js.map} +1 -1
  185. package/web/.next/server/chunks/ssr/_3533fed7._.js +3 -0
  186. package/web/.next/server/chunks/ssr/_3533fed7._.js.map +1 -0
  187. package/web/.next/server/chunks/ssr/{_05b3aacb._.js → _35af8d42._.js} +2 -2
  188. package/web/.next/server/chunks/ssr/{_05b3aacb._.js.map → _35af8d42._.js.map} +1 -1
  189. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  190. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  191. package/web/.next/server/chunks/ssr/_922aa39f._.js +3 -0
  192. package/web/.next/server/chunks/ssr/_922aa39f._.js.map +1 -0
  193. package/web/.next/server/chunks/ssr/_a5c23e45._.js +3 -0
  194. package/web/.next/server/chunks/ssr/_a5c23e45._.js.map +1 -0
  195. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  196. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  197. package/web/.next/server/chunks/ssr/_f50485a5._.js +3 -0
  198. package/web/.next/server/chunks/ssr/_f50485a5._.js.map +1 -0
  199. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  200. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  201. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  202. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  203. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  204. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  205. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  206. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  207. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_feature_[featureId]_[tab]_page_tsx_40a5d287._.js +3 -0
  208. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_feature_[featureId]_[tab]_page_tsx_40a5d287._.js.map +1 -0
  209. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
  210. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
  211. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js +3 -0
  212. package/web/.next/server/chunks/ssr/src_presentation_web_components_a5e6c910._.js.map +1 -0
  213. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  214. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  215. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  216. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  217. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  218. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  219. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  220. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  221. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
  222. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +1 -1
  223. package/web/.next/server/pages/500.html +2 -2
  224. package/web/.next/server/server-reference-manifest.js +1 -1
  225. package/web/.next/server/server-reference-manifest.json +322 -28
  226. package/web/.next/static/chunks/30a344bb33a015e4.js +1 -0
  227. package/web/.next/static/chunks/{c0233da545286fe1.js → 790eac4d453b038b.js} +1 -1
  228. package/web/.next/static/chunks/83baae83a7c17968.js +1 -0
  229. package/web/.next/static/chunks/{2ea28eba896e489b.js → 84fdba907c18f366.js} +1 -1
  230. package/web/.next/static/chunks/88a0b28324f119a8.css +2 -0
  231. package/web/.next/static/chunks/{0414e6b21f189456.js → 8b352c66f2c69ea2.js} +1 -1
  232. package/web/.next/static/chunks/{205b12234277ba2f.js → 8c6424a7ae6916f1.js} +1 -1
  233. package/web/.next/static/chunks/{d5c051b708c9eafd.js → 9e4dc26ea678aa82.js} +2 -2
  234. package/web/.next/static/chunks/{fb39605881b728b1.js → c563d15b50625047.js} +1 -1
  235. package/web/.next/static/chunks/{7fb81216c7dd303e.js → cd9ee4888dd66f2d.js} +1 -1
  236. package/web/.next/static/chunks/d9247a52ae260218.js +1 -0
  237. package/web/.next/static/chunks/e0e996d829f40a32.js +11 -0
  238. package/web/.next/static/chunks/ebd4a280c86688f2.js +1 -0
  239. package/web/.next/static/chunks/{dcc6eeb6b6e4c578.js → efc04b981e0886dc.js} +1 -1
  240. package/web/.next/server/chunks/ssr/[root-of-the-server]__4af0afe0._.js +0 -3
  241. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js.map +0 -1
  242. package/web/.next/server/chunks/ssr/[root-of-the-server]__c2173b6d._.js +0 -3
  243. package/web/.next/server/chunks/ssr/[root-of-the-server]__c2173b6d._.js.map +0 -1
  244. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js +0 -3
  245. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js.map +0 -1
  246. package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js.map +0 -1
  247. package/web/.next/server/chunks/ssr/_411648c4._.js +0 -3
  248. package/web/.next/server/chunks/ssr/_411648c4._.js.map +0 -1
  249. package/web/.next/server/chunks/ssr/_903aed47._.js +0 -3
  250. package/web/.next/server/chunks/ssr/_903aed47._.js.map +0 -1
  251. package/web/.next/server/chunks/ssr/_cc46119f._.js +0 -3
  252. package/web/.next/server/chunks/ssr/_cc46119f._.js.map +0 -1
  253. package/web/.next/server/chunks/ssr/_f38b49fe._.js +0 -3
  254. package/web/.next/server/chunks/ssr/_f38b49fe._.js.map +0 -1
  255. package/web/.next/server/chunks/ssr/node_modules__pnpm_c931457d._.js +0 -3
  256. package/web/.next/server/chunks/ssr/node_modules__pnpm_c931457d._.js.map +0 -1
  257. package/web/.next/server/chunks/ssr/src_presentation_web_components_5124369c._.js +0 -3
  258. package/web/.next/server/chunks/ssr/src_presentation_web_components_5124369c._.js.map +0 -1
  259. package/web/.next/static/chunks/1e0cfdcb44a16493.js +0 -1
  260. package/web/.next/static/chunks/24744618941b8239.js +0 -11
  261. package/web/.next/static/chunks/2a09571d38368a18.css +0 -2
  262. package/web/.next/static/chunks/55e7ff9b53257d70.js +0 -1
  263. package/web/.next/static/chunks/7acc79e599df9890.js +0 -1
  264. package/web/.next/static/chunks/fbdf11fbbe42fcff.js +0 -1
  265. /package/web/.next/server/chunks/{[root-of-the-server]__d8037e14._.js.map → [root-of-the-server]__52c318d1._.js.map} +0 -0
  266. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__248ee887._.js.map → [root-of-the-server]__8d9536c4._.js.map} +0 -0
  267. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__4af0afe0._.js.map → [root-of-the-server]__b65f78cf._.js.map} +0 -0
  268. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__b062b383._.js.map → [root-of-the-server]__f1a05100._.js.map} +0 -0
  269. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__9bc1434f._.js.map → [root-of-the-server]__f8210f45._.js.map} +0 -0
  270. /package/web/.next/static/{yZWy0Cxn_PmaNJkxer58a → Rur5-O1Dci9Qgq4G1reru}/_buildManifest.js +0 -0
  271. /package/web/.next/static/{yZWy0Cxn_PmaNJkxer58a → Rur5-O1Dci9Qgq4G1reru}/_clientMiddlewareManifest.json +0 -0
  272. /package/web/.next/static/{yZWy0Cxn_PmaNJkxer58a → Rur5-O1Dci9Qgq4G1reru}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"version.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/version.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAG9E,YAAY,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAsC9E;;GAEG;AACH,qBACa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;;IAM1C,OAAO,CAAC,eAAe;IAqCvB;;OAEG;IACH,UAAU,IAAI,WAAW;CAG1B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAIzD"}
1
+ {"version":3,"file":"version.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/version.service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAG9E,YAAY,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAsC9E;;GAEG;AACH,qBACa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;;IAM1C,OAAO,CAAC,eAAe;IAqCvB;;OAEG;IACH,UAAU,IAAI,WAAW;CAG1B;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,IAAI,CAKzD"}
@@ -111,4 +111,5 @@ export function setVersionEnvVars(info) {
111
111
  process.env.NEXT_PUBLIC_SHEP_VERSION = info.version;
112
112
  process.env.NEXT_PUBLIC_SHEP_PACKAGE_NAME = info.name;
113
113
  process.env.NEXT_PUBLIC_SHEP_DESCRIPTION = info.description;
114
+ // Branch is intentionally not set in production mode — only dev mode shows it
114
115
  }
@@ -0,0 +1,11 @@
1
+ /** Skip static pre-rendering since we need runtime DI container. */
2
+ export declare const dynamic = "force-dynamic";
3
+ interface FeatureDrawerTabPageProps {
4
+ params: Promise<{
5
+ featureId: string;
6
+ tab: string;
7
+ }>;
8
+ }
9
+ export default function FeatureDrawerTabPage({ params }: FeatureDrawerTabPageProps): Promise<import("react/jsx-runtime").JSX.Element | null>;
10
+ export {};
11
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.tsx"],"names":[],"mappings":"AAaA,oEAAoE;AACpE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,UAAU,yBAAyB;IACjC,MAAM,EAAE,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrD;AAED,wBAA8B,oBAAoB,CAAC,EAAE,MAAM,EAAE,EAAE,yBAAyB,2DA8CvF"}
@@ -0,0 +1,49 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { resolve } from '../../../../../../lib/server-container.js';
3
+ import { buildFeatureNodeData } from '../../../../../build-feature-node-data.js';
4
+ import { computeDrawerView, parseTabKey, } from '../../../../../../components/common/control-center-drawer/drawer-view.js';
5
+ import { FeatureDrawerClient } from '../../../../../../components/common/control-center-drawer/feature-drawer-client.js';
6
+ /** Skip static pre-rendering since we need runtime DI container. */
7
+ export const dynamic = 'force-dynamic';
8
+ export default async function FeatureDrawerTabPage({ params }) {
9
+ const { featureId, tab } = await params;
10
+ const urlTab = parseTabKey(tab);
11
+ try {
12
+ const featureRepo = resolve('IFeatureRepository');
13
+ const agentRunRepo = resolve('IAgentRunRepository');
14
+ const repoRepo = resolve('IRepositoryRepository');
15
+ const gitPrService = resolve('IGitPrService');
16
+ const feature = await featureRepo.findById(featureId);
17
+ if (!feature)
18
+ return null;
19
+ const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
20
+ const getArtifact = resolve('GetFeatureArtifactUseCase');
21
+ const [repo, baseBranch, artifact, remoteUrl] = await Promise.all([
22
+ repoRepo.findByPath(feature.repositoryPath).catch(() => null),
23
+ gitPrService.getDefaultBranch(feature.repositoryPath).catch(() => 'main'),
24
+ getArtifact.execute(featureId).catch(() => null),
25
+ gitPrService.getRemoteUrl(feature.repositoryPath).catch(() => null),
26
+ ]);
27
+ const nodeData = buildFeatureNodeData(feature, run, {
28
+ repositoryName: repo?.name,
29
+ baseBranch,
30
+ oneLiner: artifact?.oneLiner,
31
+ remoteUrl: remoteUrl ?? undefined,
32
+ });
33
+ const view = computeDrawerView({
34
+ selectedNode: nodeData,
35
+ isCreateDrawerOpen: false,
36
+ pendingRepositoryPath: '',
37
+ pendingParentFeatureId: undefined,
38
+ selectedRepoNode: null,
39
+ features: [],
40
+ workflowDefaults: undefined,
41
+ });
42
+ if (!view)
43
+ return null;
44
+ return _jsx(FeatureDrawerClient, { view: view, urlTab: urlTab });
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
@@ -0,0 +1,3 @@
1
+ /** Children slot stub — canvas is rendered by the layout. */
2
+ export default function FeatureTabPage(): null;
3
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/(dashboard)/feature/[featureId]/[tab]/page.tsx"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,MAAM,CAAC,OAAO,UAAU,cAAc,SAErC"}
@@ -0,0 +1,4 @@
1
+ /** Children slot stub — canvas is rendered by the layout. */
2
+ export default function FeatureTabPage() {
3
+ return null;
4
+ }
@@ -4,6 +4,10 @@ import type { ParentFeatureOption } from '../../common/feature-create-drawer/fea
4
4
  import type { WorkflowDefaults } from '../../../app/actions/get-workflow-defaults.js';
5
5
  /** Tab key matching FeatureDrawerTabs */
6
6
  export type FeatureTabKey = 'overview' | 'activity' | 'log' | 'plan' | 'prd-review' | 'tech-decisions' | 'product-decisions' | 'merge-review';
7
+ /** All valid tab key values — used for URL param validation. */
8
+ export declare const VALID_TAB_KEYS: ReadonlySet<string>;
9
+ /** Type-guard: returns the value as FeatureTabKey if valid, otherwise undefined. */
10
+ export declare function parseTabKey(value: string | null | undefined): FeatureTabKey | undefined;
7
11
  /**
8
12
  * Discriminated union representing every possible drawer state in the control center.
9
13
  * Only one view can be active at a time.
@@ -1 +1 @@
1
- {"version":3,"file":"drawer-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/drawer-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,yCAAyC;AACzC,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,KAAK,GACL,MAAM,GACN,YAAY,GACZ,gBAAgB,GAChB,mBAAmB,GACnB,cAAc,CAAC;AAEnB;;;GAGG;AACH,MAAM,MAAM,UAAU;AACpB,qEAAqE;AACnE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,aAAa,CAAA;CAAE;AACvE,4BAA4B;GAC1B;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AACH,8BAA8B;GAC5B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAErD,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,CAOrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,GACjB,EAAE;IACD,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,gBAAgB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC5C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD,GAAG,UAAU,GAAG,IAAI,CAoBpB"}
1
+ {"version":3,"file":"drawer-view.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/drawer-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iEAAiE,CAAC;AAC3G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAE5E,yCAAyC;AACzC,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,UAAU,GACV,KAAK,GACL,MAAM,GACN,YAAY,GACZ,gBAAgB,GAChB,mBAAmB,GACnB,cAAc,CAAC;AAEnB,gEAAgE;AAChE,eAAO,MAAM,cAAc,EAAE,WAAW,CAAC,MAAM,CAS7C,CAAC;AAEH,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,aAAa,GAAG,SAAS,CAGvF;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU;AACpB,qEAAqE;AACnE;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,aAAa,CAAA;CAAE;AACvE,4BAA4B;GAC1B;IACE,IAAI,EAAE,gBAAgB,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC;AACH,8BAA8B;GAC5B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAErD,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa,CAOrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,gBAAgB,EAChB,QAAQ,EACR,gBAAgB,GACjB,EAAE;IACD,YAAY,EAAE,eAAe,GAAG,IAAI,CAAC;IACrC,kBAAkB,EAAE,OAAO,CAAC;IAC5B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,sBAAsB,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,gBAAgB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC5C,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD,GAAG,UAAU,GAAG,IAAI,CAoBpB"}
@@ -1,3 +1,20 @@
1
+ /** All valid tab key values — used for URL param validation. */
2
+ export const VALID_TAB_KEYS = new Set([
3
+ 'overview',
4
+ 'activity',
5
+ 'log',
6
+ 'plan',
7
+ 'prd-review',
8
+ 'tech-decisions',
9
+ 'product-decisions',
10
+ 'merge-review',
11
+ ]);
12
+ /** Type-guard: returns the value as FeatureTabKey if valid, otherwise undefined. */
13
+ export function parseTabKey(value) {
14
+ if (value && VALID_TAB_KEYS.has(value))
15
+ return value;
16
+ return undefined;
17
+ }
1
18
  /** Derives the initial tab from node lifecycle + state. */
2
19
  export function deriveInitialTab(node) {
3
20
  if (node.lifecycle === 'requirements' && node.state === 'action-required')
@@ -1,6 +1,8 @@
1
- import type { DrawerView } from './drawer-view.js';
1
+ import type { DrawerView, FeatureTabKey } from './drawer-view.js';
2
2
  export interface FeatureDrawerClientProps {
3
3
  view: DrawerView;
4
+ /** Tab key extracted from the URL path segment (e.g. /feature/[id]/activity → 'activity'). */
5
+ urlTab?: FeatureTabKey;
4
6
  }
5
- export declare function FeatureDrawerClient({ view: initialView }: FeatureDrawerClientProps): import("react/jsx-runtime").JSX.Element;
7
+ export declare function FeatureDrawerClient({ view: initialView, urlTab }: FeatureDrawerClientProps): import("react/jsx-runtime").JSX.Element;
6
8
  //# sourceMappingURL=feature-drawer-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGhD,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,wBAAwB,2CAsiBlF"}
1
+ {"version":3,"file":"feature-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/feature-drawer-client.tsx"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAuiB1F"}
@@ -28,7 +28,7 @@ import { useFeatureActions } from '../../common/feature-drawer/use-feature-actio
28
28
  import { resolveSseEventUpdates } from '../../common/feature-node/derive-feature-state.js';
29
29
  import { deriveInitialTab } from './drawer-view.js';
30
30
  import { useArtifactFetch } from './use-artifact-fetch.js';
31
- export function FeatureDrawerClient({ view: initialView }) {
31
+ export function FeatureDrawerClient({ view: initialView, urlTab }) {
32
32
  const featureFlags = useFeatureFlags();
33
33
  const router = useRouter();
34
34
  const deleteSound = useSoundAction('delete');
@@ -324,7 +324,7 @@ export function FeatureDrawerClient({ view: initialView }) {
324
324
  // ── Body ──────────────────────────────────────────────────────────────
325
325
  let body = null;
326
326
  if (view.type === 'feature' && featureNode) {
327
- body = (_jsx(FeatureDrawerTabs, { featureNode: featureNode, featureId: featureNode.featureId, initialTab: view.initialTab, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
327
+ body = (_jsx(FeatureDrawerTabs, { featureNode: featureNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
328
328
  }
329
329
  return (_jsx(BaseDrawer, { open: isOpen, onClose: attemptClose, size: "md", modal: false, header: header, "data-testid": view.type === 'feature' ? 'feature-drawer' : 'repository-drawer', children: body }));
330
330
  }
@@ -9,6 +9,8 @@ export interface FeatureDrawerTabsProps {
9
9
  featureNode: FeatureNodeData;
10
10
  featureId: string;
11
11
  initialTab?: FeatureTabKey;
12
+ /** Tab key from URL path segment (e.g. /feature/[id]/activity → 'activity'). */
13
+ urlTab?: FeatureTabKey;
12
14
  prdData?: PrdQuestionnaireData | null;
13
15
  prdSelections?: Record<string, string>;
14
16
  onPrdSelect?: (questionId: string, optionId: string) => void;
@@ -28,5 +30,5 @@ export interface FeatureDrawerTabsProps {
28
30
  chatInput?: string;
29
31
  onChatInputChange?: (value: string) => void;
30
32
  }
31
- export declare function FeatureDrawerTabs({ featureNode, featureId, initialTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, }: FeatureDrawerTabsProps): import("react/jsx-runtime").JSX.Element;
33
+ export declare function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, }: FeatureDrawerTabsProps): import("react/jsx-runtime").JSX.Element;
32
34
  //# sourceMappingURL=feature-drawer-tabs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-drawer-tabs.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAQ9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAiD3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,CAAC;IAG3B,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,WAAW,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAGjD,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAwBD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,SAAS,EACT,UAAU,EACV,OAAO,EACP,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,iBAAiB,GAClB,EAAE,sBAAsB,2CA4MxB"}
1
+ {"version":3,"file":"feature-drawer-tabs.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AACjG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMxE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAQ9E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAiD3F,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,aAAa,CAAC;IAC3B,gFAAgF;IAChF,MAAM,CAAC,EAAE,aAAa,CAAC;IAGvB,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7D,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC1E,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,QAAQ,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,WAAW,CAAC,EAAE,2BAA2B,GAAG,IAAI,CAAC;IAGjD,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IAC5E,cAAc,CAAC,EAAE,OAAO,CAAC;IAGzB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAwBD,wBAAgB,iBAAiB,CAAC,EAChC,WAAW,EACX,SAAS,EACT,UAAU,EACV,MAAM,EACN,OAAO,EACP,aAAa,EACb,WAAW,EACX,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,aAAa,EACb,WAAW,EACX,SAAS,EACT,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,SAAS,EACT,iBAAiB,GAClB,EAAE,sBAAsB,2CAmSxB"}
@@ -1,6 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useState, useEffect, useCallback, useRef, useMemo } from 'react';
4
+ import { usePathname } from 'next/navigation';
4
5
  import { Loader2 } from 'lucide-react';
5
6
  import { Tabs, TabsList, TabsTrigger, TabsContent } from '../../ui/tabs.js';
6
7
  import { getFeaturePhaseTimings } from '../../../app/actions/get-feature-phase-timings.js';
@@ -63,14 +64,91 @@ const TAB_FETCHERS = {
63
64
  activity: fetchActivity,
64
65
  plan: fetchPlan,
65
66
  };
66
- export function FeatureDrawerTabs({ featureNode, featureId, initialTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, }) {
67
+ export function FeatureDrawerTabs({ featureNode, featureId, initialTab, urlTab, prdData, prdSelections, onPrdSelect, onPrdApprove, onPrdReject, isPrdLoading, techData, onTechApprove, onTechReject, isTechLoading, productData, mergeData, onMergeApprove, onMergeReject, isMergeLoading, isRejecting, chatInput, onChatInputChange, }) {
68
+ const pathname = usePathname();
67
69
  const featureLogs = useFeatureLogs(featureId);
68
70
  const visibleTabs = useMemo(() => computeVisibleTabs(featureNode), [featureNode]);
69
71
  const visibleTabDefs = useMemo(() => ALL_TABS.filter((t) => visibleTabs.includes(t.key)), [visibleTabs]);
70
- // Use initialTab if it's visible, otherwise default to 'overview'
71
- const effectiveInitial = initialTab && visibleTabs.includes(initialTab) ? initialTab : 'overview';
72
+ // Derive the base path (without tab segment) from the current pathname.
73
+ // e.g. /feature/abc123/activity /feature/abc123
74
+ const basePath = useMemo(() => {
75
+ const match = pathname.match(/^(\/feature\/[^/]+)/);
76
+ return match ? match[1] : pathname;
77
+ }, [pathname]);
78
+ // Resolve the effective initial tab: URL path tab > initialTab prop > 'overview'
79
+ const effectiveInitial = useMemo(() => {
80
+ if (urlTab && visibleTabs.includes(urlTab))
81
+ return urlTab;
82
+ if (initialTab && visibleTabs.includes(initialTab))
83
+ return initialTab;
84
+ return 'overview';
85
+ // Only compute on mount — subsequent changes are handled by effects below
86
+ // eslint-disable-next-line react-hooks/exhaustive-deps
87
+ }, []);
72
88
  const [activeTab, setActiveTab] = useState(effectiveInitial);
73
89
  const { tabs, fetchTab, refreshTab } = useTabDataFetch(featureId, TAB_FETCHERS);
90
+ // Sync URL when active tab changes via user interaction.
91
+ // Use window.history.pushState instead of router.push to avoid triggering a
92
+ // server component re-render (which would remount the drawer).
93
+ const isUserInteraction = useRef(false);
94
+ useEffect(() => {
95
+ if (!isUserInteraction.current)
96
+ return;
97
+ isUserInteraction.current = false;
98
+ // Build the target URL from the base path + tab segment
99
+ const targetUrl = activeTab === 'overview' ? basePath : `${basePath}/${activeTab}`;
100
+ // Only update URL if it actually changed
101
+ if (targetUrl !== pathname) {
102
+ window.history.pushState(null, '', targetUrl);
103
+ }
104
+ }, [activeTab, basePath, pathname]);
105
+ // Sync active tab from URL when pathname changes (e.g. browser back/forward).
106
+ // Skip on initial mount — the effectiveInitial handles that via urlTab prop.
107
+ const prevPathnameRef = useRef(pathname);
108
+ useEffect(() => {
109
+ if (prevPathnameRef.current === pathname)
110
+ return; // Skip initial mount
111
+ prevPathnameRef.current = pathname;
112
+ if (isUserInteraction.current)
113
+ return; // Skip — this is our own navigation
114
+ const segments = pathname.split('/');
115
+ // pathname is /feature/[id] or /feature/[id]/[tab]
116
+ const pathTab = segments.length >= 4 ? segments[3] : undefined;
117
+ const resolved = pathTab && visibleTabs.includes(pathTab) ? pathTab : 'overview';
118
+ if (resolved !== activeTab) {
119
+ setActiveTab(resolved);
120
+ if (resolved === 'activity' || resolved === 'plan') {
121
+ fetchTab(resolved);
122
+ }
123
+ }
124
+ }, [pathname]); // eslint-disable-line react-hooks/exhaustive-deps
125
+ // On mount, sync the URL to reflect the effective initial tab when it was
126
+ // derived from feature state (initialTab) rather than from the URL (urlTab).
127
+ // Use replaceState so we don't add a duplicate history entry.
128
+ const initialSyncDone = useRef(false);
129
+ useEffect(() => {
130
+ if (initialSyncDone.current)
131
+ return;
132
+ initialSyncDone.current = true;
133
+ // Only sync if the effective tab came from initialTab (not from URL)
134
+ if (!urlTab && effectiveInitial !== 'overview') {
135
+ const targetUrl = `${basePath}/${effectiveInitial}`;
136
+ if (targetUrl !== pathname) {
137
+ window.history.replaceState(null, '', targetUrl);
138
+ }
139
+ }
140
+ // eslint-disable-next-line react-hooks/exhaustive-deps
141
+ }, []);
142
+ // Trigger lazy fetch for URL-driven initial tab
143
+ const initialFetchDone = useRef(false);
144
+ useEffect(() => {
145
+ if (initialFetchDone.current)
146
+ return;
147
+ initialFetchDone.current = true;
148
+ if (activeTab === 'activity' || activeTab === 'plan') {
149
+ fetchTab(activeTab);
150
+ }
151
+ }, [activeTab, fetchTab]);
74
152
  // Reset tab when featureId changes
75
153
  const prevFeatureIdRef = useRef(featureId);
76
154
  useEffect(() => {
@@ -80,6 +158,7 @@ export function FeatureDrawerTabs({ featureNode, featureId, initialTab, prdData,
80
158
  }
81
159
  }, [featureId]);
82
160
  // When initialTab changes (e.g. SSE updates lifecycle), switch to it if visible
161
+ // and sync the URL with replaceState so the address bar reflects the new tab.
83
162
  const prevInitialTabRef = useRef(initialTab);
84
163
  useEffect(() => {
85
164
  if (prevInitialTabRef.current !== initialTab &&
@@ -87,14 +166,23 @@ export function FeatureDrawerTabs({ featureNode, featureId, initialTab, prdData,
87
166
  visibleTabs.includes(initialTab)) {
88
167
  prevInitialTabRef.current = initialTab;
89
168
  setActiveTab(initialTab);
169
+ // Sync URL to match the new tab
170
+ const targetUrl = initialTab === 'overview' ? basePath : `${basePath}/${initialTab}`;
171
+ if (targetUrl !== window.location.pathname) {
172
+ window.history.replaceState(null, '', targetUrl);
173
+ }
90
174
  }
91
- }, [initialTab, visibleTabs]);
175
+ }, [initialTab, visibleTabs, basePath]);
92
176
  // If the active tab becomes invisible (lifecycle changed), fall back to overview
177
+ // and sync the URL accordingly.
93
178
  useEffect(() => {
94
179
  if (!visibleTabs.includes(activeTab)) {
95
180
  setActiveTab('overview');
181
+ if (window.location.pathname !== basePath) {
182
+ window.history.replaceState(null, '', basePath);
183
+ }
96
184
  }
97
- }, [visibleTabs, activeTab]);
185
+ }, [visibleTabs, activeTab, basePath]);
98
186
  // SSE refresh: re-fetch active lazy tab when featureNode reference changes
99
187
  const featureNodeRef = useRef(featureNode);
100
188
  const activeTabRef = useRef(activeTab);
@@ -110,6 +198,7 @@ export function FeatureDrawerTabs({ featureNode, featureId, initialTab, prdData,
110
198
  }, [featureNode, refreshTab]);
111
199
  const handleTabChange = useCallback((value) => {
112
200
  const tab = value;
201
+ isUserInteraction.current = true;
113
202
  setActiveTab(tab);
114
203
  if (tab === 'activity' || tab === 'plan') {
115
204
  fetchTab(tab);
@@ -18,4 +18,5 @@ export { SidebarCollapseToggle, type SidebarCollapseToggleProps } from './sideba
18
18
  export { SidebarNavItem, type SidebarNavItemProps } from './sidebar-nav-item/index.js';
19
19
  export { SidebarSectionHeader, type SidebarSectionHeaderProps } from './sidebar-section-header/index.js';
20
20
  export { ThemeToggle } from './theme-toggle/index.js';
21
+ export { VersionBadge, type VersionBadgeProps } from './version-badge/index.js';
21
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/components/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,GAC1B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACjF,OAAO,EACL,WAAW,EACX,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,kBAAkB,EAAE,KAAK,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC1F,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EACL,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,oBAAoB,GAC1B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,KAAK,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAChG,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -18,3 +18,4 @@ export { SidebarCollapseToggle } from './sidebar-collapse-toggle/index.js';
18
18
  export { SidebarNavItem } from './sidebar-nav-item/index.js';
19
19
  export { SidebarSectionHeader } from './sidebar-section-header/index.js';
20
20
  export { ThemeToggle } from './theme-toggle/index.js';
21
+ export { VersionBadge } from './version-badge/index.js';
@@ -1,6 +1,7 @@
1
1
  export interface ShepLogoProps {
2
2
  className?: string;
3
3
  size?: number;
4
+ variant?: 'default' | 'dev';
4
5
  }
5
- export declare function ShepLogo({ className, size }: ShepLogoProps): import("react/jsx-runtime").JSX.Element;
6
+ export declare function ShepLogo({ className, size, variant }: ShepLogoProps): import("react/jsx-runtime").JSX.Element;
6
7
  //# sourceMappingURL=shep-logo.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shep-logo.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/shep-logo/shep-logo.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAS,EAAE,EAAE,aAAa,2CAkB/D"}
1
+ {"version":3,"file":"shep-logo.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/shep-logo/shep-logo.tsx"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;CAC7B;AAED,wBAAgB,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAS,EAAE,OAAmB,EAAE,EAAE,aAAa,2CAkBpF"}
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { cn } from '../../../lib/utils.js';
3
- export function ShepLogo({ className, size = 24 }) {
4
- return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 194 200", width: size, height: size, className: cn('shrink-0', className), "aria-hidden": "true", children: _jsx("g", { transform: "matrix(1, 0, 0, 1, -111, -208)", children: _jsx("path", { d: "M 198 406 C196,405 194,403 193,401 C192,399 191,398 186,398 C178,397 174,394 170,387 L 168 381 L 163 381 C156,381 150,377 147,370 C144,364 143,359 146,353 C148,348 148,347 147,347 C145,347 140,343 138,339 C133,329 139,314 149,311 L 152 311 L 149 307 C145,302 145,294 149,290 C151,288 152,287 151,286 C150,283 152,278 155,276 C156,275 159,274 162,273 C165,273 166,273 168,276 C171,278 171,280 172,287 C173,294 174,297 177,304 C180,309 182,314 183,316 C186,327 193,336 199,339 C204,342 211,342 216,340 C222,336 231,324 234,314 C235,312 237,307 239,302 C240,298 242,292 242,289 C243,281 245,278 247,275 C250,273 251,273 255,273 C261,274 264,278 264,282 C264,284 264,286 263,287 C262,287 263,288 265,290 C272,295 272,303 267,309 L 265 312 L 269 314 C276,317 279,323 279,332 C279,339 277,343 272,347 C268,351 268,351 269,354 C272,358 271,366 269,371 C266,376 259,381 254,381 C252,381 251,382 248,386 C242,395 234,400 227,399 C224,398 223,398 221,401 C220,403 217,405 216,406 C211,409 203,409 198,406 ZM 136 271 C123,267 115,262 113,256 C111,251 111,251 113,251 C118,254 124,254 132,252 C136,252 141,251 144,251 C149,251 157,253 162,256 C166,258 166,258 166,264 L 166 269 L 160 270 C149,272 142,272 136,271 ZM 264 271 C263,271 259,270 256,270 L 250 270 L 250 265 C249,259 250,257 259,254 C265,251 272,251 289,252 C297,253 299,253 302,252 C305,250 305,250 305,252 C305,255 301,262 297,264 C289,270 272,273 264,271 ZM 162 249 C160,247 159,245 159,242 C159,236 164,230 169,230 C170,230 171,228 171,225 C171,216 176,210 184,209 C189,209 195,211 195,213 C195,214 196,213 197,212 C201,209 204,208 208,208 C212,208 217,210 219,212 C220,214 220,213 223,211 C226,208 234,208 239,211 C243,214 246,221 246,226 C245,230 245,230 247,230 C253,230 258,238 257,244 C256,249 251,252 245,252 C241,252 237,251 234,248 C232,247 232,247 228,249 C225,251 222,252 220,252 C216,252 212,250 210,247 C209,246 209,246 206,248 C201,252 192,253 185,248 C183,247 183,247 178,249 C172,253 166,253 162,249 ZM 116 249 C112,248 114,247 119,247 C122,247 127,246 130,245 C138,242 146,242 152,245 L 158 248 L 148 247 C142,247 138,247 133,248 C128,250 120,250 116,249 ZM 284 248 C281,247 277,247 270,247 L 260 248 L 263 246 C269,243 276,242 284,245 C289,246 295,247 298,247 C303,247 304,247 303,248 C301,250 289,250 284,248 Z", fill: "currentColor" }) }) }));
3
+ export function ShepLogo({ className, size = 24, variant = 'default' }) {
4
+ return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 194 200", width: size, height: size, className: cn('shrink-0', variant === 'dev' && 'text-cyan-400', className), "aria-hidden": "true", children: _jsx("g", { transform: "matrix(1, 0, 0, 1, -111, -208)", children: _jsx("path", { d: "M 198 406 C196,405 194,403 193,401 C192,399 191,398 186,398 C178,397 174,394 170,387 L 168 381 L 163 381 C156,381 150,377 147,370 C144,364 143,359 146,353 C148,348 148,347 147,347 C145,347 140,343 138,339 C133,329 139,314 149,311 L 152 311 L 149 307 C145,302 145,294 149,290 C151,288 152,287 151,286 C150,283 152,278 155,276 C156,275 159,274 162,273 C165,273 166,273 168,276 C171,278 171,280 172,287 C173,294 174,297 177,304 C180,309 182,314 183,316 C186,327 193,336 199,339 C204,342 211,342 216,340 C222,336 231,324 234,314 C235,312 237,307 239,302 C240,298 242,292 242,289 C243,281 245,278 247,275 C250,273 251,273 255,273 C261,274 264,278 264,282 C264,284 264,286 263,287 C262,287 263,288 265,290 C272,295 272,303 267,309 L 265 312 L 269 314 C276,317 279,323 279,332 C279,339 277,343 272,347 C268,351 268,351 269,354 C272,358 271,366 269,371 C266,376 259,381 254,381 C252,381 251,382 248,386 C242,395 234,400 227,399 C224,398 223,398 221,401 C220,403 217,405 216,406 C211,409 203,409 198,406 ZM 136 271 C123,267 115,262 113,256 C111,251 111,251 113,251 C118,254 124,254 132,252 C136,252 141,251 144,251 C149,251 157,253 162,256 C166,258 166,258 166,264 L 166 269 L 160 270 C149,272 142,272 136,271 ZM 264 271 C263,271 259,270 256,270 L 250 270 L 250 265 C249,259 250,257 259,254 C265,251 272,251 289,252 C297,253 299,253 302,252 C305,250 305,250 305,252 C305,255 301,262 297,264 C289,270 272,273 264,271 ZM 162 249 C160,247 159,245 159,242 C159,236 164,230 169,230 C170,230 171,228 171,225 C171,216 176,210 184,209 C189,209 195,211 195,213 C195,214 196,213 197,212 C201,209 204,208 208,208 C212,208 217,210 219,212 C220,214 220,213 223,211 C226,208 234,208 239,211 C243,214 246,221 246,226 C245,230 245,230 247,230 C253,230 258,238 257,244 C256,249 251,252 245,252 C241,252 237,251 234,248 C232,247 232,247 228,249 C225,251 222,252 220,252 C216,252 212,250 210,247 C209,246 209,246 206,248 C201,252 192,253 185,248 C183,247 183,247 178,249 C172,253 166,253 162,249 ZM 116 249 C112,248 114,247 119,247 C122,247 127,246 130,245 C138,242 146,242 152,245 L 158 248 L 148 247 C142,247 138,247 133,248 C128,250 120,250 116,249 ZM 284 248 C281,247 277,247 270,247 L 260 248 L 263 246 C269,243 276,242 284,245 C289,246 295,247 298,247 C303,247 304,247 303,248 C301,250 289,250 284,248 Z", fill: "currentColor" }) }) }));
5
5
  }
@@ -6,4 +6,5 @@ type Story = StoryObj<typeof meta>;
6
6
  export declare const Default: Story;
7
7
  export declare const Small: Story;
8
8
  export declare const Large: Story;
9
+ export declare const DevMode: Story;
9
10
  //# sourceMappingURL=shep-logo.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shep-logo.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/shep-logo/shep-logo.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,QAAQ,CAO/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC"}
1
+ {"version":3,"file":"shep-logo.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/shep-logo/shep-logo.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,QAAQ,CAO/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,OAAO,EAAE,KAAU,CAAC;AAEjC,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,KAAK,EAAE,KAInB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC"}
@@ -19,3 +19,8 @@ export const Large = {
19
19
  size: 48,
20
20
  },
21
21
  };
22
+ export const DevMode = {
23
+ args: {
24
+ variant: 'dev',
25
+ },
26
+ };
@@ -0,0 +1,3 @@
1
+ export { VersionBadge } from './version-badge.js';
2
+ export type { VersionBadgeProps } from './version-badge.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/version-badge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1 @@
1
+ export { VersionBadge } from './version-badge.js';
@@ -0,0 +1,12 @@
1
+ export interface VersionBadgeProps {
2
+ version: string;
3
+ branch?: string;
4
+ commitHash?: string;
5
+ isDev?: boolean;
6
+ packageName?: string;
7
+ description?: string;
8
+ nodeVersion?: string;
9
+ platform?: string;
10
+ }
11
+ export declare function VersionBadge({ version, branch, commitHash, isDev, packageName, description, nodeVersion, platform, }: VersionBadgeProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=version-badge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-badge.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/version-badge/version-badge.tsx"],"names":[],"mappings":"AAIA,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,EAC3B,OAAO,EACP,MAAM,EACN,UAAU,EACV,KAAa,EACb,WAA2B,EAC3B,WAAW,EACX,WAAW,EACX,QAAQ,GACT,EAAE,iBAAiB,2CAkCnB"}
@@ -0,0 +1,17 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
4
+ export function VersionBadge({ version, branch, commitHash, isDev = false, packageName = '@shepai/cli', description, nodeVersion, platform, }) {
5
+ const shortHash = commitHash?.slice(0, 7);
6
+ // In dev mode show "dev·abc1234" to make it clearly not a stable release
7
+ const displayVersion = isDev ? (shortHash ? `dev·${shortHash}` : 'dev') : `v${version}`;
8
+ return (_jsx(TooltipProvider, { delayDuration: 200, children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "text-muted-foreground/50 hover:text-muted-foreground cursor-default text-[10px] leading-tight transition-colors", "data-testid": "version-label", children: displayVersion }) }), _jsxs(TooltipContent, { side: "right", className: "max-w-[280px] space-y-1 p-3 text-left", children: [_jsx("div", { className: "mb-1.5 text-xs font-semibold", children: packageName }), description ? (_jsx("div", { className: "text-[10px] leading-snug opacity-70", children: description })) : null, _jsxs("div", { className: "border-t border-white/10 pt-1.5", children: [_jsx(Row, { label: "Version", value: `v${version}` }), isDev ? _jsx(Row, { label: "Mode", value: "Development", highlight: true }) : null, branch ? _jsx(Row, { label: "Branch", value: branch }) : null, shortHash ? _jsx(Row, { label: "Commit", value: shortHash, mono: true }) : null, nodeVersion ? _jsx(Row, { label: "Node.js", value: nodeVersion }) : null, platform ? _jsx(Row, { label: "Platform", value: platform }) : null] })] })] }) }));
9
+ }
10
+ function Row({ label, value, highlight, mono, }) {
11
+ return (_jsxs("div", { className: "flex items-center justify-between gap-4 text-[10px]", children: [_jsx("span", { className: "opacity-60", children: label }), _jsx("span", { className: [
12
+ highlight ? 'font-medium text-cyan-400' : '',
13
+ mono || !highlight ? 'font-mono' : '',
14
+ ]
15
+ .filter(Boolean)
16
+ .join(' '), children: value })] }));
17
+ }
@@ -0,0 +1,14 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { VersionBadge } from './version-badge.js';
3
+ declare const meta: Meta<typeof VersionBadge>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof VersionBadge>;
6
+ /** Production mode — shows version only as dimmed text. */
7
+ export declare const Production: Story;
8
+ /** Development mode — shows "dev·<hash>" to clearly indicate non-stable build. */
9
+ export declare const Development: Story;
10
+ /** Development mode with a long branch name — shown in tooltip. */
11
+ export declare const LongBranch: Story;
12
+ /** Minimal info — no optional fields. */
13
+ export declare const Minimal: Story;
14
+ //# sourceMappingURL=version-badge.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-badge.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/version-badge/version-badge.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,YAAY,CAOnC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,YAAY,CAAC,CAAC;AAE3C,2DAA2D;AAC3D,eAAO,MAAM,UAAU,EAAE,KAQxB,CAAC;AAEF,kFAAkF;AAClF,eAAO,MAAM,WAAW,EAAE,KAWzB,CAAC;AAEF,mEAAmE;AACnE,eAAO,MAAM,UAAU,EAAE,KASxB,CAAC;AAEF,yCAAyC;AACzC,eAAO,MAAM,OAAO,EAAE,KAIrB,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { VersionBadge } from './version-badge.js';
2
+ const meta = {
3
+ title: 'Common/VersionBadge',
4
+ component: VersionBadge,
5
+ tags: ['autodocs'],
6
+ parameters: {
7
+ layout: 'centered',
8
+ },
9
+ };
10
+ export default meta;
11
+ /** Production mode — shows version only as dimmed text. */
12
+ export const Production = {
13
+ args: {
14
+ version: '1.90.0',
15
+ packageName: '@shepai/cli',
16
+ description: 'Autonomous AI Native SDLC Platform',
17
+ nodeVersion: 'v22.4.0',
18
+ platform: 'linux x64',
19
+ },
20
+ };
21
+ /** Development mode — shows "dev·<hash>" to clearly indicate non-stable build. */
22
+ export const Development = {
23
+ args: {
24
+ version: '1.90.0',
25
+ isDev: true,
26
+ branch: 'feat/version-badge',
27
+ commitHash: '5a84c148b3e2f1a9c7d6e8b4a2f1c3d5e7f9a1b3',
28
+ packageName: '@shepai/cli',
29
+ description: 'Autonomous AI Native SDLC Platform',
30
+ nodeVersion: 'v22.4.0',
31
+ platform: 'linux x64',
32
+ },
33
+ };
34
+ /** Development mode with a long branch name — shown in tooltip. */
35
+ export const LongBranch = {
36
+ args: {
37
+ version: '1.90.0',
38
+ isDev: true,
39
+ branch: 'feat/056-version-badge-with-tooltip-and-build-info',
40
+ commitHash: 'abc1234def5678',
41
+ packageName: '@shepai/cli',
42
+ description: 'Autonomous AI Native SDLC Platform',
43
+ },
44
+ };
45
+ /** Minimal info — no optional fields. */
46
+ export const Minimal = {
47
+ args: {
48
+ version: '1.0.0',
49
+ },
50
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,EAAE,eAAe,2CA6GjB"}
1
+ {"version":3,"file":"app-sidebar.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/layouts/app-sidebar/app-sidebar.tsx"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAE/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,EAAE,iBAAiB,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,EAAE,eAAe,2CAyHjB"}
@@ -7,6 +7,7 @@ import { ScrollArea } from '../../ui/scroll-area.js';
7
7
  import { SidebarNavItem } from '../../common/sidebar-nav-item/index.js';
8
8
  import { SidebarCollapseToggle } from '../../common/sidebar-collapse-toggle/index.js';
9
9
  import { ShepLogo } from '../../common/shep-logo/index.js';
10
+ import { VersionBadge } from '../../common/version-badge/index.js';
10
11
  import { FeatureListItem } from '../../common/feature-list-item/index.js';
11
12
  import { FeatureStatusGroup } from '../../common/feature-status-group/index.js';
12
13
  import { SidebarSectionHeader } from '../../common/sidebar-section-header/index.js';
@@ -26,7 +27,7 @@ export function AppSidebar({ features, featureFlags, onNewFeature, onFeatureClic
26
27
  'flex min-w-0 flex-1 items-center gap-2 overflow-hidden px-2',
27
28
  'transition-opacity duration-200 ease-out',
28
29
  expandedVisible ? 'opacity-100' : 'opacity-0',
29
- ].join(' '), "aria-hidden": !expandedVisible, children: [_jsx(ShepLogo, { className: "shrink-0", size: 20 }), _jsx("span", { className: "truncate text-sm font-semibold tracking-tight", children: "Shep" })] })) : null, _jsx(SidebarCollapseToggle, { className: "shrink-0 transition-all duration-200" })] }) }), _jsx(SidebarNavItem, { icon: Home, label: "Control Center", href: "/", active: pathname === '/' }), _jsx(SidebarNavItem, { icon: Wrench, label: "Tools", href: "/tools", active: pathname === '/tools' }), featureFlags.skills ? (_jsx(SidebarNavItem, { icon: Puzzle, label: "Skills", href: "/skills", active: pathname === '/skills' })) : null, _jsx(SidebarNavItem, { icon: Settings, label: "Settings", href: "/settings", active: pathname === '/settings' })] }) }), _jsx(SidebarContent, { children: showExpanded ? (_jsxs("div", { className: [
30
+ ].join(' '), "aria-hidden": !expandedVisible, children: [_jsx(ShepLogo, { className: "shrink-0", size: 20, variant: process.env.NODE_ENV === 'development' ? 'dev' : 'default' }), _jsx("span", { className: "truncate text-sm font-semibold tracking-tight", children: "Shep" }), _jsx(VersionBadge, { version: process.env.NEXT_PUBLIC_SHEP_VERSION ?? 'unknown', branch: process.env.NEXT_PUBLIC_SHEP_BRANCH, commitHash: process.env.NEXT_PUBLIC_SHEP_COMMIT, isDev: process.env.NODE_ENV === 'development', packageName: process.env.NEXT_PUBLIC_SHEP_PACKAGE_NAME, description: process.env.NEXT_PUBLIC_SHEP_DESCRIPTION })] })) : null, _jsx(SidebarCollapseToggle, { className: "shrink-0 transition-all duration-200" })] }) }), _jsx(SidebarNavItem, { icon: Home, label: "Control Center", href: "/", active: pathname === '/' }), _jsx(SidebarNavItem, { icon: Wrench, label: "Tools", href: "/tools", active: pathname === '/tools' }), featureFlags.skills ? (_jsx(SidebarNavItem, { icon: Puzzle, label: "Skills", href: "/skills", active: pathname === '/skills' })) : null, _jsx(SidebarNavItem, { icon: Settings, label: "Settings", href: "/settings", active: pathname === '/settings' })] }) }), _jsx(SidebarContent, { children: showExpanded ? (_jsxs("div", { className: [
30
31
  'min-w-0 overflow-hidden transition-opacity duration-200 ease-out',
31
32
  '[&_[data-sidebar=group-label]]:!mt-0 [&_[data-sidebar=group-label]]:!opacity-100 [&_[data-sidebar=group-label]]:!transition-none',
32
33
  expandedVisible ? 'opacity-100' : 'opacity-0',
@@ -6,6 +6,6 @@ import { usePathname } from 'next/navigation';
6
6
  */
7
7
  export function useSelectedFeatureId() {
8
8
  const pathname = usePathname();
9
- const match = pathname.match(/^\/feature\/(.+)$/);
9
+ const match = pathname.match(/^\/feature\/([^/]+)/);
10
10
  return match?.[1] ?? null;
11
11
  }
@@ -14,6 +14,8 @@ export interface VersionInfo {
14
14
  version: string;
15
15
  name: string;
16
16
  description: string;
17
+ branch: string;
18
+ commitHash: string;
17
19
  }
18
20
  /** System runtime information */
19
21
  export interface SystemInfo {