@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
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.tsx"],"names":[],"mappings":"AAOA,oEAAoE;AACpE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,UAAU,sBAAsB;IAC9B,MAAM,EAAE,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxC;AAED,wBAA8B,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,sBAAsB,2DA+BjF"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/presentation/web/app/(dashboard)/@drawer/feature/[featureId]/page.tsx"],"names":[],"mappings":"AAUA,oEAAoE;AACpE,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,UAAU,sBAAsB;IAC9B,MAAM,EAAE,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxC;AAED,wBAA8B,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,sBAAsB,2DA6CjF"}
@@ -10,11 +10,24 @@ export default async function FeatureDrawerPage({ params }) {
10
10
  try {
11
11
  const featureRepo = resolve('IFeatureRepository');
12
12
  const agentRunRepo = resolve('IAgentRunRepository');
13
+ const repoRepo = resolve('IRepositoryRepository');
14
+ const gitPrService = resolve('IGitPrService');
13
15
  const feature = await featureRepo.findById(featureId);
14
16
  if (!feature)
15
17
  return null;
16
18
  const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
17
- const nodeData = buildFeatureNodeData(feature, run);
19
+ // Resolve repository name, base branch, and one-liner for the overview tab
20
+ const getArtifact = resolve('GetFeatureArtifactUseCase');
21
+ const [repo, baseBranch, artifact] = await Promise.all([
22
+ repoRepo.findByPath(feature.repositoryPath).catch(() => null),
23
+ gitPrService.getDefaultBranch(feature.repositoryPath).catch(() => 'main'),
24
+ getArtifact.execute(featureId).catch(() => null),
25
+ ]);
26
+ const nodeData = buildFeatureNodeData(feature, run, {
27
+ repositoryName: repo?.name,
28
+ baseBranch,
29
+ oneLiner: artifact?.oneLiner,
30
+ });
18
31
  const view = computeDrawerView({
19
32
  selectedNode: nodeData,
20
33
  isCreateDrawerOpen: false,
@@ -0,0 +1,17 @@
1
+ export interface PhaseTimingData {
2
+ agentRunId: string;
3
+ phase: string;
4
+ startedAt: string;
5
+ completedAt?: string;
6
+ durationMs?: number;
7
+ waitingApprovalAt?: string;
8
+ approvalWaitMs?: number;
9
+ }
10
+ type GetPhaseTimingsResult = {
11
+ timings: PhaseTimingData[];
12
+ } | {
13
+ error: string;
14
+ };
15
+ export declare function getFeaturePhaseTimings(featureId: string): Promise<GetPhaseTimingsResult>;
16
+ export {};
17
+ //# sourceMappingURL=get-feature-phase-timings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-feature-phase-timings.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-phase-timings.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,KAAK,qBAAqB,GAAG;IAAE,OAAO,EAAE,eAAe,EAAE,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAwB9F"}
@@ -0,0 +1,25 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function getFeaturePhaseTimings(featureId) {
4
+ if (!featureId.trim()) {
5
+ return { error: 'Feature id is required' };
6
+ }
7
+ try {
8
+ const repo = resolve('IPhaseTimingRepository');
9
+ const phaseTimings = await repo.findByFeatureId(featureId);
10
+ const timings = phaseTimings.map((t) => ({
11
+ agentRunId: t.agentRunId,
12
+ phase: t.phase,
13
+ startedAt: t.startedAt,
14
+ completedAt: t.completedAt,
15
+ durationMs: t.durationMs != null ? Number(t.durationMs) : undefined,
16
+ waitingApprovalAt: t.waitingApprovalAt,
17
+ approvalWaitMs: t.approvalWaitMs != null ? Number(t.approvalWaitMs) : undefined,
18
+ }));
19
+ return { timings };
20
+ }
21
+ catch (error) {
22
+ const message = error instanceof Error ? error.message : 'Failed to load phase timings';
23
+ return { error: message };
24
+ }
25
+ }
@@ -0,0 +1,18 @@
1
+ export interface PlanTaskData {
2
+ title: string;
3
+ description: string;
4
+ state: string;
5
+ }
6
+ export interface PlanData {
7
+ state: string;
8
+ overview: string;
9
+ tasks: PlanTaskData[];
10
+ }
11
+ type GetPlanResult = {
12
+ plan: PlanData | undefined;
13
+ } | {
14
+ error: string;
15
+ };
16
+ export declare function getFeaturePlan(featureId: string): Promise<GetPlanResult>;
17
+ export {};
18
+ //# sourceMappingURL=get-feature-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-feature-plan.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-feature-plan.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED,KAAK,aAAa,GAAG;IAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAExE,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAgC9E"}
@@ -0,0 +1,31 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function getFeaturePlan(featureId) {
4
+ if (!featureId.trim()) {
5
+ return { error: 'Feature id is required' };
6
+ }
7
+ try {
8
+ const repo = resolve('IFeatureRepository');
9
+ const feature = await repo.findById(featureId);
10
+ if (!feature) {
11
+ return { error: 'Feature not found' };
12
+ }
13
+ if (!feature.plan) {
14
+ return { plan: undefined };
15
+ }
16
+ const plan = {
17
+ state: feature.plan.state,
18
+ overview: feature.plan.overview,
19
+ tasks: feature.plan.tasks.map((t) => ({
20
+ title: t.title ?? '',
21
+ description: t.description ?? '',
22
+ state: t.state,
23
+ })),
24
+ };
25
+ return { plan };
26
+ }
27
+ catch (error) {
28
+ const message = error instanceof Error ? error.message : 'Failed to load feature plan';
29
+ return { error: message };
30
+ }
31
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * SSE API Route: GET /api/feature-logs
3
+ *
4
+ * Streams feature agent log output to the client via Server-Sent Events.
5
+ * Resolves the feature to find its agentRunId, reads the corresponding
6
+ * worker log file, and watches for new content.
7
+ *
8
+ * - Accepts ?featureId query parameter (required)
9
+ * - Sends existing log content as SSE "initial" event
10
+ * - Sends new log content as SSE "log" events
11
+ * - Sends heartbeat comments every 30 seconds to keep connection alive
12
+ * - Cleans up watchers/intervals on client disconnect
13
+ */
14
+ export declare const dynamic = "force-dynamic";
15
+ export declare function GET(request: Request): Promise<Response>;
16
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/feature-logs/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AA0BvC,wBAAsB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsJ7D"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * SSE API Route: GET /api/feature-logs
3
+ *
4
+ * Streams feature agent log output to the client via Server-Sent Events.
5
+ * Resolves the feature to find its agentRunId, reads the corresponding
6
+ * worker log file, and watches for new content.
7
+ *
8
+ * - Accepts ?featureId query parameter (required)
9
+ * - Sends existing log content as SSE "initial" event
10
+ * - Sends new log content as SSE "log" events
11
+ * - Sends heartbeat comments every 30 seconds to keep connection alive
12
+ * - Cleans up watchers/intervals on client disconnect
13
+ */
14
+ import { resolve } from '../../../lib/server-container.js';
15
+ import { join } from 'node:path';
16
+ import { homedir } from 'node:os';
17
+ import { readFile, stat } from 'node:fs/promises';
18
+ import { watch } from 'node:fs';
19
+ // Force dynamic — SSE streams must never be statically optimized or cached
20
+ export const dynamic = 'force-dynamic';
21
+ const HEARTBEAT_INTERVAL_MS = 30_000;
22
+ const POLL_INTERVAL_MS = 2_000;
23
+ /**
24
+ * Create a short-lived SSE error response.
25
+ */
26
+ function sseError(error) {
27
+ const stream = new ReadableStream({
28
+ start(controller) {
29
+ const encoder = new TextEncoder();
30
+ controller.enqueue(encoder.encode(`event: error\ndata: ${JSON.stringify({ error })}\n\n`));
31
+ controller.close();
32
+ },
33
+ });
34
+ return new Response(stream, {
35
+ headers: {
36
+ 'Content-Type': 'text/event-stream',
37
+ 'Cache-Control': 'no-cache',
38
+ Connection: 'keep-alive',
39
+ },
40
+ });
41
+ }
42
+ export async function GET(request) {
43
+ try {
44
+ const url = new URL(request.url);
45
+ const featureId = url.searchParams.get('featureId');
46
+ if (!featureId?.trim()) {
47
+ return sseError('featureId is required');
48
+ }
49
+ const featureRepo = resolve('IFeatureRepository');
50
+ const feature = await featureRepo.findById(featureId);
51
+ if (!feature) {
52
+ return sseError(`Feature not found: ${featureId}`);
53
+ }
54
+ if (!feature.agentRunId) {
55
+ return sseError(`Feature "${feature.name}" has no agent run`);
56
+ }
57
+ const logPath = join(homedir(), '.shep', 'logs', `worker-${feature.agentRunId}.log`);
58
+ const stream = new ReadableStream({
59
+ start(controller) {
60
+ const encoder = new TextEncoder();
61
+ let stopped = false;
62
+ let bytesRead = 0;
63
+ let watcher = null;
64
+ let pollInterval = null;
65
+ function enqueue(text) {
66
+ if (stopped)
67
+ return;
68
+ try {
69
+ controller.enqueue(encoder.encode(text));
70
+ }
71
+ catch {
72
+ // Stream may be closed
73
+ }
74
+ }
75
+ /**
76
+ * Read any new content from the log file starting at `bytesRead`.
77
+ * Returns the content read, or null if the file doesn't exist yet.
78
+ */
79
+ async function readNewContent() {
80
+ try {
81
+ const fileStat = await stat(logPath);
82
+ if (fileStat.size <= bytesRead)
83
+ return null;
84
+ const content = await readFile(logPath, 'utf-8');
85
+ const newContent = content.slice(bytesRead);
86
+ bytesRead = content.length;
87
+ return newContent || null;
88
+ }
89
+ catch {
90
+ // File doesn't exist yet — agent may have just started
91
+ return null;
92
+ }
93
+ }
94
+ /**
95
+ * Check for new content and send it as a log event.
96
+ */
97
+ async function checkForUpdates() {
98
+ if (stopped)
99
+ return;
100
+ try {
101
+ const content = await readNewContent();
102
+ if (content) {
103
+ enqueue(`event: log\ndata: ${JSON.stringify({ content })}\n\n`);
104
+ }
105
+ }
106
+ catch {
107
+ // Ignore read errors during polling
108
+ }
109
+ }
110
+ // Initialize: read existing content and set up watchers
111
+ (async () => {
112
+ try {
113
+ // Send existing content as initial event
114
+ const initialContent = await readNewContent();
115
+ if (initialContent) {
116
+ enqueue(`event: initial\ndata: ${JSON.stringify({ content: initialContent })}\n\n`);
117
+ }
118
+ if (stopped)
119
+ return;
120
+ // Watch for file changes with fs.watch
121
+ try {
122
+ watcher = watch(logPath, { persistent: false }, () => {
123
+ void checkForUpdates();
124
+ });
125
+ watcher.on('error', () => {
126
+ // Watcher error — fallback poll will handle it
127
+ });
128
+ }
129
+ catch {
130
+ // File may not exist yet — poll will handle it
131
+ }
132
+ // Fallback poll every 2s (handles cases where fs.watch misses events
133
+ // or the file doesn't exist yet)
134
+ pollInterval = setInterval(() => {
135
+ void checkForUpdates();
136
+ }, POLL_INTERVAL_MS);
137
+ }
138
+ catch {
139
+ // Initialization error — stream will still stay open for heartbeats
140
+ }
141
+ })();
142
+ // Heartbeat to keep connection alive
143
+ const heartbeatInterval = setInterval(() => {
144
+ enqueue(': heartbeat\n\n');
145
+ }, HEARTBEAT_INTERVAL_MS);
146
+ // Cleanup on client disconnect
147
+ const cleanup = () => {
148
+ stopped = true;
149
+ if (watcher) {
150
+ watcher.close();
151
+ watcher = null;
152
+ }
153
+ if (pollInterval) {
154
+ clearInterval(pollInterval);
155
+ pollInterval = null;
156
+ }
157
+ clearInterval(heartbeatInterval);
158
+ try {
159
+ controller.close();
160
+ }
161
+ catch {
162
+ // Stream may already be closed
163
+ }
164
+ };
165
+ request.signal.addEventListener('abort', cleanup, { once: true });
166
+ },
167
+ });
168
+ return new Response(stream, {
169
+ headers: {
170
+ 'Content-Type': 'text/event-stream',
171
+ 'Cache-Control': 'no-cache',
172
+ Connection: 'keep-alive',
173
+ },
174
+ });
175
+ }
176
+ catch (error) {
177
+ // eslint-disable-next-line no-console
178
+ console.error('[SSE route] GET /api/feature-logs error:', error);
179
+ return new Response(JSON.stringify({ error: String(error) }), {
180
+ status: 500,
181
+ headers: { 'Content-Type': 'application/json' },
182
+ });
183
+ }
184
+ }
@@ -1,8 +1,14 @@
1
1
  import type { Feature, AgentRun } from '../../../../packages/core/src/domain/generated/output.js';
2
2
  import type { FeatureNodeData } from '../components/common/feature-node/index.js';
3
+ export interface BuildFeatureNodeDataOptions {
4
+ baseBranch?: string;
5
+ repositoryName?: string;
6
+ /** AI-generated one-liner from FeatureArtifact */
7
+ oneLiner?: string;
8
+ }
3
9
  /**
4
10
  * Builds a FeatureNodeData object from a Feature entity and optional AgentRun.
5
11
  * This is the single-feature version of the logic in `buildGraphNodes`.
6
12
  */
7
- export declare function buildFeatureNodeData(feature: Feature, run: AgentRun | null): FeatureNodeData;
13
+ export declare function buildFeatureNodeData(feature: Feature, run: AgentRun | null, options?: BuildFeatureNodeDataOptions): FeatureNodeData;
8
14
  //# sourceMappingURL=build-feature-node-data.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAM9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,eAAe,CAwB5F"}
1
+ {"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAM9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,eAAe,CA8BjB"}
@@ -3,7 +3,7 @@ import { deriveNodeState, deriveProgress, deriveLifecycle, } from '../components
3
3
  * Builds a FeatureNodeData object from a Feature entity and optional AgentRun.
4
4
  * This is the single-feature version of the logic in `buildGraphNodes`.
5
5
  */
6
- export function buildFeatureNodeData(feature, run) {
6
+ export function buildFeatureNodeData(feature, run, options) {
7
7
  return {
8
8
  name: feature.name,
9
9
  description: feature.description ?? feature.slug,
@@ -14,6 +14,12 @@ export function buildFeatureNodeData(feature, run) {
14
14
  specPath: feature.specPath,
15
15
  state: deriveNodeState(feature, run),
16
16
  progress: deriveProgress(feature),
17
+ summary: feature.description,
18
+ userQuery: feature.userQuery,
19
+ createdAt: feature.createdAt instanceof Date ? feature.createdAt.getTime() : feature.createdAt,
20
+ ...(options?.repositoryName && { repositoryName: options.repositoryName }),
21
+ ...(options?.baseBranch && { baseBranch: options.baseBranch }),
22
+ ...(options?.oneLiner && { oneLiner: options.oneLiner }),
17
23
  ...(run?.agentType && { agentType: run.agentType }),
18
24
  ...(run?.modelId && { modelId: run.modelId }),
19
25
  ...(run?.error && { errorMessage: run.error }),
@@ -32,7 +32,7 @@ export function buildGraphNodes(repositories, featuresWithRuns) {
32
32
  data: { name: repo.name, repositoryPath: repo.path, id: repo.id },
33
33
  });
34
34
  const repoFeatures = featuresByRepo[repo.path] ?? [];
35
- appendFeatureNodes(repoFeatures, repoNodeId, featuresWithRuns, nodes, edges);
35
+ appendFeatureNodes(repoFeatures, repoNodeId, featuresWithRuns, nodes, edges, repo.name);
36
36
  }
37
37
  // Second pass: group orphaned features under virtual repository nodes
38
38
  for (const [repoPath, orphanFeatures] of Object.entries(featuresByRepo)) {
@@ -46,7 +46,7 @@ export function buildGraphNodes(repositories, featuresWithRuns) {
46
46
  position: { x: 0, y: 0 },
47
47
  data: { name: repoName, repositoryPath: repoPath },
48
48
  });
49
- appendFeatureNodes(orphanFeatures, virtualRepoNodeId, featuresWithRuns, nodes, edges);
49
+ appendFeatureNodes(orphanFeatures, virtualRepoNodeId, featuresWithRuns, nodes, edges, repoName);
50
50
  }
51
51
  // Add parent→child dependency edges
52
52
  for (const { feature } of featuresWithRuns) {
@@ -65,7 +65,7 @@ export function buildGraphNodes(repositories, featuresWithRuns) {
65
65
  }
66
66
  return { nodes, edges };
67
67
  }
68
- function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes, edges) {
68
+ function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes, edges, repoName) {
69
69
  // Sort by createdAt so newest features appear last (bottom) in the layout
70
70
  const sorted = [...repoFeatures].sort((a, b) => {
71
71
  const aTime = a.feature.createdAt instanceof Date
@@ -95,6 +95,10 @@ function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes
95
95
  specPath: feature.specPath,
96
96
  state: deriveNodeState(feature, run),
97
97
  progress: deriveProgress(feature),
98
+ summary: feature.description,
99
+ userQuery: feature.userQuery,
100
+ createdAt: feature.createdAt instanceof Date ? feature.createdAt.getTime() : feature.createdAt,
101
+ ...(repoName && { repositoryName: repoName }),
98
102
  ...(run?.agentType && { agentType: run.agentType }),
99
103
  ...(run?.modelId && { modelId: run.modelId }),
100
104
  ...(run?.error && { errorMessage: run.error }),
@@ -8,5 +8,5 @@ export default async function SettingsPage() {
8
8
  if (error || !settings) {
9
9
  return (_jsx("div", { className: "flex h-full flex-col p-6", children: _jsxs("p", { className: "text-destructive text-sm", children: ["Failed to load settings: ", error] }) }));
10
10
  }
11
- return (_jsx("div", { className: "flex h-full flex-col p-6", children: _jsx(SettingsPageClient, { settings: settings, shepHome: shepHome ?? '', dbFileSize: dbFileSize ?? 'Unknown' }) }));
11
+ return (_jsx("div", { className: "flex h-full flex-col px-6 pb-6", children: _jsx(SettingsPageClient, { settings: settings, shepHome: shepHome ?? '', dbFileSize: dbFileSize ?? 'Unknown' }) }));
12
12
  }
@@ -2,30 +2,18 @@ import type { FeatureNodeData } from '../../common/feature-node/index.js';
2
2
  import type { RepositoryNodeData } from '../../common/repository-node/index.js';
3
3
  import type { ParentFeatureOption } from '../../common/feature-create-drawer/feature-create-drawer.js';
4
4
  import type { WorkflowDefaults } from '../../../app/actions/get-workflow-defaults.js';
5
+ /** Tab key matching FeatureDrawerTabs */
6
+ export type FeatureTabKey = 'overview' | 'activity' | 'log' | 'plan' | 'prd-review' | 'tech-decisions' | 'product-decisions' | 'merge-review';
5
7
  /**
6
8
  * Discriminated union representing every possible drawer state in the control center.
7
9
  * Only one view can be active at a time.
8
10
  */
9
11
  export type DrawerView =
10
- /** Generic feature info (running, done, blocked, error, or unhandled action-required phases) */
12
+ /** All feature views tabs handle the lifecycle-specific content */
11
13
  {
12
14
  type: 'feature';
13
15
  node: FeatureNodeData;
14
- }
15
- /** requirements lifecycle + action-required → PRD questionnaire */
16
- | {
17
- type: 'prd-review';
18
- node: FeatureNodeData;
19
- }
20
- /** implementation lifecycle + action-required → tech decisions review */
21
- | {
22
- type: 'tech-review';
23
- node: FeatureNodeData;
24
- }
25
- /** review lifecycle + action-required|error → merge review */
26
- | {
27
- type: 'merge-review';
28
- node: FeatureNodeData;
16
+ initialTab: FeatureTabKey;
29
17
  }
30
18
  /** Feature creation form */
31
19
  | {
@@ -40,11 +28,11 @@ export type DrawerView =
40
28
  type: 'repository';
41
29
  data: RepositoryNodeData;
42
30
  };
43
- /** Derives the feature-specific view type from node lifecycle + state. */
44
- export declare function deriveFeatureViewType(node: FeatureNodeData): 'feature' | 'prd-review' | 'tech-review' | 'merge-review';
31
+ /** Derives the initial tab from node lifecycle + state. */
32
+ export declare function deriveInitialTab(node: FeatureNodeData): FeatureTabKey;
45
33
  /**
46
34
  * Derives the active DrawerView from control-center state.
47
- * Priority: feature-create > selected-node (prd/tech/merge/feature) > repository
35
+ * Priority: feature-create > selected-node > repository
48
36
  */
49
37
  export declare function computeDrawerView({ selectedNode, isCreateDrawerOpen, pendingRepositoryPath, pendingParentFeatureId, selectedRepoNode, features, workflowDefaults, }: {
50
38
  selectedNode: FeatureNodeData | null;
@@ -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;;;GAGG;AACH,MAAM,MAAM,UAAU;AACpB,gGAAgG;AAC9F;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE;AAC5C,mEAAmE;GACjE;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE;AAC/C,yEAAyE;GACvE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE;AAChD,8DAA8D;GAC5D;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE;AACjD,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,0EAA0E;AAC1E,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,eAAe,GACpB,SAAS,GAAG,YAAY,GAAG,aAAa,GAAG,cAAc,CAM3D;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;;;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,16 +1,16 @@
1
- /** Derives the feature-specific view type from node lifecycle + state. */
2
- export function deriveFeatureViewType(node) {
1
+ /** Derives the initial tab from node lifecycle + state. */
2
+ export function deriveInitialTab(node) {
3
3
  if (node.lifecycle === 'requirements' && node.state === 'action-required')
4
4
  return 'prd-review';
5
5
  if (node.lifecycle === 'implementation' && node.state === 'action-required')
6
- return 'tech-review';
6
+ return 'tech-decisions';
7
7
  if (node.lifecycle === 'review' && (node.state === 'action-required' || node.state === 'error'))
8
8
  return 'merge-review';
9
- return 'feature';
9
+ return 'overview';
10
10
  }
11
11
  /**
12
12
  * Derives the active DrawerView from control-center state.
13
- * Priority: feature-create > selected-node (prd/tech/merge/feature) > repository
13
+ * Priority: feature-create > selected-node > repository
14
14
  */
15
15
  export function computeDrawerView({ selectedNode, isCreateDrawerOpen, pendingRepositoryPath, pendingParentFeatureId, selectedRepoNode, features, workflowDefaults, }) {
16
16
  if (isCreateDrawerOpen) {
@@ -23,7 +23,7 @@ export function computeDrawerView({ selectedNode, isCreateDrawerOpen, pendingRep
23
23
  };
24
24
  }
25
25
  if (selectedNode) {
26
- return { type: deriveFeatureViewType(selectedNode), node: selectedNode };
26
+ return { type: 'feature', node: selectedNode, initialTab: deriveInitialTab(selectedNode) };
27
27
  }
28
28
  if (selectedRepoNode) {
29
29
  return { type: 'repository', data: selectedRepoNode };
@@ -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":"AAyDA,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,2CA0kBlF"}
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":"AA+CA,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,2CAmiBlF"}