@shepai/cli 1.135.3 → 1.136.0-pr396.e077930

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 (341) hide show
  1. package/apis/json-schema/FeatureFlags.yaml +5 -0
  2. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +91 -5
  3. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  4. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.js +6 -4
  5. package/dist/packages/core/src/application/use-cases/features/get-branch-sync-status.use-case.d.ts +25 -0
  6. package/dist/packages/core/src/application/use-cases/features/get-branch-sync-status.use-case.d.ts.map +1 -0
  7. package/dist/packages/core/src/application/use-cases/features/get-branch-sync-status.use-case.js +62 -0
  8. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts +34 -0
  9. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts.map +1 -0
  10. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.js +139 -0
  11. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts +16 -0
  12. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts.map +1 -0
  13. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.js +43 -0
  14. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  15. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -0
  16. package/dist/packages/core/src/domain/generated/output.d.ts +4 -0
  17. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/di/container.js +20 -0
  20. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -0
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/042-add-feature-flag-git-rebase-sync.d.ts +11 -0
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/042-add-feature-flag-git-rebase-sync.d.ts.map +1 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/042-add-feature-flag-git-rebase-sync.js +17 -0
  26. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  27. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  28. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts +35 -0
  29. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts.map +1 -0
  30. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.js +66 -0
  31. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts +42 -0
  32. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts.map +1 -0
  33. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.js +169 -0
  34. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +10 -0
  35. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  36. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +150 -0
  37. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  38. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +5 -12
  39. package/dist/src/presentation/web/app/actions/check-agent-auth.d.ts +2 -0
  40. package/dist/src/presentation/web/app/actions/check-agent-auth.d.ts.map +1 -1
  41. package/dist/src/presentation/web/app/actions/check-agent-auth.js +8 -1
  42. package/dist/src/presentation/web/app/actions/check-tool-status.d.ts +14 -0
  43. package/dist/src/presentation/web/app/actions/check-tool-status.d.ts.map +1 -0
  44. package/dist/src/presentation/web/app/actions/check-tool-status.js +53 -0
  45. package/dist/src/presentation/web/app/actions/get-branch-sync-status.d.ts +11 -0
  46. package/dist/src/presentation/web/app/actions/get-branch-sync-status.d.ts.map +1 -0
  47. package/dist/src/presentation/web/app/actions/get-branch-sync-status.js +22 -0
  48. package/dist/src/presentation/web/app/actions/rebase-feature.d.ts +5 -0
  49. package/dist/src/presentation/web/app/actions/rebase-feature.d.ts.map +1 -0
  50. package/dist/src/presentation/web/app/actions/rebase-feature.js +16 -0
  51. package/dist/src/presentation/web/app/actions/sync-repository.d.ts +5 -0
  52. package/dist/src/presentation/web/app/actions/sync-repository.d.ts.map +1 -0
  53. package/dist/src/presentation/web/app/actions/sync-repository.js +16 -0
  54. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  55. package/dist/src/presentation/web/app/build-graph-nodes.js +1 -9
  56. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  57. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +16 -1
  58. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +4 -4
  60. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts +4 -0
  61. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -1
  62. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.js +32 -1
  63. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -1
  64. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +1 -0
  65. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.d.ts +12 -0
  66. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.d.ts.map +1 -0
  67. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.js +13 -0
  68. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.stories.d.ts +15 -0
  69. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.stories.d.ts.map +1 -0
  70. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.stories.js +86 -0
  71. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +9 -1
  72. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  73. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +2 -2
  74. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts +9 -1
  75. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
  76. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +3 -2
  77. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +6 -0
  78. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
  79. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +30 -0
  80. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +17 -0
  81. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  82. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +91 -0
  83. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  84. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +54 -64
  85. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  86. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +85 -19
  87. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts.map +1 -1
  88. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.js +3 -0
  89. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
  90. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +5 -3
  91. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  92. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +7 -5
  93. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts +4 -0
  94. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts.map +1 -1
  95. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.js +11 -0
  96. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.d.ts.map +1 -1
  97. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.js +35 -9
  98. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.d.ts +17 -1
  99. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.d.ts.map +1 -1
  100. package/dist/src/presentation/web/components/features/control-center/control-center-empty-state.stories.js +110 -1
  101. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.d.ts.map +1 -1
  102. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.js +1 -1
  103. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts +1 -0
  104. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.d.ts.map +1 -1
  105. package/dist/src/presentation/web/components/features/features-canvas/features-canvas.stories.js +443 -10
  106. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  107. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +3 -0
  108. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  109. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +3 -0
  110. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  111. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +5 -0
  112. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  113. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
  114. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  115. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +1 -0
  116. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  117. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
  118. package/dist/src/presentation/web/hooks/use-branch-sync-status.d.ts +14 -0
  119. package/dist/src/presentation/web/hooks/use-branch-sync-status.d.ts.map +1 -0
  120. package/dist/src/presentation/web/hooks/use-branch-sync-status.js +67 -0
  121. package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
  122. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  123. package/dist/src/presentation/web/lib/feature-flags.js +5 -0
  124. package/dist/src/presentation/web/lib/layout-with-dagre.js +1 -1
  125. package/dist/tsconfig.build.tsbuildinfo +1 -1
  126. package/package.json +1 -1
  127. package/web/.next/BUILD_ID +1 -1
  128. package/web/.next/build-manifest.json +2 -2
  129. package/web/.next/fallback-build-manifest.json +2 -2
  130. package/web/.next/prerender-manifest.json +3 -3
  131. package/web/.next/required-server-files.js +3 -3
  132. package/web/.next/required-server-files.json +3 -3
  133. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +78 -48
  134. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +3 -3
  135. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  136. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  137. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +78 -48
  138. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +3 -3
  139. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  140. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  141. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +120 -60
  142. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +3 -3
  143. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  144. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  145. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +120 -60
  146. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +3 -3
  147. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  148. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  149. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +74 -44
  150. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +3 -3
  151. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  152. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  153. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +78 -48
  154. package/web/.next/server/app/(dashboard)/create/page.js +3 -3
  155. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  156. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  157. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +120 -60
  158. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +3 -3
  159. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  160. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  161. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +120 -60
  162. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +3 -3
  163. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  164. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  165. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +74 -44
  166. package/web/.next/server/app/(dashboard)/page.js +3 -3
  167. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  168. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  169. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +74 -44
  170. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +3 -3
  171. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  172. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  173. package/web/.next/server/app/_global-error.html +2 -2
  174. package/web/.next/server/app/_global-error.rsc +1 -1
  175. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  176. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  177. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  178. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  179. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  180. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  181. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  182. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  183. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  184. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  185. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  186. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  187. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  188. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  189. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  190. package/web/.next/server/app/skills/page.js +1 -1
  191. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  192. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  193. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  194. package/web/.next/server/app/tools/page.js +1 -1
  195. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  196. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  197. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  198. package/web/.next/server/app/version/page.js.nft.json +1 -1
  199. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  200. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  201. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  202. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  203. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
  204. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  205. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  206. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  207. package/web/.next/server/chunks/ssr/[root-of-the-server]__1626f5d7._.js +4 -0
  208. package/web/.next/server/chunks/ssr/[root-of-the-server]__1626f5d7._.js.map +1 -0
  209. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  210. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  211. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  212. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  213. package/web/.next/server/chunks/ssr/[root-of-the-server]__49557873._.js +4 -0
  214. package/web/.next/server/chunks/ssr/[root-of-the-server]__49557873._.js.map +1 -0
  215. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js +3 -0
  216. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js.map +1 -0
  217. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  218. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  219. package/web/.next/server/chunks/ssr/[root-of-the-server]__90fdc0ee._.js +4 -0
  220. package/web/.next/server/chunks/ssr/[root-of-the-server]__90fdc0ee._.js.map +1 -0
  221. package/web/.next/server/chunks/ssr/{[root-of-the-server]__96670392._.js → [root-of-the-server]__a5f9c6e5._.js} +3 -3
  222. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js.map +1 -0
  223. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7259d16._.js +4 -0
  224. package/web/.next/server/chunks/ssr/[root-of-the-server]__a7259d16._.js.map +1 -0
  225. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  226. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  227. package/web/.next/server/chunks/ssr/[root-of-the-server]__cb850066._.js +3 -0
  228. package/web/.next/server/chunks/ssr/[root-of-the-server]__cb850066._.js.map +1 -0
  229. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +3 -0
  230. package/web/.next/server/chunks/ssr/{[root-of-the-server]__7894f27f._.js.map → [root-of-the-server]__d48c5b11._.js.map} +1 -1
  231. package/web/.next/server/chunks/ssr/_0020fddd._.js +1 -1
  232. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -1
  233. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  234. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  235. package/web/.next/server/chunks/ssr/{_d17bc20a._.js → _13f3c0ec._.js} +2 -2
  236. package/web/.next/server/chunks/ssr/_13f3c0ec._.js.map +1 -0
  237. package/web/.next/server/chunks/ssr/_149f6559._.js +4 -0
  238. package/web/.next/server/chunks/ssr/_149f6559._.js.map +1 -0
  239. package/web/.next/server/chunks/ssr/_1a09002f._.js +4 -0
  240. package/web/.next/server/chunks/ssr/_1a09002f._.js.map +1 -0
  241. package/web/.next/server/chunks/ssr/_48a8ee28._.js +6 -0
  242. package/web/.next/server/chunks/ssr/_48a8ee28._.js.map +1 -0
  243. package/web/.next/server/chunks/ssr/_51ed80a4._.js +3 -0
  244. package/web/.next/server/chunks/ssr/_51ed80a4._.js.map +1 -0
  245. package/web/.next/server/chunks/ssr/_6e8c85b1._.js +6 -0
  246. package/web/.next/server/chunks/ssr/_6e8c85b1._.js.map +1 -0
  247. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  248. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  249. package/web/.next/server/chunks/ssr/_83220ba0._.js +4 -0
  250. package/web/.next/server/chunks/ssr/_83220ba0._.js.map +1 -0
  251. package/web/.next/server/chunks/ssr/_939287c5._.js +4 -0
  252. package/web/.next/server/chunks/ssr/_939287c5._.js.map +1 -0
  253. package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
  254. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
  255. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  256. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +1 -1
  257. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js +3 -0
  258. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js.map +1 -0
  259. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  260. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  261. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  262. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  263. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  264. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  265. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  266. package/web/.next/server/chunks/ssr/{src_presentation_web_127fb482._.js → src_presentation_web_28f803bd._.js} +2 -2
  267. package/web/.next/server/chunks/ssr/{src_presentation_web_127fb482._.js.map → src_presentation_web_28f803bd._.js.map} +1 -1
  268. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  269. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  270. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  271. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  272. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +3 -0
  273. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +1 -0
  274. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  275. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  276. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  277. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  278. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  279. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  280. package/web/.next/server/pages/500.html +2 -2
  281. package/web/.next/server/server-reference-manifest.js +1 -1
  282. package/web/.next/server/server-reference-manifest.json +524 -296
  283. package/web/.next/static/chunks/031e65a4305571f7.js +1 -0
  284. package/web/.next/static/chunks/{fdc719494dcd9c92.js → 132d824e337f12fe.js} +2 -2
  285. package/web/.next/static/chunks/{8c42b7752187f48c.js → 20a66a7159b97299.js} +2 -2
  286. package/web/.next/static/chunks/{d8a0dd9bfd0f22fa.js → 4148e7a319ea7ec4.js} +1 -1
  287. package/web/.next/static/chunks/{9154973d61eae190.js → 5f67ffe1879b8536.js} +1 -1
  288. package/web/.next/static/chunks/6a370f2709c81d83.js +1 -0
  289. package/web/.next/static/chunks/6bfc9e17e141ac36.js +1 -0
  290. package/web/.next/static/chunks/9db1dd8ad063626c.js +1 -0
  291. package/web/.next/static/chunks/{61f7d4f0f0f770a4.js → aa2236a4b7c3bd45.js} +1 -1
  292. package/web/.next/static/chunks/ab3afb0b942c1eb2.css +1 -0
  293. package/web/.next/static/chunks/b3cc94a1e319bee8.js +1 -0
  294. package/web/.next/static/chunks/{d5342f9be437afd9.js → ed248df9e975fd1f.js} +1 -1
  295. package/web/.next/static/chunks/{1a9dfc34432387f5.js → eeec829933170d8a.js} +1 -1
  296. package/web/.next/static/chunks/{7875a9370622a064.js → f010c3293515ab73.js} +1 -1
  297. package/web/.next/static/chunks/{0b7fe2ac4f078f54.js → f070c67389a686ff.js} +1 -1
  298. package/web/.next/static/chunks/f66c996402a430f5.js +1 -0
  299. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +0 -3
  300. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +0 -1
  301. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +0 -3
  302. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +0 -1
  303. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +0 -3
  304. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +0 -1
  305. package/web/.next/server/chunks/ssr/[root-of-the-server]__31bc28da._.js +0 -3
  306. package/web/.next/server/chunks/ssr/[root-of-the-server]__31bc28da._.js.map +0 -1
  307. package/web/.next/server/chunks/ssr/[root-of-the-server]__32ecbed9._.js +0 -3
  308. package/web/.next/server/chunks/ssr/[root-of-the-server]__32ecbed9._.js.map +0 -1
  309. package/web/.next/server/chunks/ssr/[root-of-the-server]__7894f27f._.js +0 -3
  310. package/web/.next/server/chunks/ssr/[root-of-the-server]__90ce4b6d._.js +0 -3
  311. package/web/.next/server/chunks/ssr/[root-of-the-server]__90ce4b6d._.js.map +0 -1
  312. package/web/.next/server/chunks/ssr/[root-of-the-server]__90f9ae71._.js +0 -3
  313. package/web/.next/server/chunks/ssr/[root-of-the-server]__90f9ae71._.js.map +0 -1
  314. package/web/.next/server/chunks/ssr/[root-of-the-server]__96670392._.js.map +0 -1
  315. package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js +0 -3
  316. package/web/.next/server/chunks/ssr/[root-of-the-server]__9c45d070._.js.map +0 -1
  317. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js +0 -3
  318. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js.map +0 -1
  319. package/web/.next/server/chunks/ssr/_313c9690._.js +0 -3
  320. package/web/.next/server/chunks/ssr/_313c9690._.js.map +0 -1
  321. package/web/.next/server/chunks/ssr/_b6960ca0._.js +0 -4
  322. package/web/.next/server/chunks/ssr/_b6960ca0._.js.map +0 -1
  323. package/web/.next/server/chunks/ssr/_d17bc20a._.js.map +0 -1
  324. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +0 -3
  325. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +0 -1
  326. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +0 -5
  327. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js.map +0 -1
  328. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +0 -3
  329. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +0 -1
  330. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +0 -5
  331. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js.map +0 -1
  332. package/web/.next/static/chunks/15e6a74ef39fda73.js +0 -1
  333. package/web/.next/static/chunks/314b8314f77d6921.js +0 -1
  334. package/web/.next/static/chunks/3e2d7d07926b05bf.css +0 -1
  335. package/web/.next/static/chunks/55a1c86671bb1a5b.js +0 -1
  336. package/web/.next/static/chunks/c0c287da1631752f.js +0 -1
  337. package/web/.next/static/chunks/e6b87832e1382949.js +0 -1
  338. package/web/.next/static/chunks/eb9841ec4d80af01.js +0 -1
  339. /package/web/.next/static/{p0KCxpQ0DqKcttVypdnix → 8o0yazCw1kyy56LNhgtTp}/_buildManifest.js +0 -0
  340. /package/web/.next/static/{p0KCxpQ0DqKcttVypdnix → 8o0yazCw1kyy56LNhgtTp}/_clientMiddlewareManifest.json +0 -0
  341. /package/web/.next/static/{p0KCxpQ0DqKcttVypdnix → 8o0yazCw1kyy56LNhgtTp}/_ssgManifest.js +0 -0
@@ -617,6 +617,14 @@ let GitPrService = class GitPrService {
617
617
  parseGitError(error) {
618
618
  const message = error instanceof Error ? error.message : String(error);
619
619
  const cause = error instanceof Error ? error : undefined;
620
+ // Rebase-specific: detect "CONFLICT" during rebase operations
621
+ if (message.includes('CONFLICT') && message.includes('rebase')) {
622
+ return new GitPrError(message, GitPrErrorCode.REBASE_CONFLICT, cause);
623
+ }
624
+ // Sync-specific: non-fast-forward or diverged branch
625
+ if (message.includes('non-fast-forward') || message.includes('diverged')) {
626
+ return new GitPrError(message, GitPrErrorCode.SYNC_FAILED, cause);
627
+ }
620
628
  if (message.includes('rejected') || message.includes('conflict')) {
621
629
  return new GitPrError(message, GitPrErrorCode.MERGE_CONFLICT, cause);
622
630
  }
@@ -657,6 +665,148 @@ let GitPrService = class GitPrService {
657
665
  commitCount,
658
666
  };
659
667
  }
668
+ // --- Rebase & Sync operations ---
669
+ async syncMain(cwd, baseBranch) {
670
+ try {
671
+ // Detect current branch
672
+ const { stdout } = await this.execFile('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd });
673
+ const currentBranch = stdout.trim();
674
+ if (currentBranch === baseBranch) {
675
+ // On the base branch — use git pull --ff-only
676
+ await this.execFile('git', ['pull', '--ff-only', 'origin', baseBranch], { cwd });
677
+ }
678
+ else {
679
+ // On a different branch — fetch the remote ref only (updates origin/<baseBranch>).
680
+ // We intentionally do NOT update the local <baseBranch> ref because it may be
681
+ // checked out in another worktree, which causes git to refuse the update with:
682
+ // "fatal: refusing to fetch into branch 'refs/heads/main' checked out at ..."
683
+ await this.execFile('git', ['fetch', 'origin', baseBranch], { cwd });
684
+ }
685
+ }
686
+ catch (error) {
687
+ const message = error instanceof Error ? error.message : String(error);
688
+ const cause = error instanceof Error ? error : undefined;
689
+ if (message.includes('non-fast-forward') ||
690
+ message.includes('Not possible to fast-forward') ||
691
+ message.includes('diverged')) {
692
+ throw new GitPrError(`Cannot fast-forward '${baseBranch}': local branch has diverged from remote. ` +
693
+ `Resolve the divergence manually with 'git checkout ${baseBranch} && git reset --hard origin/${baseBranch}' ` +
694
+ `if you want to discard local changes on ${baseBranch}.`, GitPrErrorCode.SYNC_FAILED, cause);
695
+ }
696
+ throw new GitPrError(`Failed to sync '${baseBranch}' with remote: ${message}`, GitPrErrorCode.GIT_ERROR, cause);
697
+ }
698
+ }
699
+ async rebaseOnMain(cwd, featureBranch, baseBranch) {
700
+ // Check for dirty worktree before starting
701
+ const dirty = await this.hasUncommittedChanges(cwd);
702
+ if (dirty) {
703
+ throw new GitPrError(`Cannot rebase: working directory has uncommitted changes. ` +
704
+ `Please commit or stash your changes before rebasing.`, GitPrErrorCode.GIT_ERROR);
705
+ }
706
+ // Checkout the feature branch
707
+ try {
708
+ await this.execFile('git', ['checkout', featureBranch], { cwd });
709
+ }
710
+ catch (error) {
711
+ const message = error instanceof Error ? error.message : String(error);
712
+ const cause = error instanceof Error ? error : undefined;
713
+ if (message.includes('did not match') ||
714
+ message.includes('not a commit') ||
715
+ message.includes('pathspec')) {
716
+ throw new GitPrError(`Branch '${featureBranch}' not found.`, GitPrErrorCode.BRANCH_NOT_FOUND, cause);
717
+ }
718
+ throw new GitPrError(`Failed to checkout '${featureBranch}': ${message}`, GitPrErrorCode.GIT_ERROR, cause);
719
+ }
720
+ // Rebase onto origin/<baseBranch> (the remote-tracking ref).
721
+ // We use origin/<baseBranch> rather than the local <baseBranch> because:
722
+ // 1. syncMain fetches origin/<baseBranch> — it's always up-to-date
723
+ // 2. The local <baseBranch> may be checked out in another worktree and stale
724
+ const rebaseTarget = `origin/${baseBranch}`;
725
+ try {
726
+ await this.execFile('git', ['rebase', rebaseTarget], { cwd });
727
+ }
728
+ catch (error) {
729
+ const message = error instanceof Error ? error.message : String(error);
730
+ const cause = error instanceof Error ? error : undefined;
731
+ // Detect rebase conflict from git stderr/exit code
732
+ if (message.includes('CONFLICT') || message.includes('could not apply')) {
733
+ // Get the list of conflicted files to include in the error message
734
+ let conflictedFiles = [];
735
+ try {
736
+ conflictedFiles = await this.getConflictedFiles(cwd);
737
+ }
738
+ catch {
739
+ // Failed to get conflicted files — still report the conflict
740
+ }
741
+ const fileList = conflictedFiles.length > 0 ? ` Conflicted files: ${conflictedFiles.join(', ')}` : '';
742
+ throw new GitPrError(`Rebase of '${featureBranch}' onto '${baseBranch}' encountered conflicts.${fileList}`, GitPrErrorCode.REBASE_CONFLICT, cause);
743
+ }
744
+ throw new GitPrError(`Rebase of '${featureBranch}' onto '${baseBranch}' failed: ${message}`, GitPrErrorCode.GIT_ERROR, cause);
745
+ }
746
+ }
747
+ async getConflictedFiles(cwd) {
748
+ try {
749
+ const { stdout } = await this.execFile('git', ['diff', '--name-only', '--diff-filter=U'], {
750
+ cwd,
751
+ });
752
+ return stdout
753
+ .trim()
754
+ .split('\n')
755
+ .filter((f) => f.length > 0)
756
+ .map((f) => f.replace(/\\/g, '/'));
757
+ }
758
+ catch (error) {
759
+ throw this.parseGitError(error);
760
+ }
761
+ }
762
+ async stageFiles(cwd, files) {
763
+ try {
764
+ await this.execFile('git', ['add', ...files], { cwd });
765
+ }
766
+ catch (error) {
767
+ throw this.parseGitError(error);
768
+ }
769
+ }
770
+ async rebaseContinue(cwd) {
771
+ try {
772
+ await this.execFile('git', ['rebase', '--continue'], {
773
+ cwd,
774
+ env: { ...process.env, GIT_EDITOR: 'true' },
775
+ });
776
+ }
777
+ catch (error) {
778
+ const message = error instanceof Error ? error.message : String(error);
779
+ const cause = error instanceof Error ? error : undefined;
780
+ if (message.includes('CONFLICT') || message.includes('could not apply')) {
781
+ throw new GitPrError(`Rebase continue encountered new conflicts: ${message}`, GitPrErrorCode.REBASE_CONFLICT, cause);
782
+ }
783
+ throw this.parseGitError(error);
784
+ }
785
+ }
786
+ async rebaseAbort(cwd) {
787
+ try {
788
+ await this.execFile('git', ['rebase', '--abort'], { cwd });
789
+ }
790
+ catch (error) {
791
+ throw this.parseGitError(error);
792
+ }
793
+ }
794
+ async getBranchSyncStatus(cwd, featureBranch, baseBranch) {
795
+ try {
796
+ const remoteRef = `origin/${baseBranch}`;
797
+ const [aheadResult, behindResult] = await Promise.all([
798
+ this.execFile('git', ['rev-list', '--count', `${remoteRef}..${featureBranch}`], { cwd }),
799
+ this.execFile('git', ['rev-list', '--count', `${featureBranch}..${remoteRef}`], { cwd }),
800
+ ]);
801
+ return {
802
+ ahead: parseInt(aheadResult.stdout.trim(), 10) || 0,
803
+ behind: parseInt(behindResult.stdout.trim(), 10) || 0,
804
+ };
805
+ }
806
+ catch (error) {
807
+ throw this.parseGitError(error);
808
+ }
809
+ }
660
810
  };
661
811
  GitPrService = __decorate([
662
812
  injectable(),
@@ -1 +1 @@
1
- {"version":3,"file":"get-graph-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/(dashboard)/get-graph-data.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAI1C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAwFD,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AA6B7B,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC,CA6DxF"}
1
+ {"version":3,"file":"get-graph-data.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/(dashboard)/get-graph-data.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAI1C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAiFD,MAAM,MAAM,aAAa,GACrB;IAAE,MAAM,EAAE,SAAS,CAAA;CAAE,GACrB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GACtC;IAAE,MAAM,EAAE,YAAY,CAAA;CAAE,CAAC;AA6B7B,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC,CA6DxF"}
@@ -31,13 +31,7 @@ async function refreshRepoGitInfo(repo) {
31
31
  gitInfoCache.set(repo.path, { kind: 'not-a-repo', checkedAt: Date.now() });
32
32
  return;
33
33
  }
34
- const cached = gitInfoCache.get(repo.path);
35
- if (cached?.kind === 'repo' && cached.sha === headSha) {
36
- // HEAD unchanged — just bump checkedAt
37
- cached.checkedAt = Date.now();
38
- return;
39
- }
40
- // HEAD changed — fetch branch + subject & author in parallel
34
+ // Fetch branch + subject & author in parallel
41
35
  const [currentBranch, logLine] = await Promise.all([
42
36
  gitCommand(repo.path, ['symbolic-ref', '--short', 'HEAD']),
43
37
  gitCommand(repo.path, ['log', '-1', `--format=%s${FIELD_SEP}%an`]),
@@ -45,7 +39,8 @@ async function refreshRepoGitInfo(repo) {
45
39
  if (!currentBranch)
46
40
  return;
47
41
  const [commitMessage, committer] = (logLine ?? '').split(FIELD_SEP);
48
- // Behind count
42
+ // Behind count — always compute, even when on the default branch,
43
+ // because local main can be behind origin/main.
49
44
  let behindCount = null;
50
45
  const defaultBranchRef = await gitCommand(repo.path, [
51
46
  'symbolic-ref',
@@ -53,7 +48,8 @@ async function refreshRepoGitInfo(repo) {
53
48
  'refs/remotes/origin/HEAD',
54
49
  ]);
55
50
  const defaultBranch = defaultBranchRef?.replace('origin/', '') ?? null;
56
- if (defaultBranch && currentBranch !== defaultBranch) {
51
+ if (defaultBranch) {
52
+ // Compare current branch (or default branch itself) against origin
57
53
  const behind = await gitCommand(repo.path, [
58
54
  'rev-list',
59
55
  '--count',
@@ -63,9 +59,6 @@ async function refreshRepoGitInfo(repo) {
63
59
  if (isNaN(behindCount))
64
60
  behindCount = null;
65
61
  }
66
- else {
67
- behindCount = 0;
68
- }
69
62
  gitInfoCache.set(repo.path, {
70
63
  kind: 'repo',
71
64
  sha: headSha,
@@ -8,6 +8,8 @@ export interface AgentAuthStatus {
8
8
  label: string;
9
9
  /** CLI binary name (e.g. "claude", "gemini") */
10
10
  binaryName: string | null;
11
+ /** Shell command to install the tool (e.g. "npm install -g @anthropic-ai/claude-code") */
12
+ installCommand: string | null;
11
13
  /** Instructions to authenticate if not authenticated */
12
14
  authCommand: string | null;
13
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"check-agent-auth.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-agent-auth.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wDAAwD;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA6FD;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAiF/D"}
1
+ {"version":3,"file":"check-agent-auth.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-agent-auth.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,8CAA8C;IAC9C,aAAa,EAAE,OAAO,CAAC;IACvB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,0FAA0F;IAC1F,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,wDAAwD;IACxD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AA6FD;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CAwF/D"}
@@ -114,6 +114,7 @@ export async function checkAgentAuth() {
114
114
  authenticated: false,
115
115
  label: 'Unknown',
116
116
  binaryName: null,
117
+ installCommand: null,
117
118
  authCommand: null,
118
119
  };
119
120
  }
@@ -128,16 +129,19 @@ export async function checkAgentAuth() {
128
129
  authenticated: true,
129
130
  label,
130
131
  binaryName: null,
132
+ installCommand: null,
131
133
  authCommand: null,
132
134
  };
133
135
  }
134
- // Check if tool is installed
136
+ // Check if tool is installed (also grab install command from metadata)
135
137
  let installed = false;
138
+ let installCommand = null;
136
139
  try {
137
140
  const useCase = resolve('ListToolsUseCase');
138
141
  const tools = await useCase.execute();
139
142
  const tool = tools.find((t) => t.id === toolId);
140
143
  installed = tool?.status.status === 'available';
144
+ installCommand = tool?.installCommand ?? null;
141
145
  }
142
146
  catch {
143
147
  installed = false;
@@ -149,6 +153,7 @@ export async function checkAgentAuth() {
149
153
  authenticated: false,
150
154
  label,
151
155
  binaryName,
156
+ installCommand,
152
157
  authCommand: binaryName ? `Install ${label} first` : null,
153
158
  };
154
159
  }
@@ -161,6 +166,7 @@ export async function checkAgentAuth() {
161
166
  authenticated: false,
162
167
  label,
163
168
  binaryName,
169
+ installCommand,
164
170
  authCommand: binaryName,
165
171
  };
166
172
  }
@@ -175,6 +181,7 @@ export async function checkAgentAuth() {
175
181
  authenticated,
176
182
  label,
177
183
  binaryName,
184
+ installCommand,
178
185
  authCommand: authenticated ? null : binaryName,
179
186
  };
180
187
  }
@@ -0,0 +1,14 @@
1
+ export interface ToolStatusEntry {
2
+ installed: boolean;
3
+ version: string | null;
4
+ /** Platform-specific install command from tool JSON metadata */
5
+ installCommand: string | null;
6
+ /** Documentation/website URL */
7
+ installUrl: string | null;
8
+ }
9
+ export interface ToolStatusResult {
10
+ git: ToolStatusEntry;
11
+ gh: ToolStatusEntry;
12
+ }
13
+ export declare function checkToolStatus(): Promise<ToolStatusResult>;
14
+ //# sourceMappingURL=check-tool-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-tool-status.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/check-tool-status.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gEAAgE;IAChE,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,gCAAgC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,eAAe,CAAC;IACrB,EAAE,EAAE,eAAe,CAAC;CACrB;AAwBD,wBAAsB,eAAe,IAAI,OAAO,CAAC,gBAAgB,CAAC,CA8BjE"}
@@ -0,0 +1,53 @@
1
+ 'use server';
2
+ import { execFile } from 'node:child_process';
3
+ import { IS_WINDOWS } from '../../../../../packages/core/src/infrastructure/platform.js';
4
+ import { resolve } from '../../lib/server-container.js';
5
+ function getVersion(command, args) {
6
+ return new Promise((resolve) => {
7
+ try {
8
+ const opts = IS_WINDOWS ? { timeout: 5000, windowsHide: true } : { timeout: 5000 };
9
+ execFile(command, args, opts, (error, stdout) => {
10
+ if (error) {
11
+ resolve({ installed: false, version: null });
12
+ return;
13
+ }
14
+ // Extract version number from output like "git version 2.43.0" or "gh version 2.40.1"
15
+ const match = stdout.match(/(\d+\.\d+(?:\.\d+)?)/);
16
+ resolve({ installed: true, version: match?.[1] ?? null });
17
+ });
18
+ }
19
+ catch {
20
+ resolve({ installed: false, version: null });
21
+ }
22
+ });
23
+ }
24
+ export async function checkToolStatus() {
25
+ // Run version checks and tool metadata lookup in parallel
26
+ const [gitVersion, ghVersion, tools] = await Promise.all([
27
+ getVersion('git', ['--version']),
28
+ getVersion('gh', ['--version']),
29
+ (async () => {
30
+ try {
31
+ const useCase = resolve('ListToolsUseCase');
32
+ return await useCase.execute();
33
+ }
34
+ catch {
35
+ return [];
36
+ }
37
+ })(),
38
+ ]);
39
+ const gitTool = tools.find((t) => t.id === 'git');
40
+ const ghTool = tools.find((t) => t.id === 'gh');
41
+ return {
42
+ git: {
43
+ ...gitVersion,
44
+ installCommand: gitTool?.installCommand ?? null,
45
+ installUrl: gitTool?.website ?? 'https://git-scm.com',
46
+ },
47
+ gh: {
48
+ ...ghVersion,
49
+ installCommand: ghTool?.installCommand ?? null,
50
+ installUrl: ghTool?.website ?? 'https://cli.github.com',
51
+ },
52
+ };
53
+ }
@@ -0,0 +1,11 @@
1
+ export declare function getBranchSyncStatus(featureId: string): Promise<{
2
+ success: boolean;
3
+ data?: {
4
+ ahead: number;
5
+ behind: number;
6
+ baseBranch: string;
7
+ checkedAt: string;
8
+ };
9
+ error?: string;
10
+ }>;
11
+ //# sourceMappingURL=get-branch-sync-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-branch-sync-status.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-branch-sync-status.ts"],"names":[],"mappings":"AAKA,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IACpE,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC,CAmBD"}
@@ -0,0 +1,22 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function getBranchSyncStatus(featureId) {
4
+ if (!featureId?.trim()) {
5
+ return { success: false, error: 'Feature id is required' };
6
+ }
7
+ try {
8
+ const useCase = resolve('GetBranchSyncStatusUseCase');
9
+ const result = await useCase.execute(featureId);
10
+ return {
11
+ success: true,
12
+ data: {
13
+ ...result,
14
+ checkedAt: new Date().toISOString(),
15
+ },
16
+ };
17
+ }
18
+ catch (error) {
19
+ const message = error instanceof Error ? error.message : 'Failed to get branch sync status';
20
+ return { success: false, error: message };
21
+ }
22
+ }
@@ -0,0 +1,5 @@
1
+ export declare function rebaseFeature(featureId: string): Promise<{
2
+ success: boolean;
3
+ error?: string;
4
+ }>;
5
+ //# sourceMappingURL=rebase-feature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rebase-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/rebase-feature.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C"}
@@ -0,0 +1,16 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function rebaseFeature(featureId) {
4
+ if (!featureId?.trim()) {
5
+ return { success: false, error: 'Feature id is required' };
6
+ }
7
+ try {
8
+ const useCase = resolve('RebaseFeatureOnMainUseCase');
9
+ await useCase.execute(featureId);
10
+ return { success: true };
11
+ }
12
+ catch (error) {
13
+ const message = error instanceof Error ? error.message : 'Failed to rebase feature';
14
+ return { success: false, error: message };
15
+ }
16
+ }
@@ -0,0 +1,5 @@
1
+ export declare function syncRepository(repositoryId: string): Promise<{
2
+ success: boolean;
3
+ error?: string;
4
+ }>;
5
+ //# sourceMappingURL=sync-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/sync-repository.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAa/C"}
@@ -0,0 +1,16 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function syncRepository(repositoryId) {
4
+ if (!repositoryId?.trim()) {
5
+ return { success: false, error: 'Repository id is required' };
6
+ }
7
+ try {
8
+ const useCase = resolve('SyncRepositoryMainUseCase');
9
+ await useCase.execute(repositoryId);
10
+ return { success: true };
11
+ }
12
+ catch (error) {
13
+ const message = error instanceof Error ? error.message : 'Failed to sync repository';
14
+ return { success: false, error: message };
15
+ }
16
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"build-graph-nodes.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-graph-nodes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAS1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAU1C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0FAA0F;IAC1F,WAAW,CAAC,EAAE,GAAG,CACf,MAAM,EACN;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CACzF,CAAC;IACF,0DAA0D;IAC1D,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,CAAC,CAAC;CACjE;AAED,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,EAClC,OAAO,CAAC,EAAE,sBAAsB,GAC/B;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAoG5C"}
1
+ {"version":3,"file":"build-graph-nodes.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-graph-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAS1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,sBAAsB;IACrC,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0FAA0F;IAC1F,WAAW,CAAC,EAAE,GAAG,CACf,MAAM,EACN;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CACzF,CAAC;IACF,0DAA0D;IAC1D,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,YAAY,CAAC,CAAC;CACjE;AAED,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,EAClC,OAAO,CAAC,EAAE,sBAAsB,GAC/B;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAoG5C"}
@@ -1,15 +1,7 @@
1
- import { createHash } from 'node:crypto';
2
- import path from 'node:path';
3
1
  import { AgentRunStatus } from '../../../../packages/core/src/domain/generated/output.js';
4
2
  import { deriveNodeState, deriveProgress, deriveLifecycle, } from '../components/common/feature-node/derive-feature-state.js';
5
3
  import { isProcessAlive } from '../../../../packages/core/src/infrastructure/services/process/is-process-alive.js';
6
- import { getShepHomeDir } from '../../../../packages/core/src/infrastructure/services/filesystem/shep-directory.service.js';
7
- /** Compute the worktree path for a feature, matching WorktreeService.getWorktreePath() */
8
- function computeWorktreePath(repoPath, branch) {
9
- const repoHash = createHash('sha256').update(repoPath).digest('hex').slice(0, 16);
10
- const slug = branch.replace(/\//g, '-');
11
- return path.join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\/g, '/');
12
- }
4
+ import { computeWorktreePath } from '../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js';
13
5
  export function buildGraphNodes(repositories, featuresWithRuns, options) {
14
6
  // Normalize path separators so Windows backslash paths match forward-slash paths
15
7
  const normalizePath = (p) => p.replace(/\\/g, '/');
@@ -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":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAI/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAimB1F"}
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":"AAuCA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK/D,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,UAAU,CAAC;IACjB,8FAA8F;IAC9F,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,wBAAgB,mBAAmB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,wBAAwB,2CAgoB1F"}
@@ -30,6 +30,7 @@ import { resolveSseEventUpdates } from '../../common/feature-node/derive-feature
30
30
  import { deriveInitialTab } from './drawer-view.js';
31
31
  import { useArtifactFetch } from './use-artifact-fetch.js';
32
32
  import { useDrawerSync } from './use-drawer-sync.js';
33
+ import { useBranchSyncStatus } from '../../../hooks/use-branch-sync-status.js';
33
34
  export function FeatureDrawerClient({ view: initialView, urlTab }) {
34
35
  const featureFlags = useFeatureFlags();
35
36
  const router = useRouter();
@@ -320,6 +321,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
320
321
  // ── Hooks (always called unconditionally per Rules of Hooks) ──────────
321
322
  const featureActionsInput = featureNode?.repositoryPath && featureNode?.branch
322
323
  ? {
324
+ featureId: featureNode.featureId,
323
325
  repositoryPath: featureNode.repositoryPath,
324
326
  branch: featureNode.branch,
325
327
  worktreePath: featureNode.worktreePath,
@@ -327,6 +329,19 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
327
329
  }
328
330
  : null;
329
331
  const featureActions = useFeatureActions(featureActionsInput);
332
+ // Branch sync status — only when the feature flag is on and the feature has a branch
333
+ const syncFeatureId = featureFlags.gitRebaseSync && featureNode?.branch ? featureNode.featureId : null;
334
+ const { data: syncData, loading: syncLoading, error: syncError, refresh: refreshSync, } = useBranchSyncStatus(syncFeatureId);
335
+ // Auto-refresh sync status after a successful rebase
336
+ const prevRebaseLoadingRef = useRef(featureActions.rebaseLoading);
337
+ useEffect(() => {
338
+ if (prevRebaseLoadingRef.current &&
339
+ !featureActions.rebaseLoading &&
340
+ !featureActions.rebaseError) {
341
+ refreshSync();
342
+ }
343
+ prevRebaseLoadingRef.current = featureActions.rebaseLoading;
344
+ }, [featureActions.rebaseLoading, featureActions.rebaseError, refreshSync]);
330
345
  const featureDeployTarget = featureNode?.repositoryPath && featureNode.branch
331
346
  ? {
332
347
  targetId: featureNode.featureId,
@@ -364,7 +379,7 @@ export function FeatureDrawerClient({ view: initialView, urlTab }) {
364
379
  ...(featureNode.state === 'error' && { onRetry: handleRetry }),
365
380
  ...(featureNode.state === 'pending' && { onStart: handleStart }),
366
381
  };
367
- body = (_jsx(FeatureDrawerTabs, { featureNode: enrichedNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, sseEvents: events, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
382
+ body = (_jsx(FeatureDrawerTabs, { featureNode: enrichedNode, featureId: featureNode.featureId, initialTab: view.initialTab, urlTab: urlTab, sseEvents: events, prdData: prdData, prdSelections: prdSelections, onPrdSelect: (qId, oId) => setPrdSelections((prev) => ({ ...prev, [qId]: oId })), onPrdApprove: handlePrdApprove, onPrdReject: handlePrdReject, isPrdLoading: isLoadingPrd, techData: techData, onTechApprove: handleTechApprove, onTechReject: handleTechReject, isTechLoading: isLoadingTech, productData: isLoadingTechProduct ? null : techProductData, mergeData: mergeData, onMergeApprove: handleMergeApprove, onMergeReject: handleMergeReject, isMergeLoading: isLoadingMerge, syncStatus: featureFlags.gitRebaseSync ? syncData : undefined, syncLoading: syncLoading, syncError: syncError, onRefreshSync: featureFlags.gitRebaseSync ? refreshSync : undefined, onRebaseOnMain: featureFlags.gitRebaseSync ? featureActions.rebaseOnMain : undefined, rebaseLoading: featureActions.rebaseLoading, rebaseError: featureActions.rebaseError, isRejecting: isRejecting, chatInput: chatInput, onChatInputChange: setChatInput }));
368
383
  }
369
384
  return (_jsx(BaseDrawer, { open: isOpen, onClose: attemptClose, size: "md", modal: false, header: header, "data-testid": view.type === 'feature' ? 'feature-drawer' : 'repository-drawer', children: body }));
370
385
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repository-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/repository-drawer-client.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,2BAA2B,2CAmF3E"}
1
+ {"version":3,"file":"repository-drawer-client.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/control-center-drawer/repository-drawer-client.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAE9E,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,wBAAgB,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,2BAA2B,2CA2G3E"}
@@ -1,8 +1,8 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useCallback } from 'react';
4
4
  import { useRouter, usePathname } from 'next/navigation';
5
- import { Code2, Terminal, FolderOpen } from 'lucide-react';
5
+ import { Code2, Terminal, FolderOpen, RefreshCw } from 'lucide-react';
6
6
  import { BaseDrawer } from '../../common/base-drawer/index.js';
7
7
  import { ActionButton } from '../../common/action-button/index.js';
8
8
  import { DrawerTitle, DrawerDescription } from '../../ui/drawer.js';
@@ -14,7 +14,7 @@ export function RepositoryDrawerClient({ data }) {
14
14
  const router = useRouter();
15
15
  const pathname = usePathname();
16
16
  const isOpen = pathname.startsWith('/repository/');
17
- const repoActions = useRepositoryActions(data.repositoryPath ? { repositoryPath: data.repositoryPath } : null);
17
+ const repoActions = useRepositoryActions(data.repositoryPath ? { repositoryId: data.id, repositoryPath: data.repositoryPath } : null);
18
18
  const onClose = useCallback(() => {
19
19
  router.push('/');
20
20
  }, [router]);
@@ -26,5 +26,5 @@ export function RepositoryDrawerClient({ data }) {
26
26
  }
27
27
  : undefined;
28
28
  const header = (_jsxs("div", { "data-testid": "repository-drawer-header", children: [_jsx(DrawerTitle, { children: data.name }), data.repositoryPath ? (_jsx(DrawerDescription, { className: "truncate font-mono text-xs", children: data.repositoryPath })) : null] }));
29
- return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "md", modal: false, header: header, deployTarget: featureFlags.envDeploy ? repoDeployTarget : undefined, "data-testid": "repository-drawer", children: data.repositoryPath ? (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] })] })) : null }));
29
+ return (_jsx(BaseDrawer, { open: isOpen, onClose: onClose, size: "md", modal: false, header: header, deployTarget: featureFlags.envDeploy ? repoDeployTarget : undefined, "data-testid": "repository-drawer", children: data.repositoryPath ? (_jsxs("div", { className: "flex-1 overflow-y-auto", children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "OPEN WITH" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Open in IDE", onClick: repoActions.openInIde, loading: repoActions.ideLoading, error: !!repoActions.ideError, icon: Code2, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open in Shell", onClick: repoActions.openInShell, loading: repoActions.shellLoading, error: !!repoActions.shellError, icon: Terminal, variant: "outline", size: "sm" }), _jsx(ActionButton, { label: "Open Folder", onClick: repoActions.openFolder, loading: repoActions.folderLoading, error: !!repoActions.folderError, icon: FolderOpen, variant: "outline", size: "sm" })] })] }), data.id && featureFlags.gitRebaseSync ? (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "GIT OPERATIONS" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(ActionButton, { label: "Sync Main", onClick: repoActions.syncMain, loading: repoActions.syncLoading, error: !!repoActions.syncError, icon: RefreshCw, variant: "outline", size: "sm" }), repoActions.syncError ? (_jsx("p", { className: "text-destructive text-xs", children: repoActions.syncError })) : null] })] })] })) : null] })) : null }));
30
30
  }
@@ -1,4 +1,5 @@
1
1
  export interface FeatureActionsInput {
2
+ featureId: string;
2
3
  repositoryPath: string;
3
4
  branch: string;
4
5
  worktreePath?: string;
@@ -8,12 +9,15 @@ export interface FeatureActionsState {
8
9
  openInIde: () => Promise<void>;
9
10
  openInShell: () => Promise<void>;
10
11
  openSpecsFolder: () => Promise<void>;
12
+ rebaseOnMain: () => Promise<void>;
11
13
  ideLoading: boolean;
12
14
  shellLoading: boolean;
13
15
  specsLoading: boolean;
16
+ rebaseLoading: boolean;
14
17
  ideError: string | null;
15
18
  shellError: string | null;
16
19
  specsError: string | null;
20
+ rebaseError: string | null;
17
21
  }
18
22
  export declare function useFeatureActions(input: FeatureActionsInput | null): FeatureActionsState;
19
23
  //# sourceMappingURL=use-feature-actions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-feature-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/use-feature-actions.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,mBAAmB,CA8GxF"}
1
+ {"version":3,"file":"use-feature-actions.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer/use-feature-actions.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAID,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,mBAAmB,GAAG,IAAI,GAAG,mBAAmB,CA6IxF"}