@shepai/cli 1.129.2 → 1.129.3-pr396.d3c115b

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 (283) 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 +73 -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/ports/output/services/index.d.ts +1 -1
  6. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  7. package/dist/packages/core/src/application/ports/output/services/tool-installer.service.d.ts +13 -0
  8. package/dist/packages/core/src/application/ports/output/services/tool-installer.service.d.ts.map +1 -1
  9. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts +28 -0
  10. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts.map +1 -0
  11. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.js +81 -0
  12. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts +16 -0
  13. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts.map +1 -0
  14. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.js +43 -0
  15. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  16. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -0
  17. package/dist/packages/core/src/domain/generated/output.d.ts +4 -0
  18. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  19. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/di/container.js +15 -0
  21. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  22. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  23. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -0
  24. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/042-add-feature-flag-git-rebase-sync.d.ts +11 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/042-add-feature-flag-git-rebase-sync.d.ts.map +1 -0
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/042-add-feature-flag-git-rebase-sync.js +17 -0
  27. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  28. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  29. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts +35 -0
  30. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts.map +1 -0
  31. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.js +66 -0
  32. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts +42 -0
  33. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts.map +1 -0
  34. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.js +169 -0
  35. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +6 -0
  36. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  37. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +134 -0
  38. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts +7 -1
  39. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
  40. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +37 -1
  41. package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts +8 -3
  42. package/dist/src/presentation/web/app/actions/get-available-terminals.d.ts.map +1 -1
  43. package/dist/src/presentation/web/app/actions/get-available-terminals.js +14 -46
  44. package/dist/src/presentation/web/app/actions/rebase-feature.d.ts +5 -0
  45. package/dist/src/presentation/web/app/actions/rebase-feature.d.ts.map +1 -0
  46. package/dist/src/presentation/web/app/actions/rebase-feature.js +16 -0
  47. package/dist/src/presentation/web/app/actions/sync-repository.d.ts +5 -0
  48. package/dist/src/presentation/web/app/actions/sync-repository.d.ts.map +1 -0
  49. package/dist/src/presentation/web/app/actions/sync-repository.js +16 -0
  50. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  51. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +2 -1
  52. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
  53. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +4 -4
  54. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts +4 -0
  55. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -1
  56. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.js +32 -1
  57. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +4 -1
  58. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +2 -2
  60. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts +4 -1
  61. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
  62. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +8 -3
  63. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +6 -0
  64. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
  65. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +30 -0
  66. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts.map +1 -1
  67. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.js +3 -0
  68. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
  69. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +5 -3
  70. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +1 -1
  71. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts +4 -0
  72. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts.map +1 -1
  73. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.js +11 -0
  74. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  75. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +3 -0
  76. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  77. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +3 -0
  78. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  79. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +5 -0
  80. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  81. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
  82. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  83. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +1 -0
  84. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  85. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
  86. package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
  87. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  88. package/dist/src/presentation/web/lib/feature-flags.js +5 -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/build-manifest.json +2 -2
  93. package/web/.next/fallback-build-manifest.json +2 -2
  94. package/web/.next/prerender-manifest.json +3 -3
  95. package/web/.next/required-server-files.js +3 -3
  96. package/web/.next/required-server-files.json +3 -3
  97. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +63 -48
  98. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -2
  99. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  100. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +63 -48
  102. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  103. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  104. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  105. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +90 -60
  106. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
  107. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  108. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  109. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +90 -60
  110. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  111. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  112. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  113. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +59 -44
  114. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  115. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  116. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  117. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +63 -48
  118. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  119. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  120. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  121. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +90 -60
  122. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
  123. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  124. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +90 -60
  126. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
  127. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  128. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  129. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +59 -44
  130. package/web/.next/server/app/(dashboard)/page.js +2 -2
  131. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  132. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  133. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +59 -44
  134. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  135. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  136. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  137. package/web/.next/server/app/_global-error.html +2 -2
  138. package/web/.next/server/app/_global-error.rsc +1 -1
  139. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  140. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  141. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  142. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  143. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  144. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  145. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  146. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  147. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  148. package/web/.next/server/app/api/graph-data/route.js +1 -1
  149. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  150. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  151. package/web/.next/server/app/settings/page.js +1 -1
  152. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  153. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  154. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  155. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  156. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  157. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  158. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  159. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  160. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  161. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  162. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  163. package/web/.next/server/chunks/{[root-of-the-server]__dcd4f847._.js → [root-of-the-server]__bc532286._.js} +2 -2
  164. package/web/.next/server/chunks/[root-of-the-server]__bc532286._.js.map +1 -0
  165. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  166. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  167. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__0e842eba._.js.map +1 -1
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__39ecb785._.js +4 -0
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__39ecb785._.js.map +1 -0
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__465c0deb._.js +4 -0
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__465c0deb._.js.map +1 -0
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js +2 -2
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__60684242._.js.map +1 -1
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__62cdea24._.js +4 -0
  180. package/web/.next/server/chunks/ssr/[root-of-the-server]__62cdea24._.js.map +1 -0
  181. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js +2 -2
  182. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb00d90._.js.map +1 -1
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b6d1e18._.js +4 -0
  186. package/web/.next/server/chunks/ssr/[root-of-the-server]__8b6d1e18._.js.map +1 -0
  187. package/web/.next/server/chunks/ssr/[root-of-the-server]__8f6c27af._.js +6 -0
  188. package/web/.next/server/chunks/ssr/[root-of-the-server]__8f6c27af._.js.map +1 -0
  189. package/web/.next/server/chunks/ssr/[root-of-the-server]__910e9de5._.js +4 -0
  190. package/web/.next/server/chunks/ssr/[root-of-the-server]__910e9de5._.js.map +1 -0
  191. package/web/.next/server/chunks/ssr/[root-of-the-server]__a04af228._.js +4 -0
  192. package/web/.next/server/chunks/ssr/[root-of-the-server]__a04af228._.js.map +1 -0
  193. package/web/.next/server/chunks/ssr/[root-of-the-server]__a21eef5a._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/[root-of-the-server]__a32728d0._.js +4 -0
  195. package/web/.next/server/chunks/ssr/[root-of-the-server]__a32728d0._.js.map +1 -0
  196. package/web/.next/server/chunks/ssr/[root-of-the-server]__d6ab9c36._.js +6 -0
  197. package/web/.next/server/chunks/ssr/[root-of-the-server]__d6ab9c36._.js.map +1 -0
  198. package/web/.next/server/chunks/ssr/[root-of-the-server]__f2eb7d62._.js +4 -0
  199. package/web/.next/server/chunks/ssr/[root-of-the-server]__f2eb7d62._.js.map +1 -0
  200. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3036814._.js +4 -0
  201. package/web/.next/server/chunks/ssr/[root-of-the-server]__f3036814._.js.map +1 -0
  202. package/web/.next/server/chunks/ssr/_0020fddd._.js +1 -1
  203. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -1
  204. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  205. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  207. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  208. package/web/.next/server/chunks/ssr/{_6f7bfa91._.js → _92898a8a._.js} +2 -2
  209. package/web/.next/server/chunks/ssr/{_6f7bfa91._.js.map → _92898a8a._.js.map} +1 -1
  210. package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
  211. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  213. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  214. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  215. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  216. package/web/.next/server/chunks/ssr/_e15dd74c._.js +3 -0
  217. package/web/.next/server/chunks/ssr/_e15dd74c._.js.map +1 -0
  218. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  219. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  221. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  222. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +1 -1
  223. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/{src_presentation_web_a6ae877a._.js → src_presentation_web_4911672b._.js} +2 -2
  225. package/web/.next/server/chunks/ssr/{src_presentation_web_a6ae877a._.js.map → src_presentation_web_4911672b._.js.map} +1 -1
  226. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  227. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  228. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  229. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  230. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +3 -0
  231. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +1 -0
  232. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  233. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  234. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  235. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  236. package/web/.next/server/pages/500.html +2 -2
  237. package/web/.next/server/server-reference-manifest.js +1 -1
  238. package/web/.next/server/server-reference-manifest.json +410 -296
  239. package/web/.next/static/chunks/{49cc0701d7c41ba6.js → 06dfdc481d4153c5.js} +1 -1
  240. package/web/.next/static/chunks/{0f21da463e7b5fe5.js → 13b5bc437324b227.js} +1 -1
  241. package/web/.next/static/chunks/{987ffb823189289a.js → 16df233208066782.js} +1 -1
  242. package/web/.next/static/chunks/{5d14ca93cee50529.js → 2407318d504ba12a.js} +2 -2
  243. package/web/.next/static/chunks/{1ff1a21ebd0d3dce.js → 3db8aa71cec6ae58.js} +1 -1
  244. package/web/.next/static/chunks/{4b6d766e61789186.js → 4f9c6b47fb5453f0.js} +1 -1
  245. package/web/.next/static/chunks/{ad726954ef3ab226.js → 8edb1e8aba5f0924.js} +1 -1
  246. package/web/.next/static/chunks/{ecd9562d3fd2944c.js → b8434db399ff1f41.js} +1 -1
  247. package/web/.next/static/chunks/bfda4e4194a4a633.js +1 -0
  248. package/web/.next/static/chunks/{03b3edc6ec7acce0.js → c32fcc86e01faeac.js} +1 -1
  249. package/web/.next/static/chunks/{38eca63d40c799cd.js → cab6d5e8a766f492.js} +1 -1
  250. package/web/.next/static/chunks/{ff5e04cd8c24dd59.js → d56c5f4c867f304f.js} +1 -1
  251. package/web/.next/static/chunks/{d34a91958ca566fa.js → fb3e66702c475c87.js} +1 -1
  252. package/web/.next/static/chunks/{94f33a53f1b81108.js → fd7b2fbeff9ddaae.js} +1 -1
  253. package/web/.next/server/chunks/[root-of-the-server]__dcd4f847._.js.map +0 -1
  254. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js +0 -3
  255. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_4e741df2.js.map +0 -1
  256. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js +0 -3
  257. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_026fdffa.js.map +0 -1
  258. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js +0 -3
  259. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_8b91e197.js.map +0 -1
  260. package/web/.next/server/chunks/ssr/[root-of-the-server]__2f886f77._.js +0 -4
  261. package/web/.next/server/chunks/ssr/[root-of-the-server]__2f886f77._.js.map +0 -1
  262. package/web/.next/server/chunks/ssr/[root-of-the-server]__755cfe02._.js +0 -3
  263. package/web/.next/server/chunks/ssr/[root-of-the-server]__755cfe02._.js.map +0 -1
  264. package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js +0 -3
  265. package/web/.next/server/chunks/ssr/[root-of-the-server]__a628fb91._.js.map +0 -1
  266. package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js +0 -3
  267. package/web/.next/server/chunks/ssr/[root-of-the-server]__bfba58e6._.js.map +0 -1
  268. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3ab8422._.js +0 -3
  269. package/web/.next/server/chunks/ssr/[root-of-the-server]__c3ab8422._.js.map +0 -1
  270. package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js +0 -4
  271. package/web/.next/server/chunks/ssr/[root-of-the-server]__f4a463ee._.js.map +0 -1
  272. package/web/.next/server/chunks/ssr/_bda8a4be._.js +0 -3
  273. package/web/.next/server/chunks/ssr/_bda8a4be._.js.map +0 -1
  274. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js +0 -5
  275. package/web/.next/server/chunks/ssr/src_presentation_web_8e7fe0d1._.js.map +0 -1
  276. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js +0 -3
  277. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_ca051134.js.map +0 -1
  278. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js +0 -5
  279. package/web/.next/server/chunks/ssr/src_presentation_web_b9023017._.js.map +0 -1
  280. package/web/.next/static/chunks/eb9841ec4d80af01.js +0 -1
  281. /package/web/.next/static/{FwKj7hWEdbpIR5DtG1GQJ → hNL2iYdxbIQDChkLJO6q1}/_buildManifest.js +0 -0
  282. /package/web/.next/static/{FwKj7hWEdbpIR5DtG1GQJ → hNL2iYdxbIQDChkLJO6q1}/_clientMiddlewareManifest.json +0 -0
  283. /package/web/.next/static/{FwKj7hWEdbpIR5DtG1GQJ → hNL2iYdxbIQDChkLJO6q1}/_ssgManifest.js +0 -0
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Migration 042: Add feature_flag_git_rebase_sync column to settings table.
3
+ *
4
+ * Adds a boolean (INTEGER 0/1) column for the git rebase-sync feature flag.
5
+ * Defaults to 0 (disabled).
6
+ */
7
+ import type { MigrationParams } from 'umzug';
8
+ import type Database from 'better-sqlite3';
9
+ export declare function up({ context: db }: MigrationParams<Database.Database>): Promise<void>;
10
+ export declare function down({ context: db }: MigrationParams<Database.Database>): Promise<void>;
11
+ //# sourceMappingURL=042-add-feature-flag-git-rebase-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"042-add-feature-flag-git-rebase-sync.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations/042-add-feature-flag-git-rebase-sync.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,wBAAsB,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAS3F;AAED,wBAAsB,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAG7F"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Migration 042: Add feature_flag_git_rebase_sync column to settings table.
3
+ *
4
+ * Adds a boolean (INTEGER 0/1) column for the git rebase-sync feature flag.
5
+ * Defaults to 0 (disabled).
6
+ */
7
+ export async function up({ context: db }) {
8
+ const columns = db.pragma('table_info(settings)');
9
+ const existing = new Set(columns.map((c) => c.name));
10
+ if (!existing.has('feature_flag_git_rebase_sync')) {
11
+ db.exec('ALTER TABLE settings ADD COLUMN feature_flag_git_rebase_sync INTEGER NOT NULL DEFAULT 0');
12
+ }
13
+ }
14
+ export async function down({ context: db }) {
15
+ // SQLite does not support DROP COLUMN before 3.35.0; column remains but is unused after rollback.
16
+ void db;
17
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-settings.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-settings.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8EAA8E,CAAC;AACxH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAOjE;;;GAGG;AACH,qBACa,wBAAyB,YAAW,mBAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD;;;;;;OAMG;IACG,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAmEnD;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgBtC;;;;;OAKG;IACG,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CA+EhD"}
1
+ {"version":3,"file":"sqlite-settings.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-settings.repository.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8EAA8E,CAAC;AACxH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAOjE;;;GAGG;AACH,qBACa,wBAAyB,YAAW,mBAAmB;IACtD,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAElD;;;;;;OAMG;IACG,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IAmEnD;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgBtC;;;;;OAKG;IACG,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAgFhD"}
@@ -64,7 +64,7 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
64
64
  onboarding_complete,
65
65
  approval_gate_allow_prd, approval_gate_allow_plan,
66
66
  approval_gate_allow_merge, approval_gate_push_on_impl_complete,
67
- feature_flag_skills, feature_flag_env_deploy, feature_flag_debug, feature_flag_github_import, feature_flag_adopt_branch,
67
+ feature_flag_skills, feature_flag_env_deploy, feature_flag_debug, feature_flag_github_import, feature_flag_adopt_branch, feature_flag_git_rebase_sync,
68
68
  workflow_enable_evidence, workflow_commit_evidence
69
69
  ) VALUES (
70
70
  @id, @created_at, @updated_at,
@@ -88,7 +88,7 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
88
88
  @onboarding_complete,
89
89
  @approval_gate_allow_prd, @approval_gate_allow_plan,
90
90
  @approval_gate_allow_merge, @approval_gate_push_on_impl_complete,
91
- @feature_flag_skills, @feature_flag_env_deploy, @feature_flag_debug, @feature_flag_github_import, @feature_flag_adopt_branch,
91
+ @feature_flag_skills, @feature_flag_env_deploy, @feature_flag_debug, @feature_flag_github_import, @feature_flag_adopt_branch, @feature_flag_git_rebase_sync,
92
92
  @workflow_enable_evidence, @workflow_commit_evidence
93
93
  )
94
94
  `);
@@ -182,6 +182,7 @@ let SQLiteSettingsRepository = class SQLiteSettingsRepository {
182
182
  feature_flag_debug = @feature_flag_debug,
183
183
  feature_flag_github_import = @feature_flag_github_import,
184
184
  feature_flag_adopt_branch = @feature_flag_adopt_branch,
185
+ feature_flag_git_rebase_sync = @feature_flag_git_rebase_sync,
185
186
  workflow_enable_evidence = @workflow_enable_evidence,
186
187
  workflow_commit_evidence = @workflow_commit_evidence
187
188
  WHERE id = @id
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Conflict Resolution Prompt Builder
3
+ *
4
+ * Builds prompts for the AI agent to resolve git rebase conflicts.
5
+ * Follows the merge-prompts.ts pattern of pure functions returning
6
+ * markdown strings.
7
+ */
8
+ export interface ConflictedFile {
9
+ /** Relative file path from repo root */
10
+ path: string;
11
+ /** Full file contents including conflict markers */
12
+ content: string;
13
+ }
14
+ export interface ConflictResolutionPromptParams {
15
+ /** Files with conflict markers */
16
+ conflictedFiles: ConflictedFile[];
17
+ /** The feature branch being rebased */
18
+ featureBranch: string;
19
+ /** The base branch being rebased onto */
20
+ baseBranch: string;
21
+ /** 1-based attempt number */
22
+ attemptNumber: number;
23
+ /** Maximum allowed attempts */
24
+ maxAttempts: number;
25
+ /** Feedback from previous failed attempt (remaining markers info) */
26
+ previousFeedback?: string;
27
+ }
28
+ /**
29
+ * Build a prompt for the conflict resolution agent.
30
+ *
31
+ * The agent receives conflicted file contents and instructions to resolve
32
+ * all conflict markers by editing files in the working directory.
33
+ */
34
+ export declare function buildConflictResolutionPrompt(params: ConflictResolutionPromptParams): string;
35
+ //# sourceMappingURL=conflict-resolution.prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-resolution.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,8BAA8B;IAC7C,kCAAkC;IAClC,eAAe,EAAE,cAAc,EAAE,CAAC;IAClC,uCAAuC;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,6BAA6B;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,8BAA8B,GAAG,MAAM,CAgE5F"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Conflict Resolution Prompt Builder
3
+ *
4
+ * Builds prompts for the AI agent to resolve git rebase conflicts.
5
+ * Follows the merge-prompts.ts pattern of pure functions returning
6
+ * markdown strings.
7
+ */
8
+ /**
9
+ * Build a prompt for the conflict resolution agent.
10
+ *
11
+ * The agent receives conflicted file contents and instructions to resolve
12
+ * all conflict markers by editing files in the working directory.
13
+ */
14
+ export function buildConflictResolutionPrompt(params) {
15
+ const { conflictedFiles, featureBranch, baseBranch, attemptNumber, maxAttempts, previousFeedback, } = params;
16
+ const fileSection = conflictedFiles
17
+ .map((f) => `### \`${f.path}\`
18
+
19
+ \`\`\`
20
+ ${f.content}
21
+ \`\`\``)
22
+ .join('\n\n');
23
+ const feedbackSection = previousFeedback
24
+ ? `
25
+ ## Previous Attempt Feedback
26
+
27
+ Your previous resolution attempt (${attemptNumber - 1}/${maxAttempts}) was incomplete:
28
+
29
+ ${previousFeedback}
30
+
31
+ You MUST resolve all remaining conflict markers in this attempt.
32
+ `
33
+ : '';
34
+ return `You are resolving git rebase conflicts (attempt ${attemptNumber}/${maxAttempts}).
35
+
36
+ ## Branch Context
37
+
38
+ - Feature branch: \`${featureBranch}\`
39
+ - Base branch: \`${baseBranch}\`
40
+ - The feature branch is being rebased onto the latest \`${baseBranch}\`.
41
+ ${feedbackSection}
42
+ ## Conflicted Files
43
+
44
+ The following files contain conflict markers that must be resolved:
45
+
46
+ ${fileSection}
47
+
48
+ ## Instructions
49
+
50
+ 1. Read each conflicted file listed above
51
+ 2. Resolve ALL conflict markers (\`<<<<<<<\`, \`=======\`, \`>>>>>>>\`) by editing the files
52
+ 3. For each conflict, determine the correct resolution by understanding the intent of both sides:
53
+ - The \`<<<<<<< HEAD\` section contains changes from \`${baseBranch}\` (theirs during rebase)
54
+ - The \`>>>>>>> ...\` section contains changes from \`${featureBranch}\` (ours during rebase)
55
+ 4. Produce a merged result that preserves the intent of both sides where possible
56
+ 5. If the changes conflict logically (not just textually), prefer the feature branch changes but ensure compatibility with the base branch
57
+
58
+ ## Constraints
59
+
60
+ - Edit ONLY the conflicted files listed above — do NOT modify any other files
61
+ - Remove ALL conflict markers (\`<<<<<<<\`, \`=======\`, \`>>>>>>>\`) from every conflicted file
62
+ - Do NOT add new files or delete files
63
+ - Do NOT run git commands — only edit files to resolve conflicts
64
+ - Do NOT run tests, builds, or linters — only resolve the conflict markers
65
+ - Every conflicted file must have zero remaining conflict markers when you are done`;
66
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Conflict Resolution Service
3
+ *
4
+ * Orchestrates agent-powered conflict resolution during git rebase.
5
+ * Follows the CI watch/fix loop pattern: detect conflict → invoke agent →
6
+ * validate resolution → stage files → continue rebase, with retry logic.
7
+ */
8
+ import type { IAgentExecutorProvider } from '../../../../application/ports/output/agents/agent-executor-provider.interface.js';
9
+ import type { IGitPrService } from '../../../../application/ports/output/services/git-pr-service.interface.js';
10
+ export declare class ConflictResolutionService {
11
+ private readonly agentProvider;
12
+ private readonly gitPrService;
13
+ constructor(agentProvider: IAgentExecutorProvider, gitPrService: IGitPrService);
14
+ /**
15
+ * Resolve all conflicts during a rebase operation.
16
+ *
17
+ * Handles multi-commit rebases where each commit may introduce conflicts.
18
+ * For each conflicted commit: reads conflicted files, invokes agent to
19
+ * resolve, validates no remaining markers, stages resolved files, and
20
+ * continues the rebase. Retries up to MAX_RETRIES_PER_COMMIT times.
21
+ *
22
+ * If retries are exhausted, aborts the rebase and throws REBASE_CONFLICT.
23
+ *
24
+ * @param cwd - Working directory (repo root or worktree path)
25
+ * @param featureBranch - Feature branch being rebased
26
+ * @param baseBranch - Base branch being rebased onto
27
+ */
28
+ resolve(cwd: string, featureBranch: string, baseBranch: string): Promise<void>;
29
+ /**
30
+ * Read the contents of conflicted files from the working directory.
31
+ */
32
+ private readConflictedFileContents;
33
+ /**
34
+ * Validate that no conflict markers remain in the previously-conflicted files.
35
+ */
36
+ private validateResolution;
37
+ /**
38
+ * Build feedback about remaining conflict markers for retry attempts.
39
+ */
40
+ private buildFeedbackFromRemainingMarkers;
41
+ }
42
+ //# sourceMappingURL=conflict-resolution.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conflict-resolution.service.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wEAAwE,CAAC;AACrH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iEAAiE,CAAC;AAerG,qBACa,yBAAyB;IAGlC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAFZ,aAAa,EAAE,sBAAsB,EAErC,YAAY,EAAE,aAAa;IAG9C;;;;;;;;;;;;;OAaG;IACG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkEpF;;OAEG;IACH,OAAO,CAAC,0BAA0B;IAWlC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAgB1B;;OAEG;IACH,OAAO,CAAC,iCAAiC;CAyB1C"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Conflict Resolution Service
3
+ *
4
+ * Orchestrates agent-powered conflict resolution during git rebase.
5
+ * Follows the CI watch/fix loop pattern: detect conflict → invoke agent →
6
+ * validate resolution → stage files → continue rebase, with retry logic.
7
+ */
8
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
9
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
10
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
11
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
12
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
13
+ };
14
+ var __metadata = (this && this.__metadata) || function (k, v) {
15
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
16
+ };
17
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
18
+ return function (target, key) { decorator(target, key, paramIndex); }
19
+ };
20
+ import { injectable, inject } from 'tsyringe';
21
+ import { readFileSync } from 'node:fs';
22
+ import { join } from 'node:path';
23
+ import { GitPrError, GitPrErrorCode, } from '../../../../application/ports/output/services/git-pr-service.interface.js';
24
+ import { buildConflictResolutionPrompt, } from './conflict-resolution.prompt.js';
25
+ const MAX_RETRIES_PER_COMMIT = 3;
26
+ /** Conflict markers that indicate unresolved conflicts */
27
+ const CONFLICT_MARKERS = ['<<<<<<<', '=======', '>>>>>>>'];
28
+ let ConflictResolutionService = class ConflictResolutionService {
29
+ agentProvider;
30
+ gitPrService;
31
+ constructor(agentProvider, gitPrService) {
32
+ this.agentProvider = agentProvider;
33
+ this.gitPrService = gitPrService;
34
+ }
35
+ /**
36
+ * Resolve all conflicts during a rebase operation.
37
+ *
38
+ * Handles multi-commit rebases where each commit may introduce conflicts.
39
+ * For each conflicted commit: reads conflicted files, invokes agent to
40
+ * resolve, validates no remaining markers, stages resolved files, and
41
+ * continues the rebase. Retries up to MAX_RETRIES_PER_COMMIT times.
42
+ *
43
+ * If retries are exhausted, aborts the rebase and throws REBASE_CONFLICT.
44
+ *
45
+ * @param cwd - Working directory (repo root or worktree path)
46
+ * @param featureBranch - Feature branch being rebased
47
+ * @param baseBranch - Base branch being rebased onto
48
+ */
49
+ async resolve(cwd, featureBranch, baseBranch) {
50
+ const executor = await this.agentProvider.getExecutor();
51
+ // Outer loop: handle multi-commit rebases where rebaseContinue
52
+ // may reveal conflicts on the next commit
53
+ while (true) {
54
+ const conflictedFiles = await this.gitPrService.getConflictedFiles(cwd);
55
+ if (conflictedFiles.length === 0) {
56
+ return; // No conflicts — rebase is complete
57
+ }
58
+ // Inner loop: retry agent resolution for the current commit's conflicts
59
+ let resolved = false;
60
+ for (let attempt = 1; attempt <= MAX_RETRIES_PER_COMMIT; attempt++) {
61
+ const fileContents = this.readConflictedFileContents(cwd, conflictedFiles);
62
+ const previousFeedback = attempt > 1 ? this.buildFeedbackFromRemainingMarkers(cwd, conflictedFiles) : undefined;
63
+ const prompt = buildConflictResolutionPrompt({
64
+ conflictedFiles: fileContents,
65
+ featureBranch,
66
+ baseBranch,
67
+ attemptNumber: attempt,
68
+ maxAttempts: MAX_RETRIES_PER_COMMIT,
69
+ previousFeedback,
70
+ });
71
+ await executor.execute(prompt, { cwd });
72
+ // Validate: check no conflict markers remain
73
+ if (this.validateResolution(cwd, conflictedFiles)) {
74
+ resolved = true;
75
+ break;
76
+ }
77
+ }
78
+ if (!resolved) {
79
+ // Exhausted retries — abort and report
80
+ await this.gitPrService.rebaseAbort(cwd);
81
+ const remaining = conflictedFiles.join(', ');
82
+ throw new GitPrError(`Failed to resolve conflicts after ${MAX_RETRIES_PER_COMMIT} attempts. ` +
83
+ `Unresolved files: ${remaining}. The rebase has been aborted.`, GitPrErrorCode.REBASE_CONFLICT);
84
+ }
85
+ // Resolution succeeded — stage files and continue rebase
86
+ await this.gitPrService.stageFiles(cwd, conflictedFiles);
87
+ try {
88
+ await this.gitPrService.rebaseContinue(cwd);
89
+ // rebaseContinue succeeded — check if there are more conflicts
90
+ // from subsequent commits (loop continues)
91
+ return; // No more conflicts
92
+ }
93
+ catch (error) {
94
+ if (error instanceof GitPrError && error.code === GitPrErrorCode.REBASE_CONFLICT) {
95
+ // Next commit has conflicts — loop back to resolve them
96
+ continue;
97
+ }
98
+ throw error; // Unexpected error
99
+ }
100
+ }
101
+ }
102
+ /**
103
+ * Read the contents of conflicted files from the working directory.
104
+ */
105
+ readConflictedFileContents(cwd, filePaths) {
106
+ return filePaths.map((filePath) => {
107
+ try {
108
+ const content = readFileSync(join(cwd, filePath), 'utf-8');
109
+ return { path: filePath, content };
110
+ }
111
+ catch {
112
+ return { path: filePath, content: '(unable to read file)' };
113
+ }
114
+ });
115
+ }
116
+ /**
117
+ * Validate that no conflict markers remain in the previously-conflicted files.
118
+ */
119
+ validateResolution(cwd, filePaths) {
120
+ for (const filePath of filePaths) {
121
+ try {
122
+ const content = readFileSync(join(cwd, filePath), 'utf-8');
123
+ for (const marker of CONFLICT_MARKERS) {
124
+ if (content.includes(marker)) {
125
+ return false;
126
+ }
127
+ }
128
+ }
129
+ catch {
130
+ return false;
131
+ }
132
+ }
133
+ return true;
134
+ }
135
+ /**
136
+ * Build feedback about remaining conflict markers for retry attempts.
137
+ */
138
+ buildFeedbackFromRemainingMarkers(cwd, filePaths) {
139
+ const remaining = [];
140
+ for (const filePath of filePaths) {
141
+ try {
142
+ const content = readFileSync(join(cwd, filePath), 'utf-8');
143
+ const lines = content.split('\n');
144
+ const markerLines = [];
145
+ lines.forEach((line, index) => {
146
+ if (CONFLICT_MARKERS.some((marker) => line.includes(marker))) {
147
+ markerLines.push(index + 1);
148
+ }
149
+ });
150
+ if (markerLines.length > 0) {
151
+ remaining.push(`- \`${filePath}\`: conflict markers remain on lines ${markerLines.join(', ')}`);
152
+ }
153
+ }
154
+ catch {
155
+ remaining.push(`- \`${filePath}\`: unable to read file`);
156
+ }
157
+ }
158
+ return remaining.length > 0
159
+ ? remaining.join('\n')
160
+ : 'No specific markers found, but validation failed.';
161
+ }
162
+ };
163
+ ConflictResolutionService = __decorate([
164
+ injectable(),
165
+ __param(0, inject('IAgentExecutorProvider')),
166
+ __param(1, inject('IGitPrService')),
167
+ __metadata("design:paramtypes", [Object, Object])
168
+ ], ConflictResolutionService);
169
+ export { ConflictResolutionService };
@@ -45,5 +45,11 @@ export declare class GitPrService implements IGitPrService {
45
45
  private parseGhError;
46
46
  private parsePrNumberFromUrl;
47
47
  private parseDiffStat;
48
+ syncMain(cwd: string, baseBranch: string): Promise<void>;
49
+ rebaseOnMain(cwd: string, featureBranch: string, baseBranch: string): Promise<void>;
50
+ getConflictedFiles(cwd: string): Promise<string[]>;
51
+ stageFiles(cwd: string, files: string[]): Promise<void>;
52
+ rebaseContinue(cwd: string): Promise<void>;
53
+ rebaseAbort(cwd: string): Promise<void>;
48
54
  }
49
55
  //# sourceMappingURL=git-pr.service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"git-pr.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/git-pr.service.ts"],"names":[],"mappings":"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"}
@@ -609,6 +609,14 @@ let GitPrService = class GitPrService {
609
609
  parseGitError(error) {
610
610
  const message = error instanceof Error ? error.message : String(error);
611
611
  const cause = error instanceof Error ? error : undefined;
612
+ // Rebase-specific: detect "CONFLICT" during rebase operations
613
+ if (message.includes('CONFLICT') && message.includes('rebase')) {
614
+ return new GitPrError(message, GitPrErrorCode.REBASE_CONFLICT, cause);
615
+ }
616
+ // Sync-specific: non-fast-forward or diverged branch
617
+ if (message.includes('non-fast-forward') || message.includes('diverged')) {
618
+ return new GitPrError(message, GitPrErrorCode.SYNC_FAILED, cause);
619
+ }
612
620
  if (message.includes('rejected') || message.includes('conflict')) {
613
621
  return new GitPrError(message, GitPrErrorCode.MERGE_CONFLICT, cause);
614
622
  }
@@ -649,6 +657,132 @@ let GitPrService = class GitPrService {
649
657
  commitCount,
650
658
  };
651
659
  }
660
+ // --- Rebase & Sync operations ---
661
+ async syncMain(cwd, baseBranch) {
662
+ try {
663
+ // Detect current branch
664
+ const { stdout } = await this.execFile('git', ['rev-parse', '--abbrev-ref', 'HEAD'], { cwd });
665
+ const currentBranch = stdout.trim();
666
+ if (currentBranch === baseBranch) {
667
+ // On the base branch — use git pull --ff-only
668
+ await this.execFile('git', ['pull', '--ff-only', 'origin', baseBranch], { cwd });
669
+ }
670
+ else {
671
+ // On a different branch — fetch the remote ref only (updates origin/<baseBranch>).
672
+ // We intentionally do NOT update the local <baseBranch> ref because it may be
673
+ // checked out in another worktree, which causes git to refuse the update with:
674
+ // "fatal: refusing to fetch into branch 'refs/heads/main' checked out at ..."
675
+ await this.execFile('git', ['fetch', 'origin', baseBranch], { cwd });
676
+ }
677
+ }
678
+ catch (error) {
679
+ const message = error instanceof Error ? error.message : String(error);
680
+ const cause = error instanceof Error ? error : undefined;
681
+ if (message.includes('non-fast-forward') ||
682
+ message.includes('Not possible to fast-forward') ||
683
+ message.includes('diverged')) {
684
+ throw new GitPrError(`Cannot fast-forward '${baseBranch}': local branch has diverged from remote. ` +
685
+ `Resolve the divergence manually with 'git checkout ${baseBranch} && git reset --hard origin/${baseBranch}' ` +
686
+ `if you want to discard local changes on ${baseBranch}.`, GitPrErrorCode.SYNC_FAILED, cause);
687
+ }
688
+ throw new GitPrError(`Failed to sync '${baseBranch}' with remote: ${message}`, GitPrErrorCode.GIT_ERROR, cause);
689
+ }
690
+ }
691
+ async rebaseOnMain(cwd, featureBranch, baseBranch) {
692
+ // Check for dirty worktree before starting
693
+ const dirty = await this.hasUncommittedChanges(cwd);
694
+ if (dirty) {
695
+ throw new GitPrError(`Cannot rebase: working directory has uncommitted changes. ` +
696
+ `Please commit or stash your changes before rebasing.`, GitPrErrorCode.GIT_ERROR);
697
+ }
698
+ // Checkout the feature branch
699
+ try {
700
+ await this.execFile('git', ['checkout', featureBranch], { cwd });
701
+ }
702
+ catch (error) {
703
+ const message = error instanceof Error ? error.message : String(error);
704
+ const cause = error instanceof Error ? error : undefined;
705
+ if (message.includes('did not match') ||
706
+ message.includes('not a commit') ||
707
+ message.includes('pathspec')) {
708
+ throw new GitPrError(`Branch '${featureBranch}' not found.`, GitPrErrorCode.BRANCH_NOT_FOUND, cause);
709
+ }
710
+ throw new GitPrError(`Failed to checkout '${featureBranch}': ${message}`, GitPrErrorCode.GIT_ERROR, cause);
711
+ }
712
+ // Rebase onto origin/<baseBranch> (the remote-tracking ref).
713
+ // We use origin/<baseBranch> rather than the local <baseBranch> because:
714
+ // 1. syncMain fetches origin/<baseBranch> — it's always up-to-date
715
+ // 2. The local <baseBranch> may be checked out in another worktree and stale
716
+ const rebaseTarget = `origin/${baseBranch}`;
717
+ try {
718
+ await this.execFile('git', ['rebase', rebaseTarget], { cwd });
719
+ }
720
+ catch (error) {
721
+ const message = error instanceof Error ? error.message : String(error);
722
+ const cause = error instanceof Error ? error : undefined;
723
+ // Detect rebase conflict from git stderr/exit code
724
+ if (message.includes('CONFLICT') || message.includes('could not apply')) {
725
+ // Get the list of conflicted files to include in the error message
726
+ let conflictedFiles = [];
727
+ try {
728
+ conflictedFiles = await this.getConflictedFiles(cwd);
729
+ }
730
+ catch {
731
+ // Failed to get conflicted files — still report the conflict
732
+ }
733
+ const fileList = conflictedFiles.length > 0 ? ` Conflicted files: ${conflictedFiles.join(', ')}` : '';
734
+ throw new GitPrError(`Rebase of '${featureBranch}' onto '${baseBranch}' encountered conflicts.${fileList}`, GitPrErrorCode.REBASE_CONFLICT, cause);
735
+ }
736
+ throw new GitPrError(`Rebase of '${featureBranch}' onto '${baseBranch}' failed: ${message}`, GitPrErrorCode.GIT_ERROR, cause);
737
+ }
738
+ }
739
+ async getConflictedFiles(cwd) {
740
+ try {
741
+ const { stdout } = await this.execFile('git', ['diff', '--name-only', '--diff-filter=U'], {
742
+ cwd,
743
+ });
744
+ return stdout
745
+ .trim()
746
+ .split('\n')
747
+ .filter((f) => f.length > 0)
748
+ .map((f) => f.replace(/\\/g, '/'));
749
+ }
750
+ catch (error) {
751
+ throw this.parseGitError(error);
752
+ }
753
+ }
754
+ async stageFiles(cwd, files) {
755
+ try {
756
+ await this.execFile('git', ['add', ...files], { cwd });
757
+ }
758
+ catch (error) {
759
+ throw this.parseGitError(error);
760
+ }
761
+ }
762
+ async rebaseContinue(cwd) {
763
+ try {
764
+ await this.execFile('git', ['rebase', '--continue'], {
765
+ cwd,
766
+ env: { ...process.env, GIT_EDITOR: 'true' },
767
+ });
768
+ }
769
+ catch (error) {
770
+ const message = error instanceof Error ? error.message : String(error);
771
+ const cause = error instanceof Error ? error : undefined;
772
+ if (message.includes('CONFLICT') || message.includes('could not apply')) {
773
+ throw new GitPrError(`Rebase continue encountered new conflicts: ${message}`, GitPrErrorCode.REBASE_CONFLICT, cause);
774
+ }
775
+ throw this.parseGitError(error);
776
+ }
777
+ }
778
+ async rebaseAbort(cwd) {
779
+ try {
780
+ await this.execFile('git', ['rebase', '--abort'], { cwd });
781
+ }
782
+ catch (error) {
783
+ throw this.parseGitError(error);
784
+ }
785
+ }
652
786
  };
653
787
  GitPrService = __decorate([
654
788
  injectable(),
@@ -11,7 +11,7 @@
11
11
  * - Automatic timeout handling with process termination
12
12
  * - Immutable status objects via value object factory functions
13
13
  */
14
- import type { IToolInstallerService } from '../../../application/ports/output/services/tool-installer.service.js';
14
+ import type { IToolInstallerService, AvailableTerminalEntry } from '../../../application/ports/output/services/tool-installer.service.js';
15
15
  import type { ToolInstallationStatus, ToolInstallCommand } from '../../../domain/generated/output.js';
16
16
  export declare class ToolInstallerServiceImpl implements IToolInstallerService {
17
17
  /**
@@ -29,6 +29,12 @@ export declare class ToolInstallerServiceImpl implements IToolInstallerService {
29
29
  * Streams stdout/stderr to optional callback and handles timeout automatically.
30
30
  */
31
31
  executeInstall(toolName: string, onOutput?: (data: string) => void): Promise<ToolInstallationStatus>;
32
+ /**
33
+ * List all terminal emulators supported on the current platform with availability status.
34
+ * TOOL_METADATA is loaded in the Node.js CLI context, so this is safe to call from the
35
+ * DI container even when the Next.js standalone bundle cannot resolve tools/ via import.meta.url.
36
+ */
37
+ listAvailableTerminals(): Promise<AvailableTerminalEntry[]>;
32
38
  /**
33
39
  * Create installation suggestions for a tool based on its metadata
34
40
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tool-installer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-installer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sEAAsE,CAAC;AAClH,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,qCAAqC,CAAC;AA2B7C,qBACa,wBAAyB,YAAW,qBAAqB;IACpE;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoC1E;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAqB9D;;;OAGG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,sBAAsB,CAAC;IAgFlC;;OAEG;IACH,OAAO,CAAC,6BAA6B;CA4BtC"}
1
+ {"version":3,"file":"tool-installer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-installer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,sEAAsE,CAAC;AAC9E,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,qCAAqC,CAAC;AA2B7C,qBACa,wBAAyB,YAAW,qBAAqB;IACpE;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoC1E;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAqB9D;;;OAGG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,sBAAsB,CAAC;IAgFlC;;;;OAIG;IACG,sBAAsB,IAAI,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAuCjE;;OAEG;IACH,OAAO,CAAC,6BAA6B;CA4BtC"}
@@ -21,7 +21,7 @@ import { injectable } from 'tsyringe';
21
21
  import { exec, spawn } from 'node:child_process';
22
22
  import { platform } from 'node:os';
23
23
  import { createAvailableStatus, createMissingStatus, createErrorStatus, } from '../../../domain/value-objects/tool-installation-status.js';
24
- import { TOOL_METADATA } from './tool-metadata.js';
24
+ import { TOOL_METADATA, getTerminalEntries } from './tool-metadata.js';
25
25
  import { checkBinaryExists } from './binary-exists.js';
26
26
  /**
27
27
  * Resolve binary name for the current platform.
@@ -172,6 +172,42 @@ let ToolInstallerServiceImpl = class ToolInstallerServiceImpl {
172
172
  });
173
173
  });
174
174
  }
175
+ /**
176
+ * List all terminal emulators supported on the current platform with availability status.
177
+ * TOOL_METADATA is loaded in the Node.js CLI context, so this is safe to call from the
178
+ * DI container even when the Next.js standalone bundle cannot resolve tools/ via import.meta.url.
179
+ */
180
+ async listAvailableTerminals() {
181
+ const currentPlatform = platform();
182
+ const entries = getTerminalEntries();
183
+ const results = [];
184
+ for (const [id, meta] of entries) {
185
+ if (meta.platforms &&
186
+ !meta.platforms.includes(currentPlatform)) {
187
+ continue;
188
+ }
189
+ if (id === 'system-terminal') {
190
+ results.unshift({ id: 'system', name: meta.name, available: true });
191
+ continue;
192
+ }
193
+ const binary = typeof meta.binary === 'string' ? meta.binary : meta.binary[currentPlatform];
194
+ if (!binary)
195
+ continue;
196
+ let available = false;
197
+ if (meta.verifyCommand.startsWith('test ')) {
198
+ available = await runVerifyCommand(meta.verifyCommand);
199
+ }
200
+ else {
201
+ const result = await checkBinaryExists(binary);
202
+ available = result.found;
203
+ }
204
+ results.push({ id, name: meta.name, available });
205
+ }
206
+ if (!results.some((r) => r.id === 'system')) {
207
+ results.unshift({ id: 'system', name: 'System Terminal', available: true });
208
+ }
209
+ return results;
210
+ }
175
211
  /**
176
212
  * Create installation suggestions for a tool based on its metadata
177
213
  */