@shepai/cli 1.78.1 → 1.79.0

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 (292) hide show
  1. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.d.ts.map +1 -1
  2. package/dist/src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.js +14 -1
  3. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts +17 -0
  4. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.d.ts.map +1 -0
  5. package/dist/src/presentation/web/app/actions/get-feature-phase-timings.js +25 -0
  6. package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts +18 -0
  7. package/dist/src/presentation/web/app/actions/get-feature-plan.d.ts.map +1 -0
  8. package/dist/src/presentation/web/app/actions/get-feature-plan.js +31 -0
  9. package/dist/src/presentation/web/app/api/feature-logs/route.d.ts +16 -0
  10. package/dist/src/presentation/web/app/api/feature-logs/route.d.ts.map +1 -0
  11. package/dist/src/presentation/web/app/api/feature-logs/route.js +184 -0
  12. package/dist/src/presentation/web/app/build-feature-node-data.d.ts +7 -1
  13. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  14. package/dist/src/presentation/web/app/build-feature-node-data.js +7 -1
  15. package/dist/src/presentation/web/app/build-graph-nodes.js +7 -3
  16. package/dist/src/presentation/web/app/settings/page.js +1 -1
  17. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts +7 -19
  18. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.d.ts.map +1 -1
  19. package/dist/src/presentation/web/components/common/control-center-drawer/drawer-view.js +6 -6
  20. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  21. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +48 -85
  22. package/dist/src/presentation/web/components/common/feature-drawer/index.d.ts +1 -1
  23. package/dist/src/presentation/web/components/common/feature-drawer/index.d.ts.map +1 -1
  24. package/dist/src/presentation/web/components/common/feature-drawer/index.js +1 -1
  25. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts +8 -0
  26. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -0
  27. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +90 -0
  28. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts +20 -0
  29. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.d.ts.map +1 -0
  30. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.stories.js +252 -0
  31. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +31 -0
  32. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -0
  33. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +123 -0
  34. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.d.ts +20 -0
  35. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.d.ts.map +1 -0
  36. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.stories.js +315 -0
  37. package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.d.ts +3 -0
  38. package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.d.ts.map +1 -0
  39. package/dist/src/presentation/web/components/common/feature-drawer-tabs/index.js +1 -0
  40. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.d.ts +7 -0
  41. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.d.ts.map +1 -0
  42. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.js +35 -0
  43. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.stories.d.ts +18 -0
  44. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.stories.d.ts.map +1 -0
  45. package/dist/src/presentation/web/components/common/feature-drawer-tabs/log-tab.stories.js +89 -0
  46. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts +6 -0
  47. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -0
  48. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +78 -0
  49. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +28 -0
  50. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -0
  51. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +157 -0
  52. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts +8 -0
  53. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.d.ts.map +1 -0
  54. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.js +40 -0
  55. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts +22 -0
  56. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.d.ts.map +1 -0
  57. package/dist/src/presentation/web/components/common/feature-drawer-tabs/plan-tab.stories.js +188 -0
  58. package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts +30 -0
  59. package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.d.ts.map +1 -0
  60. package/dist/src/presentation/web/components/common/feature-drawer-tabs/use-tab-data-fetch.js +100 -0
  61. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +12 -0
  62. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  63. package/dist/src/presentation/web/components/common/index.d.ts +3 -4
  64. package/dist/src/presentation/web/components/common/index.d.ts.map +1 -1
  65. package/dist/src/presentation/web/components/common/index.js +3 -4
  66. package/dist/src/presentation/web/components/common/merge-review/index.d.ts +1 -2
  67. package/dist/src/presentation/web/components/common/merge-review/index.d.ts.map +1 -1
  68. package/dist/src/presentation/web/components/common/merge-review/index.js +0 -1
  69. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts +0 -8
  70. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.d.ts.map +1 -1
  71. package/dist/src/presentation/web/components/common/merge-review/merge-review.stories.js +1 -33
  72. package/dist/src/presentation/web/components/common/prd-questionnaire/index.d.ts +1 -2
  73. package/dist/src/presentation/web/components/common/prd-questionnaire/index.d.ts.map +1 -1
  74. package/dist/src/presentation/web/components/common/prd-questionnaire/index.js +0 -1
  75. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts +0 -10
  76. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.d.ts.map +1 -1
  77. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire.stories.js +1 -38
  78. package/dist/src/presentation/web/components/common/tech-decisions-review/index.d.ts +1 -2
  79. package/dist/src/presentation/web/components/common/tech-decisions-review/index.d.ts.map +1 -1
  80. package/dist/src/presentation/web/components/common/tech-decisions-review/index.js +0 -1
  81. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts +0 -8
  82. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.d.ts.map +1 -1
  83. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-review.stories.js +1 -29
  84. package/dist/src/presentation/web/components/features/settings/AgentModelPicker/index.js +2 -2
  85. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +9 -9
  86. package/dist/src/presentation/web/hooks/use-feature-logs.d.ts +7 -0
  87. package/dist/src/presentation/web/hooks/use-feature-logs.d.ts.map +1 -0
  88. package/dist/src/presentation/web/hooks/use-feature-logs.js +52 -0
  89. package/dist/tsconfig.build.tsbuildinfo +1 -1
  90. package/package.json +1 -1
  91. package/web/.next/BUILD_ID +1 -1
  92. package/web/.next/app-path-routes-manifest.json +1 -0
  93. package/web/.next/build-manifest.json +2 -2
  94. package/web/.next/fallback-build-manifest.json +2 -2
  95. package/web/.next/prerender-manifest.json +3 -3
  96. package/web/.next/required-server-files.js +1 -1
  97. package/web/.next/required-server-files.json +1 -1
  98. package/web/.next/routes-manifest.json +6 -0
  99. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
  100. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  101. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +68 -38
  103. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  104. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  105. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  106. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  107. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  108. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  109. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +18 -18
  110. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  111. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +68 -38
  113. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  114. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  115. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  117. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  118. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  120. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  121. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  122. package/web/.next/server/app/_global-error.html +2 -2
  123. package/web/.next/server/app/_global-error.rsc +1 -1
  124. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  125. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  126. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  127. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  128. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  129. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  130. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  131. package/web/.next/server/app/api/feature-logs/route/app-paths-manifest.json +3 -0
  132. package/web/.next/server/app/api/feature-logs/route/build-manifest.json +11 -0
  133. package/web/.next/server/app/api/feature-logs/route/server-reference-manifest.json +4 -0
  134. package/web/.next/server/app/api/feature-logs/route.js +6 -0
  135. package/web/.next/server/app/api/feature-logs/route.js.map +5 -0
  136. package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -0
  137. package/web/.next/server/app/api/feature-logs/route_client-reference-manifest.js +2 -0
  138. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  139. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  140. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  141. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  142. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  143. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  145. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  146. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  147. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  148. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  149. package/web/.next/server/app-paths-manifest.json +1 -0
  150. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_feature-logs_route_actions_177445e7.js +3 -0
  151. package/web/.next/server/chunks/744ca_web__next-internal_server_app_api_feature-logs_route_actions_177445e7.js.map +1 -0
  152. package/web/.next/server/chunks/[root-of-the-server]__91d44424._.js +12 -0
  153. package/web/.next/server/chunks/[root-of-the-server]__91d44424._.js.map +1 -0
  154. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  155. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  156. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  157. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  159. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  160. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  161. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  163. package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
  164. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  165. package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js +1 -1
  166. package/web/.next/server/chunks/ssr/[root-of-the-server]__6eb2a2b0._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a337ca5c._.js → [root-of-the-server]__ae824a5b._.js} +2 -2
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__ae824a5b._.js.map +1 -0
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js.map +1 -1
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js +1 -1
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3c963c6._.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js +2 -2
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/_1e3cf73b._.js +1 -1
  179. package/web/.next/server/chunks/ssr/_1e3cf73b._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/_34fbed18._.js +1 -1
  181. package/web/.next/server/chunks/ssr/_34fbed18._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/{_06db7efd._.js → _3e88ce9d._.js} +2 -2
  183. package/web/.next/server/chunks/ssr/{_06db7efd._.js.map → _3e88ce9d._.js.map} +1 -1
  184. package/web/.next/server/chunks/ssr/_5d4e7151._.js +3 -0
  185. package/web/.next/server/chunks/ssr/{_5c4ce700._.js.map → _5d4e7151._.js.map} +1 -1
  186. package/web/.next/server/chunks/ssr/_63868199._.js +1 -1
  187. package/web/.next/server/chunks/ssr/_63868199._.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/{_b0924a46._.js → _83cf28a3._.js} +2 -2
  189. package/web/.next/server/chunks/ssr/{_b0924a46._.js.map → _83cf28a3._.js.map} +1 -1
  190. package/web/.next/server/chunks/ssr/{_4031d614._.js → _887258d0._.js} +2 -2
  191. package/web/.next/server/chunks/ssr/{_4031d614._.js.map → _887258d0._.js.map} +1 -1
  192. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  193. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/_acb6a73d._.js +3 -0
  195. package/web/.next/server/chunks/ssr/{_a38f282a._.js.map → _acb6a73d._.js.map} +1 -1
  196. package/web/.next/server/chunks/ssr/{_5dab501b._.js → _ba97cfd3._.js} +2 -2
  197. package/web/.next/server/chunks/ssr/{_5dab501b._.js.map → _ba97cfd3._.js.map} +1 -1
  198. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  199. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  200. package/web/.next/server/chunks/ssr/node_modules__pnpm_d80c1060._.js +3 -0
  201. package/web/.next/server/chunks/ssr/node_modules__pnpm_d80c1060._.js.map +1 -0
  202. package/web/.next/server/chunks/ssr/src_presentation_web_7efa14ca._.js +3 -0
  203. package/web/.next/server/chunks/ssr/src_presentation_web_7efa14ca._.js.map +1 -0
  204. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  205. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  207. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  208. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  209. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +1 -1
  211. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/src_presentation_web_b59d79db._.js +3 -0
  213. package/web/.next/server/chunks/ssr/src_presentation_web_b59d79db._.js.map +1 -0
  214. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
  215. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
  216. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  217. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
  219. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +1 -1
  220. package/web/.next/server/pages/500.html +2 -2
  221. package/web/.next/server/server-reference-manifest.js +1 -1
  222. package/web/.next/server/server-reference-manifest.json +108 -64
  223. package/web/.next/static/chunks/{87152e918f80ea8b.js → 297458261f67218c.js} +1 -1
  224. package/web/.next/static/chunks/{1f57d0c949dbb44d.js → 2a24ac257fc1c10b.js} +1 -1
  225. package/web/.next/static/chunks/352e25e1bb2b9edb.js +1 -0
  226. package/web/.next/static/chunks/{8fe834f8a3c36e2f.js → 47ecde22e9663419.js} +2 -2
  227. package/web/.next/static/chunks/{27c4a8493483e6f3.js → 49743c83c9bced40.js} +1 -1
  228. package/web/.next/static/chunks/4b20d522b4f5ca7e.js +1 -0
  229. package/web/.next/static/chunks/{9d8c6c874071efb2.js → 5688494bf052915d.js} +1 -1
  230. package/web/.next/static/chunks/77a956d5dd063fef.js +1 -0
  231. package/web/.next/static/chunks/{78455afb0164395c.js → 8eff15a7f35164f9.js} +2 -2
  232. package/web/.next/static/chunks/96bab6d3820504f3.css +2 -0
  233. package/web/.next/static/chunks/a1c2ecb710b44081.js +1 -0
  234. package/web/.next/static/chunks/{6f7ba7846dcc8b21.js → d8d464c156573994.js} +1 -1
  235. package/web/.next/static/chunks/e29d1e26c2694f78.js +1 -0
  236. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts +0 -9
  237. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +0 -1
  238. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +0 -60
  239. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts +0 -47
  240. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.d.ts.map +0 -1
  241. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.stories.js +0 -307
  242. package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.d.ts +0 -3
  243. package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.d.ts.map +0 -1
  244. package/dist/src/presentation/web/components/common/merge-review/merge-review-drawer.js +0 -8
  245. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts +0 -3
  246. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.d.ts.map +0 -1
  247. package/dist/src/presentation/web/components/common/prd-questionnaire/prd-questionnaire-drawer.js +0 -8
  248. package/dist/src/presentation/web/components/common/review-drawer-shell/index.d.ts +0 -3
  249. package/dist/src/presentation/web/components/common/review-drawer-shell/index.d.ts.map +0 -1
  250. package/dist/src/presentation/web/components/common/review-drawer-shell/index.js +0 -1
  251. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts +0 -26
  252. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.d.ts.map +0 -1
  253. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell-config.js +0 -1
  254. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts +0 -3
  255. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +0 -1
  256. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +0 -29
  257. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts +0 -14
  258. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.d.ts.map +0 -1
  259. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.stories.js +0 -33
  260. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts +0 -3
  261. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.d.ts.map +0 -1
  262. package/dist/src/presentation/web/components/common/tech-decisions-review/tech-decisions-drawer.js +0 -8
  263. package/dist/src/presentation/web/components/common/tech-review-tabs/index.d.ts +0 -3
  264. package/dist/src/presentation/web/components/common/tech-review-tabs/index.d.ts.map +0 -1
  265. package/dist/src/presentation/web/components/common/tech-review-tabs/index.js +0 -1
  266. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.d.ts +0 -21
  267. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.d.ts.map +0 -1
  268. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs-config.js +0 -1
  269. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.d.ts +0 -3
  270. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.d.ts.map +0 -1
  271. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.js +0 -12
  272. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.stories.d.ts +0 -16
  273. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.stories.d.ts.map +0 -1
  274. package/dist/src/presentation/web/components/common/tech-review-tabs/tech-review-tabs.stories.js +0 -110
  275. package/web/.next/server/chunks/ssr/[root-of-the-server]__a337ca5c._.js.map +0 -1
  276. package/web/.next/server/chunks/ssr/_5c4ce700._.js +0 -3
  277. package/web/.next/server/chunks/ssr/_a38f282a._.js +0 -3
  278. package/web/.next/server/chunks/ssr/node_modules__pnpm_5412e589._.js +0 -3
  279. package/web/.next/server/chunks/ssr/node_modules__pnpm_5412e589._.js.map +0 -1
  280. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js +0 -3
  281. package/web/.next/server/chunks/ssr/src_presentation_web_30d7eeda._.js.map +0 -1
  282. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js +0 -3
  283. package/web/.next/server/chunks/ssr/src_presentation_web_565a14f8._.js.map +0 -1
  284. package/web/.next/static/chunks/08c0a9667c05866c.css +0 -2
  285. package/web/.next/static/chunks/0fb8038f7ad4d2cf.js +0 -1
  286. package/web/.next/static/chunks/1211dcaac5963f92.js +0 -1
  287. package/web/.next/static/chunks/6a3e8ea6e1fd2113.js +0 -1
  288. package/web/.next/static/chunks/7336f9ec160c7bd8.js +0 -1
  289. package/web/.next/static/chunks/ba8b2aaa356a5487.js +0 -1
  290. /package/web/.next/static/{M0oz1_1InoSyr7OMLAKf7 → hVGa8-vd4pFs9splpgq-k}/_buildManifest.js +0 -0
  291. /package/web/.next/static/{M0oz1_1InoSyr7OMLAKf7 → hVGa8-vd4pFs9splpgq-k}/_clientMiddlewareManifest.json +0 -0
  292. /package/web/.next/static/{M0oz1_1InoSyr7OMLAKf7 → hVGa8-vd4pFs9splpgq-k}/_ssgManifest.js +0 -0
@@ -0,0 +1,315 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { PrStatus, CiStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
3
+ import { FeatureDrawerTabs } from './feature-drawer-tabs.js';
4
+ const meta = {
5
+ title: 'Drawers/Feature/Tabs/FeatureDrawerTabs',
6
+ component: FeatureDrawerTabs,
7
+ tags: ['autodocs'],
8
+ parameters: {
9
+ layout: 'fullscreen',
10
+ },
11
+ decorators: [
12
+ (Story) => (_jsx("div", { style: { height: '600px', width: '400px', border: '1px solid var(--color-border)' }, children: _jsx(Story, {}) })),
13
+ ],
14
+ };
15
+ export default meta;
16
+ /* ---------------------------------------------------------------------------
17
+ * Data fixtures
18
+ * ------------------------------------------------------------------------- */
19
+ const runningFeature = {
20
+ name: 'Auth Module',
21
+ description: 'Implement OAuth2 authentication flow with multiple providers',
22
+ featureId: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
23
+ lifecycle: 'implementation',
24
+ state: 'running',
25
+ progress: 65,
26
+ agentType: 'claude-code',
27
+ runtime: '2h 15m',
28
+ repositoryPath: '/home/user/my-repo',
29
+ branch: 'feat/auth-module',
30
+ oneLiner: 'implement oauth2 authentication flow with google and github providers',
31
+ userQuery: 'add oauth2 authentication with google and github',
32
+ summary: 'Implement OAuth2 authentication flow with multiple providers including Google, GitHub, and custom OIDC',
33
+ createdAt: Date.now() - 2 * 60 * 60 * 1000, // 2 hours ago
34
+ repositoryName: 'my-repo',
35
+ baseBranch: 'main',
36
+ pr: {
37
+ url: 'https://github.com/org/repo/pull/42',
38
+ number: 42,
39
+ status: PrStatus.Open,
40
+ ciStatus: CiStatus.Pending,
41
+ commitHash: 'abc1234567890def',
42
+ },
43
+ };
44
+ const doneFeature = {
45
+ name: 'Payment Gateway',
46
+ description: 'Stripe integration for subscriptions',
47
+ featureId: 'b2c3d4e5-f6a7-8901-bcde-f23456789012',
48
+ lifecycle: 'deploy',
49
+ state: 'done',
50
+ progress: 100,
51
+ runtime: '1h 42m',
52
+ repositoryPath: '/home/user/my-repo',
53
+ branch: 'feat/payment-gateway',
54
+ oneLiner: 'stripe payment gateway integration for subscriptions and one-time purchases',
55
+ userQuery: 'integrate stripe for payments',
56
+ summary: 'Stripe integration for subscriptions and one-time payments',
57
+ createdAt: Date.now() - 3 * 24 * 60 * 60 * 1000, // 3 days ago
58
+ repositoryName: 'my-repo',
59
+ baseBranch: 'main',
60
+ pr: {
61
+ url: 'https://github.com/org/repo/pull/55',
62
+ number: 55,
63
+ status: PrStatus.Merged,
64
+ ciStatus: CiStatus.Success,
65
+ commitHash: 'def4567890abc123',
66
+ },
67
+ };
68
+ const requirementsFeature = {
69
+ name: 'API Rate Limiting',
70
+ description: 'Implement sliding window rate limiting for public endpoints',
71
+ featureId: 'c3d4e5f6-a7b8-9012-cdef-345678901234',
72
+ lifecycle: 'requirements',
73
+ state: 'action-required',
74
+ progress: 0,
75
+ repositoryPath: '/home/user/my-repo',
76
+ branch: 'feat/api-rate-limiting',
77
+ oneLiner: 'sliding window rate limiter for all public-facing api endpoints',
78
+ userQuery: 'add rate limiting to public api endpoints',
79
+ summary: 'Implement sliding window rate limiting for public endpoints',
80
+ createdAt: Date.now() - 30 * 60 * 1000, // 30 minutes ago
81
+ repositoryName: 'my-repo',
82
+ baseBranch: 'main',
83
+ };
84
+ const techReviewFeature = {
85
+ name: 'Agent Executor',
86
+ description: 'Abstraction layer for multiple AI agent backends',
87
+ featureId: 'd4e5f6a7-b8c9-0123-defa-456789012345',
88
+ lifecycle: 'implementation',
89
+ state: 'action-required',
90
+ progress: 25,
91
+ repositoryPath: '/home/user/my-repo',
92
+ branch: 'feat/agent-executor',
93
+ oneLiner: 'agent executor abstraction layer supporting multiple ai backends',
94
+ userQuery: 'abstract agent executors for multi-backend support',
95
+ summary: 'Abstraction layer for multiple AI agent backends',
96
+ createdAt: Date.now() - 5 * 60 * 60 * 1000, // 5 hours ago
97
+ repositoryName: 'my-repo',
98
+ baseBranch: 'develop',
99
+ };
100
+ const mergeReviewFeature = {
101
+ name: 'Auth Module',
102
+ description: 'OAuth2 authentication flow',
103
+ featureId: 'e5f6a7b8-c9d0-1234-efab-567890123456',
104
+ lifecycle: 'review',
105
+ state: 'action-required',
106
+ progress: 90,
107
+ repositoryPath: '/home/user/my-repo',
108
+ branch: 'feat/auth-module',
109
+ oneLiner: 'oauth2 login flow with google and github identity providers',
110
+ userQuery: 'add oauth2 login flow',
111
+ summary: 'OAuth2 authentication flow with Google and GitHub providers',
112
+ createdAt: Date.now() - 2 * 24 * 60 * 60 * 1000, // 2 days ago
113
+ repositoryName: 'my-repo',
114
+ baseBranch: 'main',
115
+ pr: {
116
+ url: 'https://github.com/shep-ai/cli/pull/42',
117
+ number: 42,
118
+ status: PrStatus.Open,
119
+ ciStatus: CiStatus.Success,
120
+ commitHash: 'a1b2c3d4e5f6789',
121
+ },
122
+ };
123
+ const errorFeature = {
124
+ name: 'Email Service',
125
+ description: 'Transactional email with SendGrid',
126
+ featureId: 'f6a7b8c9-d0e1-2345-fabc-678901234567',
127
+ lifecycle: 'review',
128
+ state: 'error',
129
+ progress: 30,
130
+ errorMessage: 'Build failed: type mismatch in EmailHandler',
131
+ repositoryPath: '/home/user/my-repo',
132
+ branch: 'feat/email-service',
133
+ oneLiner: 'sendgrid-based transactional email service for notifications and alerts',
134
+ userQuery: 'set up sendgrid for transactional emails',
135
+ summary: 'Transactional email with SendGrid for notifications and alerts',
136
+ createdAt: Date.now() - 7 * 24 * 60 * 60 * 1000, // 1 week ago
137
+ repositoryName: 'my-repo',
138
+ baseBranch: 'main',
139
+ };
140
+ /* ---------------------------------------------------------------------------
141
+ * Review data fixtures
142
+ * ------------------------------------------------------------------------- */
143
+ const prdFixture = {
144
+ question: 'Review Feature Requirements',
145
+ context: 'Please review the AI-generated requirements below.',
146
+ questions: [
147
+ {
148
+ id: 'problem',
149
+ question: 'What specific problem does this feature solve?',
150
+ type: 'select',
151
+ options: [
152
+ {
153
+ id: 'user_pain',
154
+ label: 'User Pain Point',
155
+ rationale: 'Addresses a recurring user complaint',
156
+ recommended: true,
157
+ },
158
+ { id: 'market_gap', label: 'Market Gap', rationale: 'Fills a gap vs competitors' },
159
+ {
160
+ id: 'tech_debt',
161
+ label: 'Technical Debt',
162
+ rationale: 'Reduces accumulated technical debt',
163
+ },
164
+ ],
165
+ },
166
+ {
167
+ id: 'priority',
168
+ question: 'What is the business priority level?',
169
+ type: 'select',
170
+ options: [
171
+ { id: 'p0', label: 'P0 - Critical', rationale: 'Blocking issue, must fix immediately' },
172
+ {
173
+ id: 'p1',
174
+ label: 'P1 - High',
175
+ rationale: 'Important for next release',
176
+ recommended: true,
177
+ },
178
+ { id: 'p2', label: 'P2 - Medium', rationale: 'Nice to have' },
179
+ ],
180
+ },
181
+ ],
182
+ finalAction: {
183
+ id: 'approve-reqs',
184
+ label: 'Approve Requirements',
185
+ description: 'Finalize and lock the requirements for implementation',
186
+ },
187
+ };
188
+ const techFixture = {
189
+ name: 'Agent Executor Abstraction',
190
+ summary: 'Research into the best approach for abstracting agent executors.',
191
+ technologies: ['TypeScript', 'tsyringe', 'LangGraph'],
192
+ decisions: [
193
+ {
194
+ title: 'Agent Execution Framework',
195
+ chosen: 'LangGraph',
196
+ rejected: ['Custom state machine', 'Temporal.io'],
197
+ rationale: 'LangGraph provides built-in checkpointing and human-in-the-loop support.',
198
+ },
199
+ {
200
+ title: 'Dependency Injection',
201
+ chosen: 'tsyringe',
202
+ rejected: ['InversifyJS', 'Manual DI'],
203
+ rationale: 'Lightweight, uses standard decorators, minimal overhead.',
204
+ },
205
+ ],
206
+ };
207
+ const productFixture = {
208
+ question: 'Goal',
209
+ context: 'Add user authentication to the application',
210
+ questions: [
211
+ {
212
+ question: 'Which authentication strategy should we use?',
213
+ selectedOption: 'OAuth 2.0',
214
+ rationale: 'Industry standard with broad provider support.',
215
+ wasRecommended: true,
216
+ },
217
+ {
218
+ question: 'How should we handle session management?',
219
+ selectedOption: 'JWT tokens',
220
+ rationale: 'Stateless and scalable across services.',
221
+ wasRecommended: false,
222
+ },
223
+ ],
224
+ };
225
+ const mergeFixture = {
226
+ pr: {
227
+ url: 'https://github.com/shep-ai/cli/pull/42',
228
+ number: 42,
229
+ status: PrStatus.Open,
230
+ commitHash: 'a1b2c3d4e5f6789',
231
+ ciStatus: CiStatus.Success,
232
+ },
233
+ branch: { source: 'feat/add-auth', target: 'main' },
234
+ phases: [
235
+ { id: 'phase-1', name: 'Foundation & Config', description: 'Set up types and server action' },
236
+ { id: 'phase-2', name: 'Component Implementation', description: 'Build the merge review UI' },
237
+ ],
238
+ diffSummary: { filesChanged: 12, additions: 340, deletions: 85, commitCount: 5 },
239
+ };
240
+ /* ---------------------------------------------------------------------------
241
+ * Stories
242
+ *
243
+ * Note: In Storybook, server actions are mocked and return error states.
244
+ * The Overview tab renders fully since it uses FeatureNodeData (no server action).
245
+ * Activity and Plan tabs show error states from the mocked actions.
246
+ * The Log tab shows empty/disconnected state (no EventSource in Storybook).
247
+ * See individual tab stories (ActivityTab, LogTab, PlanTab) for populated states.
248
+ * ------------------------------------------------------------------------- */
249
+ /** Default — running feature with full data. Overview tab active. */
250
+ export const Default = {
251
+ args: {
252
+ featureNode: runningFeature,
253
+ featureId: runningFeature.featureId,
254
+ },
255
+ };
256
+ /** Completed feature in deploy phase with merged PR. */
257
+ export const CompletedFeature = {
258
+ args: {
259
+ featureNode: doneFeature,
260
+ featureId: doneFeature.featureId,
261
+ },
262
+ };
263
+ /** Early-stage feature in requirements phase, no progress. */
264
+ export const RequirementsPhase = {
265
+ args: {
266
+ featureNode: requirementsFeature,
267
+ featureId: requirementsFeature.featureId,
268
+ },
269
+ };
270
+ /** Feature in error state. */
271
+ export const ErrorState = {
272
+ args: {
273
+ featureNode: errorFeature,
274
+ featureId: errorFeature.featureId,
275
+ },
276
+ };
277
+ /* ---------------------------------------------------------------------------
278
+ * Review tab stories
279
+ * ------------------------------------------------------------------------- */
280
+ /** PRD Review tab active — requirements lifecycle, action-required state. */
281
+ export const PrdReviewActive = {
282
+ args: {
283
+ featureNode: requirementsFeature,
284
+ featureId: requirementsFeature.featureId,
285
+ initialTab: 'prd-review',
286
+ prdData: prdFixture,
287
+ prdSelections: { problem: 'user_pain', priority: 'p1' },
288
+ onPrdSelect: () => undefined,
289
+ onPrdApprove: () => undefined,
290
+ onPrdReject: () => undefined,
291
+ },
292
+ };
293
+ /** Tech Decisions tab active — implementation lifecycle, action-required state. */
294
+ export const TechReviewActive = {
295
+ args: {
296
+ featureNode: techReviewFeature,
297
+ featureId: techReviewFeature.featureId,
298
+ initialTab: 'tech-decisions',
299
+ techData: techFixture,
300
+ productData: productFixture,
301
+ onTechApprove: () => undefined,
302
+ onTechReject: () => undefined,
303
+ },
304
+ };
305
+ /** Merge Review tab active — review lifecycle, action-required state. */
306
+ export const MergeReviewActive = {
307
+ args: {
308
+ featureNode: mergeReviewFeature,
309
+ featureId: mergeReviewFeature.featureId,
310
+ initialTab: 'merge-review',
311
+ mergeData: mergeFixture,
312
+ onMergeApprove: () => undefined,
313
+ onMergeReject: () => undefined,
314
+ },
315
+ };
@@ -0,0 +1,3 @@
1
+ export { FeatureDrawerTabs } from './feature-drawer-tabs.js';
2
+ export type { FeatureDrawerTabsProps } from './feature-drawer-tabs.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1 @@
1
+ export { FeatureDrawerTabs } from './feature-drawer-tabs.js';
@@ -0,0 +1,7 @@
1
+ export interface LogTabProps {
2
+ content: string;
3
+ isConnected: boolean;
4
+ error: string | null;
5
+ }
6
+ export declare function LogTab({ content, isConnected, error }: LogTabProps): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=log-tab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/log-tab.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,wBAAgB,MAAM,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,WAAW,2CA6ElE"}
@@ -0,0 +1,35 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useRef, useEffect, useState, useCallback } from 'react';
4
+ import { AlertCircle, Terminal, ArrowDown } from 'lucide-react';
5
+ export function LogTab({ content, isConnected, error }) {
6
+ const containerRef = useRef(null);
7
+ const [autoScroll, setAutoScroll] = useState(true);
8
+ const handleScroll = useCallback(() => {
9
+ const el = containerRef.current;
10
+ if (!el)
11
+ return;
12
+ const isAtBottom = el.scrollHeight - el.scrollTop - el.clientHeight < 40;
13
+ setAutoScroll(isAtBottom);
14
+ }, []);
15
+ const jumpToBottom = useCallback(() => {
16
+ const el = containerRef.current;
17
+ if (!el)
18
+ return;
19
+ el.scrollTop = el.scrollHeight;
20
+ setAutoScroll(true);
21
+ }, []);
22
+ // Auto-scroll when new content arrives (only if auto-scroll is active)
23
+ useEffect(() => {
24
+ if (autoScroll && containerRef.current) {
25
+ containerRef.current.scrollTop = containerRef.current.scrollHeight;
26
+ }
27
+ }, [content, autoScroll]);
28
+ if (error) {
29
+ return (_jsxs("div", { className: "flex items-center gap-2 p-4 text-sm text-red-600", children: [_jsx(AlertCircle, { className: "h-4 w-4 shrink-0" }), _jsx("span", { children: error })] }));
30
+ }
31
+ if (!content) {
32
+ return (_jsxs("div", { className: "flex flex-col items-center justify-center gap-2 p-8", children: [_jsx(Terminal, { className: "text-muted-foreground h-8 w-8" }), _jsx("p", { className: "text-muted-foreground text-sm", children: "No log output yet" }), isConnected ? (_jsx("p", { className: "text-muted-foreground text-xs", children: "Waiting for log data..." })) : null] }));
33
+ }
34
+ return (_jsxs("div", { className: "flex h-full flex-col", "data-testid": "log-tab", children: [_jsxs("div", { className: "flex items-center gap-2 border-b px-3 py-1.5", children: [_jsx("span", { className: `h-2 w-2 rounded-full ${isConnected ? 'bg-emerald-500' : 'bg-zinc-400'}` }), _jsx("span", { className: "text-muted-foreground text-xs", children: isConnected ? 'Live' : 'Disconnected' }), !autoScroll ? (_jsxs("button", { type: "button", onClick: jumpToBottom, className: "text-muted-foreground hover:text-foreground ml-auto flex items-center gap-1 text-xs", children: [_jsx(ArrowDown, { className: "h-3 w-3" }), "Jump to bottom"] })) : null] }), _jsx("div", { ref: containerRef, onScroll: handleScroll, className: "flex-1 overflow-y-auto bg-zinc-950 p-3 font-mono text-xs leading-relaxed break-all whitespace-pre-wrap text-zinc-300", children: content })] }));
35
+ }
@@ -0,0 +1,18 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { LogTab } from './log-tab.js';
3
+ declare const meta: Meta<typeof LogTab>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof LogTab>;
6
+ /** Default — typical agent log output with live connection. */
7
+ export declare const Default: Story;
8
+ /** LongLog — 200 lines of log output to test scrolling behavior. */
9
+ export declare const LongLog: Story;
10
+ /** Disconnected — log content present but connection is lost. */
11
+ export declare const Disconnected: Story;
12
+ /** Empty — no log content yet, connected and waiting. */
13
+ export declare const Empty: Story;
14
+ /** EmptyDisconnected — no log content and not connected. */
15
+ export declare const EmptyDisconnected: Story;
16
+ /** Error — error message displayed when connection fails. */
17
+ export declare const Error: Story;
18
+ //# sourceMappingURL=log-tab.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/log-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,MAAM,CAc7B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,MAAM,CAAC,CAAC;AAqCrC,+DAA+D;AAC/D,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,oEAAoE;AACpE,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,iEAAiE;AACjE,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,iBAAiB,EAAE,KAM/B,CAAC;AAEF,6DAA6D;AAC7D,eAAO,MAAM,KAAK,EAAE,KAMnB,CAAC"}
@@ -0,0 +1,89 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { LogTab } from './log-tab.js';
3
+ const meta = {
4
+ title: 'Drawers/Feature/Tabs/LogTab',
5
+ component: LogTab,
6
+ tags: ['autodocs'],
7
+ parameters: {
8
+ layout: 'fullscreen',
9
+ },
10
+ decorators: [
11
+ (Story) => (_jsx("div", { style: { height: '600px', width: '400px', border: '1px solid var(--color-border)' }, children: _jsx(Story, {}) })),
12
+ ],
13
+ };
14
+ export default meta;
15
+ /* ---------------------------------------------------------------------------
16
+ * Data fixtures
17
+ * ------------------------------------------------------------------------- */
18
+ const typicalLogContent = `[2026-03-08T10:00:01.123Z] Starting agent run for feature "auth-module"
19
+ [2026-03-08T10:00:02.789Z] Agent started — analyzing codebase
20
+ [2026-03-08T10:00:03.456Z] Scanning repository structure...
21
+ [2026-03-08T10:00:04.012Z] Found 127 source files across 14 packages
22
+ [2026-03-08T10:00:05.234Z] Identified entry points: src/index.ts, src/auth/providers.ts
23
+ [2026-03-08T10:00:06.890Z] Running dependency analysis...
24
+ [2026-03-08T10:00:08.345Z] Resolved 42 internal dependencies
25
+ [2026-03-08T10:00:09.567Z] Generating implementation plan...
26
+ [2026-03-08T10:00:11.123Z] Plan generated — 3 phases, 8 tasks
27
+ [2026-03-08T10:00:12.789Z] Phase 1: scaffold auth module structure
28
+ [2026-03-08T10:00:14.456Z] Creating src/auth/oauth-provider.ts
29
+ [2026-03-08T10:00:15.012Z] Creating src/auth/token-manager.ts
30
+ [2026-03-08T10:00:16.234Z] Phase 1 complete — 2 files created
31
+ [2026-03-08T10:00:17.890Z] Phase 2: implement OAuth2 flow
32
+ [2026-03-08T10:00:19.345Z] Writing Google OAuth provider...
33
+ [2026-03-08T10:00:21.567Z] Writing GitHub OAuth provider...
34
+ [2026-03-08T10:00:23.123Z] Phase 2 complete — providers implemented
35
+ [2026-03-08T10:00:24.789Z] Phase 3: add tests and documentation
36
+ [2026-03-08T10:00:26.456Z] Generating test suite...
37
+ [2026-03-08T10:00:28.012Z] All phases complete — feature "auth-module" ready for review`;
38
+ const longLogContent = Array.from({ length: 200 }, (_, i) => `[2026-03-08T10:${String(Math.floor(i / 60)).padStart(2, '0')}:${String(i % 60).padStart(2, '0')}.${String((i * 7) % 1000).padStart(3, '0')}Z] Step ${i + 1}: processing task batch ${Math.floor(i / 10) + 1} — file ${i + 1} of 200`).join('\n');
39
+ /* ---------------------------------------------------------------------------
40
+ * Stories
41
+ * ------------------------------------------------------------------------- */
42
+ /** Default — typical agent log output with live connection. */
43
+ export const Default = {
44
+ args: {
45
+ content: typicalLogContent,
46
+ isConnected: true,
47
+ error: null,
48
+ },
49
+ };
50
+ /** LongLog — 200 lines of log output to test scrolling behavior. */
51
+ export const LongLog = {
52
+ args: {
53
+ content: longLogContent,
54
+ isConnected: true,
55
+ error: null,
56
+ },
57
+ };
58
+ /** Disconnected — log content present but connection is lost. */
59
+ export const Disconnected = {
60
+ args: {
61
+ content: typicalLogContent,
62
+ isConnected: false,
63
+ error: null,
64
+ },
65
+ };
66
+ /** Empty — no log content yet, connected and waiting. */
67
+ export const Empty = {
68
+ args: {
69
+ content: '',
70
+ isConnected: true,
71
+ error: null,
72
+ },
73
+ };
74
+ /** EmptyDisconnected — no log content and not connected. */
75
+ export const EmptyDisconnected = {
76
+ args: {
77
+ content: '',
78
+ isConnected: false,
79
+ error: null,
80
+ },
81
+ };
82
+ /** Error — error message displayed when connection fails. */
83
+ export const Error = {
84
+ args: {
85
+ content: '',
86
+ isConnected: false,
87
+ error: 'WebSocket connection lost. Unable to stream agent logs.',
88
+ },
89
+ };
@@ -0,0 +1,6 @@
1
+ import type { FeatureNodeData } from '../../common/feature-node/index.js';
2
+ export interface OverviewTabProps {
3
+ data: FeatureNodeData;
4
+ }
5
+ export declare function OverviewTab({ data }: OverviewTabProps): import("react/jsx-runtime").JSX.Element;
6
+ //# sourceMappingURL=overview-tab.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overview-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAMxE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,2CAoCrD"}
@@ -0,0 +1,78 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { ExternalLink, GitBranch, GitCommitHorizontal } from 'lucide-react';
4
+ import { PrStatus } from '../../../../../../packages/core/src/domain/generated/output.js';
5
+ import { cn } from '../../../lib/utils.js';
6
+ import { Badge } from '../../ui/badge.js';
7
+ import { Separator } from '../../ui/separator.js';
8
+ import { CiStatusBadge } from '../../common/ci-status-badge/index.js';
9
+ import { CometSpinner } from '../../ui/comet-spinner.js';
10
+ import { featureNodeStateConfig, lifecycleDisplayLabels } from '../../common/feature-node/index.js';
11
+ import { getAgentTypeIcon, agentTypeLabels, } from '../../common/feature-node/agent-type-icons.js';
12
+ export function OverviewTab({ data }) {
13
+ return (_jsxs(_Fragment, { children: [_jsxs("div", { "data-testid": "feature-drawer-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: lifecycleDisplayLabels[data.lifecycle] }), _jsx(FeatureStateBadge, { data: data }), data.progress > 0 ? (_jsxs("div", { "data-testid": "feature-drawer-progress", className: "flex flex-col gap-1", children: [_jsxs("div", { className: "text-muted-foreground flex items-center justify-between text-xs", children: [_jsx("span", { children: "Progress" }), _jsxs("span", { children: [data.progress, "%"] })] }), _jsx("div", { className: "bg-muted h-2 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', featureNodeStateConfig[data.state].progressClass), style: { width: `${data.progress}%` } }) })] })) : null] }), _jsx(FeatureInfo, { data: data }), data.pr ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsx(FeaturePrInfo, { pr: data.pr })] })) : null, _jsx(FeatureDetails, { data: data })] }));
14
+ }
15
+ function FeatureStateBadge({ data }) {
16
+ const config = featureNodeStateConfig[data.state];
17
+ const Icon = config.icon;
18
+ return (_jsxs("div", { className: cn('flex items-center gap-2 rounded-full px-3 py-1.5 text-sm font-medium', config.badgeBgClass, config.badgeClass), children: [data.state === 'running' ? (_jsx(CometSpinner, { size: "sm", className: "shrink-0" })) : (_jsx(Icon, { className: "h-4 w-4 shrink-0" })), _jsx("span", { children: config.label })] }));
19
+ }
20
+ // ── Feature Info section ─────────────────────────────────────────────
21
+ function formatRelativeTime(timestamp) {
22
+ const now = Date.now();
23
+ const time = typeof timestamp === 'string' ? new Date(timestamp).getTime() : timestamp;
24
+ const diffMs = now - time;
25
+ const diffSec = Math.floor(diffMs / 1000);
26
+ const diffMin = Math.floor(diffSec / 60);
27
+ const diffHr = Math.floor(diffMin / 60);
28
+ const diffDay = Math.floor(diffHr / 24);
29
+ if (diffDay > 30) {
30
+ return new Date(time).toLocaleDateString(undefined, {
31
+ year: 'numeric',
32
+ month: 'short',
33
+ day: 'numeric',
34
+ });
35
+ }
36
+ if (diffDay > 0)
37
+ return `${diffDay} day${diffDay === 1 ? '' : 's'} ago`;
38
+ if (diffHr > 0)
39
+ return `${diffHr} hour${diffHr === 1 ? '' : 's'} ago`;
40
+ if (diffMin > 0)
41
+ return `${diffMin} minute${diffMin === 1 ? '' : 's'} ago`;
42
+ return 'just now';
43
+ }
44
+ function FeatureInfo({ data }) {
45
+ const repoName = data.repositoryName ?? data.repositoryPath.split('/').filter(Boolean).at(-1) ?? '';
46
+ const hasInfo = Boolean(repoName) ||
47
+ Boolean(data.branch) ||
48
+ Boolean(data.summary) ||
49
+ Boolean(data.userQuery) ||
50
+ Boolean(data.createdAt);
51
+ if (!hasInfo)
52
+ return null;
53
+ return (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { "data-testid": "feature-drawer-info", className: "flex flex-col gap-3 p-4", children: [repoName ? _jsx(DetailRow, { label: "Repository", value: repoName }) : null, data.branch ? (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Branch" }), _jsxs("span", { className: "flex items-center gap-1.5 text-sm", children: [_jsx(GitBranch, { className: "text-muted-foreground h-3.5 w-3.5 shrink-0" }), _jsx("code", { className: "bg-muted rounded px-1 py-0.5 font-mono text-xs", children: data.branch }), data.baseBranch ? (_jsxs("span", { className: "text-muted-foreground text-xs", children: ["from ", data.baseBranch] })) : null] })] })) : null, data.userQuery ? (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "User Query" }), _jsx("span", { className: "text-sm leading-relaxed", children: data.userQuery })] })) : null, data.summary ? (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Summary" }), _jsx("span", { className: "text-sm leading-relaxed", children: data.summary })] })) : null, data.createdAt ? (_jsx(DetailRow, { label: "Created", value: formatRelativeTime(data.createdAt) })) : null] })] }));
54
+ }
55
+ // ── PR Info section ──────────────────────────────────────────────────
56
+ const prStatusStyles = {
57
+ [PrStatus.Open]: 'border-transparent bg-blue-50 text-blue-700 hover:bg-blue-50',
58
+ [PrStatus.Merged]: 'border-transparent bg-purple-50 text-purple-700 hover:bg-purple-50',
59
+ [PrStatus.Closed]: 'border-transparent bg-red-50 text-red-700 hover:bg-red-50',
60
+ };
61
+ function FeaturePrInfo({ pr }) {
62
+ return (_jsx("div", { "data-testid": "feature-drawer-pr", className: "border-border mx-4 rounded-lg border", children: _jsxs("div", { className: "space-y-3 px-4 py-3", children: [_jsxs("div", { className: "flex items-center justify-between", children: [_jsxs("a", { href: pr.url, target: "_blank", rel: "noopener noreferrer", className: "text-primary flex items-center gap-1.5 text-sm font-semibold underline underline-offset-2", children: ["PR #", pr.number, _jsx(ExternalLink, { className: "h-3.5 w-3.5" })] }), _jsx(Badge, { className: prStatusStyles[pr.status], children: pr.status })] }), pr.ciStatus ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "CI Status" }), _jsx(CiStatusBadge, { status: pr.ciStatus })] })) : null, pr.commitHash ? (_jsxs("div", { className: "flex items-center justify-between", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Commit" }), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(GitCommitHorizontal, { className: "text-muted-foreground h-3.5 w-3.5" }), _jsx("code", { className: "bg-muted text-foreground rounded-md px-1.5 py-0.5 font-mono text-[11px]", children: pr.commitHash.slice(0, 7) })] })] })) : null] }) }));
63
+ }
64
+ // ── Details section ──────────────────────────────────────────────────
65
+ function FeatureDetails({ data }) {
66
+ const hasAnyDetail = data.agentType ?? data.runtime ?? data.blockedBy ?? data.errorMessage;
67
+ if (!hasAnyDetail)
68
+ return null;
69
+ return (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { "data-testid": "feature-drawer-details", className: "flex flex-col gap-3 p-4", children: [data.agentType ? _jsx(AgentDetailRow, { agentType: data.agentType }) : null, data.runtime ? _jsx(DetailRow, { label: "Runtime", value: data.runtime }) : null, data.blockedBy ? _jsx(DetailRow, { label: "Blocked by", value: data.blockedBy }) : null, data.errorMessage ? _jsx(DetailRow, { label: "Error", value: data.errorMessage }) : null] })] }));
70
+ }
71
+ function AgentDetailRow({ agentType }) {
72
+ const Icon = getAgentTypeIcon(agentType);
73
+ const label = agentTypeLabels[agentType] ?? agentType;
74
+ return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Agent" }), _jsxs("span", { className: "flex items-center gap-2 text-sm", children: [_jsx(Icon, { className: "h-4 w-4 shrink-0" }), label] })] }));
75
+ }
76
+ function DetailRow({ label, value }) {
77
+ return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: label }), _jsx("span", { className: "text-sm", children: value })] }));
78
+ }
@@ -0,0 +1,28 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { OverviewTab } from './overview-tab.js';
3
+ declare const meta: Meta<typeof OverviewTab>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof OverviewTab>;
6
+ /** Default — full data with status, progress, PR card, and details. */
7
+ export declare const Default: Story;
8
+ /** Feature with no PR — PR card is hidden. */
9
+ export declare const NoPr: Story;
10
+ /** Feature with 0% progress — progress bar is hidden. */
11
+ export declare const NoProgress: Story;
12
+ /** Completed feature in deploy phase with merged PR. */
13
+ export declare const DoneWithMergedPr: Story;
14
+ /** Blocked feature showing blocked-by detail. */
15
+ export declare const Blocked: Story;
16
+ /** Error state showing error message detail. */
17
+ export declare const Error: Story;
18
+ /** Minimal data — only required fields, no optional details or PR. */
19
+ export declare const Minimal: Story;
20
+ /** Requirements phase. */
21
+ export declare const RequirementsPhase: Story;
22
+ /** Research phase. */
23
+ export declare const ResearchPhase: Story;
24
+ /** Review phase. */
25
+ export declare const ReviewPhase: Story;
26
+ /** Maintain phase. */
27
+ export declare const MaintainPhase: Story;
28
+ //# sourceMappingURL=overview-tab.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overview-tab.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,WAAW,CAclC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,WAAW,CAAC,CAAC;AA0G1C,uEAAuE;AACvE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,8CAA8C;AAC9C,eAAO,MAAM,IAAI,EAAE,KAElB,CAAC;AAEF,yDAAyD;AACzD,eAAO,MAAM,UAAU,EAAE,KAExB,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,gBAAgB,EAAE,KAE9B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,KAAK,EAAE,KAEnB,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAMF,0BAA0B;AAC1B,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC;AAEF,oBAAoB;AACpB,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,sBAAsB;AACtB,eAAO,MAAM,aAAa,EAAE,KAE3B,CAAC"}