@shepai/cli 1.136.1 → 1.137.0-pr440.3cc2b78

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 (381) hide show
  1. package/apis/json-schema/Feature.yaml +3 -0
  2. package/apis/json-schema/FeatureFlags.yaml +5 -0
  3. package/apis/json-schema/SdlcLifecycle.yaml +1 -0
  4. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts +2 -0
  5. package/dist/packages/core/src/application/ports/output/repositories/feature-repository.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts +91 -5
  7. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/ports/output/services/git-pr-service.interface.js +6 -4
  9. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.d.ts +20 -0
  10. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.d.ts.map +1 -0
  11. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.js +73 -0
  12. package/dist/packages/core/src/application/use-cases/features/get-branch-sync-status.use-case.d.ts +25 -0
  13. package/dist/packages/core/src/application/use-cases/features/get-branch-sync-status.use-case.d.ts.map +1 -0
  14. package/dist/packages/core/src/application/use-cases/features/get-branch-sync-status.use-case.js +62 -0
  15. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts +34 -0
  16. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.d.ts.map +1 -0
  17. package/dist/packages/core/src/application/use-cases/features/rebase-feature-on-main.use-case.js +139 -0
  18. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.d.ts +20 -0
  19. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.d.ts.map +1 -0
  20. package/dist/packages/core/src/application/use-cases/features/unarchive-feature.use-case.js +65 -0
  21. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts +16 -0
  22. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.d.ts.map +1 -0
  23. package/dist/packages/core/src/application/use-cases/repositories/sync-repository-main.use-case.js +43 -0
  24. package/dist/packages/core/src/domain/factories/settings-defaults.factory.d.ts.map +1 -1
  25. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -0
  26. package/dist/packages/core/src/domain/generated/output.d.ts +10 -1
  27. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  28. package/dist/packages/core/src/domain/generated/output.js +1 -0
  29. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/di/container.js +30 -0
  31. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +1 -0
  32. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  33. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +6 -0
  34. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts +1 -0
  35. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.d.ts.map +1 -1
  36. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/settings.mapper.js +2 -0
  37. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/042-add-feature-flag-git-rebase-sync.d.ts +11 -0
  38. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/042-add-feature-flag-git-rebase-sync.d.ts.map +1 -0
  39. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/042-add-feature-flag-git-rebase-sync.js +17 -0
  40. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.d.ts +12 -0
  41. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.d.ts.map +1 -0
  42. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/044-add-previous-lifecycle.js +16 -0
  43. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  44. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +7 -2
  45. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.d.ts.map +1 -1
  46. package/dist/packages/core/src/infrastructure/repositories/sqlite-settings.repository.js +3 -2
  47. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts +35 -0
  48. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.d.ts.map +1 -0
  49. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.prompt.js +66 -0
  50. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts +42 -0
  51. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.d.ts.map +1 -0
  52. package/dist/packages/core/src/infrastructure/services/agents/conflict-resolution/conflict-resolution.service.js +169 -0
  53. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts +10 -0
  54. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  55. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +150 -0
  56. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts +18 -0
  57. package/dist/src/presentation/cli/commands/feat/archive.command.d.ts.map +1 -0
  58. package/dist/src/presentation/cli/commands/feat/archive.command.js +54 -0
  59. package/dist/src/presentation/cli/commands/feat/index.d.ts.map +1 -1
  60. package/dist/src/presentation/cli/commands/feat/index.js +5 -1
  61. package/dist/src/presentation/cli/commands/feat/ls.command.d.ts.map +1 -1
  62. package/dist/src/presentation/cli/commands/feat/ls.command.js +5 -0
  63. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts +17 -0
  64. package/dist/src/presentation/cli/commands/feat/unarchive.command.d.ts.map +1 -0
  65. package/dist/src/presentation/cli/commands/feat/unarchive.command.js +42 -0
  66. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.d.ts.map +1 -1
  67. package/dist/src/presentation/web/app/(dashboard)/get-graph-data.js +11 -13
  68. package/dist/src/presentation/web/app/actions/archive-feature.d.ts +6 -0
  69. package/dist/src/presentation/web/app/actions/archive-feature.d.ts.map +1 -0
  70. package/dist/src/presentation/web/app/actions/archive-feature.js +16 -0
  71. package/dist/src/presentation/web/app/actions/get-branch-sync-status.d.ts +11 -0
  72. package/dist/src/presentation/web/app/actions/get-branch-sync-status.d.ts.map +1 -0
  73. package/dist/src/presentation/web/app/actions/get-branch-sync-status.js +22 -0
  74. package/dist/src/presentation/web/app/actions/rebase-feature.d.ts +5 -0
  75. package/dist/src/presentation/web/app/actions/rebase-feature.d.ts.map +1 -0
  76. package/dist/src/presentation/web/app/actions/rebase-feature.js +16 -0
  77. package/dist/src/presentation/web/app/actions/sync-repository.d.ts +5 -0
  78. package/dist/src/presentation/web/app/actions/sync-repository.d.ts.map +1 -0
  79. package/dist/src/presentation/web/app/actions/sync-repository.js +16 -0
  80. package/dist/src/presentation/web/app/actions/unarchive-feature.d.ts +6 -0
  81. package/dist/src/presentation/web/app/actions/unarchive-feature.d.ts.map +1 -0
  82. package/dist/src/presentation/web/app/actions/unarchive-feature.js +16 -0
  83. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  84. package/dist/src/presentation/web/app/api/agent-events/route.js +1 -0
  85. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.d.ts.map +1 -1
  86. package/dist/src/presentation/web/components/common/control-center-drawer/feature-drawer-client.js +16 -1
  87. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.d.ts.map +1 -1
  88. package/dist/src/presentation/web/components/common/control-center-drawer/repository-drawer-client.js +4 -4
  89. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts +4 -0
  90. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.d.ts.map +1 -1
  91. package/dist/src/presentation/web/components/common/feature-drawer/use-feature-actions.js +32 -1
  92. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.d.ts.map +1 -1
  93. package/dist/src/presentation/web/components/common/feature-drawer-tabs/activity-tab.js +1 -0
  94. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.d.ts +12 -0
  95. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.d.ts.map +1 -0
  96. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.js +13 -0
  97. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.stories.d.ts +15 -0
  98. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.stories.d.ts.map +1 -0
  99. package/dist/src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.stories.js +86 -0
  100. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts +9 -1
  101. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.d.ts.map +1 -1
  102. package/dist/src/presentation/web/components/common/feature-drawer-tabs/feature-drawer-tabs.js +2 -2
  103. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts +9 -1
  104. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.d.ts.map +1 -1
  105. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +3 -2
  106. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +6 -0
  107. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
  108. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +34 -0
  109. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  110. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +6 -0
  111. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +3 -1
  112. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  113. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +11 -1
  114. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  115. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +25 -8
  116. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +5 -0
  117. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  118. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +75 -1
  119. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.d.ts.map +1 -1
  120. package/dist/src/presentation/web/components/common/open-action-menu/open-action-menu.stories.js +3 -0
  121. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
  122. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +5 -3
  123. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts +2 -0
  124. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.d.ts.map +1 -1
  125. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.stories.js +21 -0
  126. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +1 -1
  127. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts +4 -0
  128. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.d.ts.map +1 -1
  129. package/dist/src/presentation/web/components/common/repository-node/use-repository-actions.js +11 -0
  130. package/dist/src/presentation/web/components/features/control-center/control-center-inner.d.ts.map +1 -1
  131. package/dist/src/presentation/web/components/features/control-center/control-center-inner.js +13 -4
  132. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts +6 -0
  133. package/dist/src/presentation/web/components/features/control-center/control-center.stories.d.ts.map +1 -1
  134. package/dist/src/presentation/web/components/features/control-center/control-center.stories.js +70 -0
  135. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts +6 -0
  136. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.d.ts.map +1 -1
  137. package/dist/src/presentation/web/components/features/control-center/use-control-center-state.js +50 -2
  138. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.d.ts.map +1 -1
  139. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.js +3 -0
  140. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.d.ts.map +1 -1
  141. package/dist/src/presentation/web/components/features/settings/feature-flags-settings-section.stories.js +3 -0
  142. package/dist/src/presentation/web/components/features/settings/settings-page-client.d.ts.map +1 -1
  143. package/dist/src/presentation/web/components/features/settings/settings-page-client.js +5 -0
  144. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.d.ts.map +1 -1
  145. package/dist/src/presentation/web/components/features/settings/settings-page-client.stories.js +1 -0
  146. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.d.ts.map +1 -1
  147. package/dist/src/presentation/web/components/layouts/app-shell/app-shell.js +1 -3
  148. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.d.ts.map +1 -1
  149. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.js +45 -5
  150. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.d.ts.map +1 -1
  151. package/dist/src/presentation/web/components/layouts/app-sidebar/app-sidebar.stories.js +1 -0
  152. package/dist/src/presentation/web/hooks/feature-flags-context.d.ts.map +1 -1
  153. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -0
  154. package/dist/src/presentation/web/hooks/sidebar-features-context.d.ts.map +1 -1
  155. package/dist/src/presentation/web/hooks/sidebar-features-context.js +1 -0
  156. package/dist/src/presentation/web/hooks/use-branch-sync-status.d.ts +14 -0
  157. package/dist/src/presentation/web/hooks/use-branch-sync-status.d.ts.map +1 -0
  158. package/dist/src/presentation/web/hooks/use-branch-sync-status.js +67 -0
  159. package/dist/src/presentation/web/hooks/use-graph-state.d.ts +1 -1
  160. package/dist/src/presentation/web/hooks/use-graph-state.d.ts.map +1 -1
  161. package/dist/src/presentation/web/hooks/use-graph-state.js +17 -2
  162. package/dist/src/presentation/web/hooks/use-sound-action.d.ts +4 -4
  163. package/dist/src/presentation/web/hooks/use-sound-action.js +2 -2
  164. package/dist/src/presentation/web/lib/derive-graph.d.ts +4 -0
  165. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
  166. package/dist/src/presentation/web/lib/derive-graph.js +11 -0
  167. package/dist/src/presentation/web/lib/feature-flags.d.ts +2 -0
  168. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  169. package/dist/src/presentation/web/lib/feature-flags.js +5 -0
  170. package/dist/tsconfig.build.tsbuildinfo +1 -1
  171. package/package.json +1 -1
  172. package/web/.next/BUILD_ID +1 -1
  173. package/web/.next/build-manifest.json +2 -2
  174. package/web/.next/fallback-build-manifest.json +2 -2
  175. package/web/.next/prerender-manifest.json +3 -3
  176. package/web/.next/required-server-files.js +3 -3
  177. package/web/.next/required-server-files.json +3 -3
  178. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +95 -50
  179. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +2 -2
  180. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  181. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  182. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +95 -50
  183. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +2 -2
  184. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  185. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  186. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +137 -62
  187. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +2 -2
  188. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  189. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  190. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +137 -62
  191. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +2 -2
  192. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  193. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  194. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +91 -46
  195. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +2 -2
  196. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  197. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  198. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +95 -50
  199. package/web/.next/server/app/(dashboard)/create/page.js +2 -2
  200. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  201. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  202. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +137 -62
  203. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +2 -2
  204. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  205. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  206. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +137 -62
  207. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +2 -2
  208. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  209. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  210. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +91 -46
  211. package/web/.next/server/app/(dashboard)/page.js +2 -2
  212. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  213. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  214. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +91 -46
  215. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +2 -2
  216. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  217. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  218. package/web/.next/server/app/_global-error.html +2 -2
  219. package/web/.next/server/app/_global-error.rsc +1 -1
  220. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  221. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  222. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  223. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  224. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  225. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  226. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  227. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  228. package/web/.next/server/app/api/evidence/route.js.nft.json +1 -1
  229. package/web/.next/server/app/api/graph-data/route.js.nft.json +1 -1
  230. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  231. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  232. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  233. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  234. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  235. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  236. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  237. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  238. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  239. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  240. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  241. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  242. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  243. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  244. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  245. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  246. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js +1 -1
  247. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
  248. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  249. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  250. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  251. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  252. package/web/.next/server/chunks/ssr/[root-of-the-server]__2c703b78._.js +4 -0
  253. package/web/.next/server/chunks/ssr/[root-of-the-server]__2c703b78._.js.map +1 -0
  254. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  255. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  256. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  257. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  258. package/web/.next/server/chunks/ssr/[root-of-the-server]__59a3897b._.js +4 -0
  259. package/web/.next/server/chunks/ssr/[root-of-the-server]__59a3897b._.js.map +1 -0
  260. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js +1 -1
  261. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js.map +1 -1
  262. package/web/.next/server/chunks/ssr/[root-of-the-server]__78aecdd5._.js +4 -0
  263. package/web/.next/server/chunks/ssr/[root-of-the-server]__78aecdd5._.js.map +1 -0
  264. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  265. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  266. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js +2 -2
  267. package/web/.next/server/chunks/ssr/[root-of-the-server]__a5f9c6e5._.js.map +1 -1
  268. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  269. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  270. package/web/.next/server/chunks/ssr/[root-of-the-server]__cb850066._.js +3 -0
  271. package/web/.next/server/chunks/ssr/[root-of-the-server]__cb850066._.js.map +1 -0
  272. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
  273. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
  274. package/web/.next/server/chunks/ssr/[root-of-the-server]__f222995d._.js +4 -0
  275. package/web/.next/server/chunks/ssr/[root-of-the-server]__f222995d._.js.map +1 -0
  276. package/web/.next/server/chunks/ssr/_0020fddd._.js +1 -1
  277. package/web/.next/server/chunks/ssr/_0020fddd._.js.map +1 -1
  278. package/web/.next/server/chunks/ssr/_02ec1aea._.js +1 -1
  279. package/web/.next/server/chunks/ssr/_02ec1aea._.js.map +1 -1
  280. package/web/.next/server/chunks/ssr/_0c5f56e3._.js +6 -0
  281. package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -0
  282. package/web/.next/server/chunks/ssr/_1b719e7f._.js +4 -0
  283. package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -0
  284. package/web/.next/server/chunks/ssr/_37e8548b._.js +4 -0
  285. package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -0
  286. package/web/.next/server/chunks/ssr/_55d763e2._.js +4 -0
  287. package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -0
  288. package/web/.next/server/chunks/ssr/_64bdfc6f._.js +6 -0
  289. package/web/.next/server/chunks/ssr/_64bdfc6f._.js.map +1 -0
  290. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  291. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  292. package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
  293. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
  294. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  295. package/web/.next/server/chunks/ssr/_aa7b4984._.js +4 -0
  296. package/web/.next/server/chunks/ssr/_aa7b4984._.js.map +1 -0
  297. package/web/.next/server/chunks/ssr/_b2336431._.js +3 -0
  298. package/web/.next/server/chunks/ssr/_b2336431._.js.map +1 -0
  299. package/web/.next/server/chunks/ssr/_b71645b4._.js +4 -0
  300. package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -0
  301. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js +3 -0
  302. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js.map +1 -0
  303. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  304. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  305. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  306. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  307. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  308. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  309. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  310. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  311. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  312. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  313. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  314. package/web/.next/server/chunks/ssr/{src_presentation_web_9d7292c4._.js → src_presentation_web_a7a9af77._.js} +2 -2
  315. package/web/.next/server/chunks/ssr/{src_presentation_web_9d7292c4._.js.map → src_presentation_web_a7a9af77._.js.map} +1 -1
  316. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +3 -0
  317. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js.map +1 -0
  318. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  319. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  320. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  321. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  322. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  323. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  324. package/web/.next/server/pages/500.html +2 -2
  325. package/web/.next/server/server-reference-manifest.js +1 -1
  326. package/web/.next/server/server-reference-manifest.json +613 -307
  327. package/web/.next/static/chunks/{4938159e46498d00.js → 01ad05d7b04a4ae4.js} +1 -1
  328. package/web/.next/static/chunks/{d11f1dbba7daafbd.js → 144c1440c7dc32ae.js} +1 -1
  329. package/web/.next/static/chunks/{73fd16bb130a559c.js → 2b88407d9d08ffb6.js} +1 -1
  330. package/web/.next/static/chunks/{d44bf63a94fd5d79.js → 65735532a80d7a48.js} +1 -1
  331. package/web/.next/static/chunks/6a370f2709c81d83.js +1 -0
  332. package/web/.next/static/chunks/{0b7fe2ac4f078f54.js → 7e7537ab107a5ed5.js} +1 -1
  333. package/web/.next/static/chunks/{9f3f53cc48fa1ccf.js → 7f8737ac3cb237f0.js} +2 -2
  334. package/web/.next/static/chunks/{a21d883baebd7bdb.js → 802c628fb0a867d5.js} +1 -1
  335. package/web/.next/static/chunks/{c2311839bfa63e4a.js → 8e1f94dab5045d3a.js} +1 -1
  336. package/web/.next/static/chunks/{e370f42e84b4ac0d.js → a523635204113a08.js} +1 -1
  337. package/web/.next/static/chunks/a67a57e5a966bf31.js +1 -0
  338. package/web/.next/static/chunks/bce9fe4010b60a86.js +1 -0
  339. package/web/.next/static/chunks/{68351a1fb1e57d86.js → d755403390c8450e.js} +1 -1
  340. package/web/.next/static/chunks/e002b0d7ed7e1436.js +2 -0
  341. package/web/.next/static/chunks/eb35e98c31806836.css +1 -0
  342. package/web/.next/static/chunks/f66c996402a430f5.js +1 -0
  343. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js +0 -3
  344. package/web/.next/server/chunks/ssr/744ca_web__next-internal_server_app_(dashboard)_@drawer_adopt_page_actions_b49d9c97.js.map +0 -1
  345. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js +0 -3
  346. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_28632197.js.map +0 -1
  347. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js +0 -3
  348. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_10695d37.js.map +0 -1
  349. package/web/.next/server/chunks/ssr/[root-of-the-server]__47ded061._.js +0 -3
  350. package/web/.next/server/chunks/ssr/[root-of-the-server]__47ded061._.js.map +0 -1
  351. package/web/.next/server/chunks/ssr/[root-of-the-server]__68ce373c._.js +0 -3
  352. package/web/.next/server/chunks/ssr/[root-of-the-server]__68ce373c._.js.map +0 -1
  353. package/web/.next/server/chunks/ssr/[root-of-the-server]__718766da._.js +0 -3
  354. package/web/.next/server/chunks/ssr/[root-of-the-server]__718766da._.js.map +0 -1
  355. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js +0 -3
  356. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3dbadca._.js.map +0 -1
  357. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdd058b2._.js +0 -3
  358. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdd058b2._.js.map +0 -1
  359. package/web/.next/server/chunks/ssr/_3a8b11f5._.js +0 -4
  360. package/web/.next/server/chunks/ssr/_3a8b11f5._.js.map +0 -1
  361. package/web/.next/server/chunks/ssr/_e69a26ba._.js +0 -4
  362. package/web/.next/server/chunks/ssr/_e69a26ba._.js.map +0 -1
  363. package/web/.next/server/chunks/ssr/_fafd03ec._.js +0 -3
  364. package/web/.next/server/chunks/ssr/_fafd03ec._.js.map +0 -1
  365. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js +0 -3
  366. package/web/.next/server/chunks/ssr/f3a1f_components_common_control-center-drawer_repository-drawer-client_tsx_39a00c03._.js.map +0 -1
  367. package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js +0 -5
  368. package/web/.next/server/chunks/ssr/src_presentation_web_53666118._.js.map +0 -1
  369. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js +0 -3
  370. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_d95e128d.js.map +0 -1
  371. package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js +0 -5
  372. package/web/.next/server/chunks/ssr/src_presentation_web_e4df6dd7._.js.map +0 -1
  373. package/web/.next/static/chunks/1ccea0ca4cca00f7.js +0 -1
  374. package/web/.next/static/chunks/5e66bfba061db621.js +0 -2
  375. package/web/.next/static/chunks/92cd6f523639a6fa.css +0 -1
  376. package/web/.next/static/chunks/d0dff217a94d4ee1.js +0 -1
  377. package/web/.next/static/chunks/e84d2b794f97eb3a.js +0 -1
  378. package/web/.next/static/chunks/eb9841ec4d80af01.js +0 -1
  379. /package/web/.next/static/{Ywxn_J9lSl6kCndILP_ke → -HU_YhdkXjBllCPooOqtQ}/_buildManifest.js +0 -0
  380. /package/web/.next/static/{Ywxn_J9lSl6kCndILP_ke → -HU_YhdkXjBllCPooOqtQ}/_clientMiddlewareManifest.json +0 -0
  381. /package/web/.next/static/{Ywxn_J9lSl6kCndILP_ke → -HU_YhdkXjBllCPooOqtQ}/_ssgManifest.js +0 -0
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Feature Unarchive Command
3
+ *
4
+ * Restores an archived feature to its previous lifecycle state.
5
+ * No confirmation needed — unarchive is always safe and non-destructive.
6
+ *
7
+ * Usage: shep feat unarchive <id>
8
+ *
9
+ * @example
10
+ * $ shep feat unarchive feat-123
11
+ */
12
+ import { Command } from 'commander';
13
+ /**
14
+ * Create the feat unarchive command
15
+ */
16
+ export declare function createUnarchiveCommand(): Command;
17
+ //# sourceMappingURL=unarchive.command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unarchive.command.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/cli/commands/feat/unarchive.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAuBhD"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Feature Unarchive Command
3
+ *
4
+ * Restores an archived feature to its previous lifecycle state.
5
+ * No confirmation needed — unarchive is always safe and non-destructive.
6
+ *
7
+ * Usage: shep feat unarchive <id>
8
+ *
9
+ * @example
10
+ * $ shep feat unarchive feat-123
11
+ */
12
+ import { Command } from 'commander';
13
+ import { container } from '../../../../../packages/core/src/infrastructure/di/container.js';
14
+ import { ShowFeatureUseCase } from '../../../../../packages/core/src/application/use-cases/features/show-feature.use-case.js';
15
+ import { UnarchiveFeatureUseCase } from '../../../../../packages/core/src/application/use-cases/features/unarchive-feature.use-case.js';
16
+ import { colors, messages } from '../../ui/index.js';
17
+ /**
18
+ * Create the feat unarchive command
19
+ */
20
+ export function createUnarchiveCommand() {
21
+ return new Command('unarchive')
22
+ .description('Restore an archived feature to its previous state')
23
+ .argument('<id>', 'Feature ID or prefix')
24
+ .action(async (featureId) => {
25
+ try {
26
+ const showUseCase = container.resolve(ShowFeatureUseCase);
27
+ const feature = await showUseCase.execute(featureId);
28
+ const unarchiveUseCase = container.resolve(UnarchiveFeatureUseCase);
29
+ const restored = await unarchiveUseCase.execute(feature.id);
30
+ messages.newline();
31
+ messages.success('Feature unarchived');
32
+ console.log(` ${colors.muted('Name:')} ${feature.name}`);
33
+ console.log(` ${colors.muted('Restored:')} ${restored.lifecycle}`);
34
+ messages.newline();
35
+ }
36
+ catch (error) {
37
+ const err = error instanceof Error ? error : new Error(String(error));
38
+ messages.error('Failed to unarchive feature', err);
39
+ process.exitCode = 1;
40
+ }
41
+ });
42
+ }
@@ -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,CAkExF"}
@@ -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,
@@ -108,7 +101,12 @@ export async function getGraphData() {
108
101
  const listFeatures = resolve('ListFeaturesUseCase');
109
102
  const listRepos = resolve('ListRepositoriesUseCase');
110
103
  const agentRunRepo = resolve('IAgentRunRepository');
111
- const [features, repositories] = await Promise.all([listFeatures.execute(), listRepos.execute()]);
104
+ // Always include archived features so the client has full data for instant
105
+ // show/hide toggle without a server round-trip (NFR-3).
106
+ const [features, repositories] = await Promise.all([
107
+ listFeatures.execute({ includeArchived: true }),
108
+ listRepos.execute(),
109
+ ]);
112
110
  // Read git info from cache (zero git calls). Stale entries trigger
113
111
  // a fire-and-forget background refresh for the next poll cycle.
114
112
  const repoGitInfoMap = new Map();
@@ -0,0 +1,6 @@
1
+ import type { Feature } from '../../../../../packages/core/src/domain/generated/output.js';
2
+ export declare function archiveFeature(featureId: string): Promise<{
3
+ feature?: Feature;
4
+ error?: string;
5
+ }>;
6
+ //# sourceMappingURL=archive-feature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/archive-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAEpE,wBAAsB,cAAc,CAClC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAahD"}
@@ -0,0 +1,16 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function archiveFeature(featureId) {
4
+ if (!featureId?.trim()) {
5
+ return { error: 'id is required' };
6
+ }
7
+ try {
8
+ const archiveFeatureUseCase = resolve('ArchiveFeatureUseCase');
9
+ const feature = await archiveFeatureUseCase.execute(featureId);
10
+ return { feature };
11
+ }
12
+ catch (error) {
13
+ const message = error instanceof Error ? error.message : 'Failed to archive feature';
14
+ return { error: message };
15
+ }
16
+ }
@@ -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
+ }
@@ -0,0 +1,6 @@
1
+ import type { Feature } from '../../../../../packages/core/src/domain/generated/output.js';
2
+ export declare function unarchiveFeature(featureId: string): Promise<{
3
+ feature?: Feature;
4
+ error?: string;
5
+ }>;
6
+ //# sourceMappingURL=unarchive-feature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unarchive-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/unarchive-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAEpE,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAahD"}
@@ -0,0 +1,16 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function unarchiveFeature(featureId) {
4
+ if (!featureId?.trim()) {
5
+ return { error: 'id is required' };
6
+ }
7
+ try {
8
+ const unarchiveFeatureUseCase = resolve('UnarchiveFeatureUseCase');
9
+ const feature = await unarchiveFeatureUseCase.execute(featureId);
10
+ return { feature };
11
+ }
12
+ catch (error) {
13
+ const message = error instanceof Error ? error.message : 'Failed to unarchive feature';
14
+ return { error: message };
15
+ }
16
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/agent-events/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiBH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAsEvC,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CA4R9C"}
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/app/api/agent-events/route.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAiBH,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAuEvC,wBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,GAAG,QAAQ,CA4R9C"}
@@ -36,6 +36,7 @@ const LIFECYCLE_TO_NODE = {
36
36
  [SdlcLifecycle.Blocked]: 'blocked',
37
37
  [SdlcLifecycle.Pending]: 'pending',
38
38
  [SdlcLifecycle.Deleting]: 'blocked',
39
+ [SdlcLifecycle.Archived]: 'archived',
39
40
  };
40
41
  const STATUS_TO_EVENT = {
41
42
  [AgentRunStatus.running]: {
@@ -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"}
@@ -3,21 +3,25 @@ import { useState, useCallback, useRef, useEffect } from 'react';
3
3
  import { openIde } from '../../../app/actions/open-ide.js';
4
4
  import { openShell } from '../../../app/actions/open-shell.js';
5
5
  import { openFolder } from '../../../app/actions/open-folder.js';
6
+ import { rebaseFeature } from '../../../app/actions/rebase-feature.js';
6
7
  const ERROR_CLEAR_DELAY = 5000;
7
8
  export function useFeatureActions(input) {
8
9
  const [ideLoading, setIdeLoading] = useState(false);
9
10
  const [shellLoading, setShellLoading] = useState(false);
10
11
  const [specsLoading, setSpecsLoading] = useState(false);
12
+ const [rebaseLoading, setRebaseLoading] = useState(false);
11
13
  const [ideError, setIdeError] = useState(null);
12
14
  const [shellError, setShellError] = useState(null);
13
15
  const [specsError, setSpecsError] = useState(null);
16
+ const [rebaseError, setRebaseError] = useState(null);
14
17
  const ideTimerRef = useRef(null);
15
18
  const shellTimerRef = useRef(null);
16
19
  const specsTimerRef = useRef(null);
20
+ const rebaseTimerRef = useRef(null);
17
21
  // Clear timers on unmount — read .current inside cleanup so we get the
18
22
  // actual timer value at teardown time, not the always-null value at mount.
19
23
  useEffect(() => {
20
- const refs = [ideTimerRef, shellTimerRef, specsTimerRef];
24
+ const refs = [ideTimerRef, shellTimerRef, specsTimerRef, rebaseTimerRef];
21
25
  return () => {
22
26
  for (const ref of refs) {
23
27
  if (ref.current)
@@ -79,15 +83,42 @@ export function useFeatureActions(input) {
79
83
  setSpecsLoading(false);
80
84
  }
81
85
  }, [input, specsLoading]);
86
+ const handleRebaseOnMain = useCallback(async () => {
87
+ if (!input?.featureId || rebaseLoading)
88
+ return;
89
+ if (rebaseTimerRef.current)
90
+ clearTimeout(rebaseTimerRef.current);
91
+ setRebaseLoading(true);
92
+ setRebaseError(null);
93
+ try {
94
+ const result = await rebaseFeature(input.featureId);
95
+ if (!result.success) {
96
+ const errorMessage = result.error ?? 'An unexpected error occurred';
97
+ setRebaseError(errorMessage);
98
+ rebaseTimerRef.current = setTimeout(() => setRebaseError(null), ERROR_CLEAR_DELAY);
99
+ }
100
+ }
101
+ catch (err) {
102
+ const errorMessage = err instanceof Error ? err.message : 'An unexpected error occurred';
103
+ setRebaseError(errorMessage);
104
+ rebaseTimerRef.current = setTimeout(() => setRebaseError(null), ERROR_CLEAR_DELAY);
105
+ }
106
+ finally {
107
+ setRebaseLoading(false);
108
+ }
109
+ }, [input, rebaseLoading]);
82
110
  return {
83
111
  openInIde: handleOpenIde,
84
112
  openInShell: handleOpenShell,
85
113
  openSpecsFolder: handleOpenSpecsFolder,
114
+ rebaseOnMain: handleRebaseOnMain,
86
115
  ideLoading,
87
116
  shellLoading,
88
117
  specsLoading,
118
+ rebaseLoading,
89
119
  ideError,
90
120
  shellError,
91
121
  specsError,
122
+ rebaseError,
92
123
  };
93
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"activity-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACtB,MAAM,yCAAyC,CAAC;AAmEjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iBAAiB,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC7C;AAuED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EAAE,EAC1B,QAAQ,CAAC,EAAE,qBAAqB,EAAE,GACjC,iBAAiB,EAAE,CAgErB;AA6BD,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,gBAAgB,2CAqE3F"}
1
+ {"version":3,"file":"activity-tab.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/activity-tab.tsx"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EACV,eAAe,EACf,qBAAqB,EACtB,MAAM,yCAAyC,CAAC;AAmEjD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,eAAe,EAAE,GAAG,IAAI,CAAC;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,iBAAiB,CAAC,EAAE,qBAAqB,EAAE,CAAC;CAC7C;AAwED;;;;;;;GAOG;AACH,MAAM,WAAW,iBAAiB;IAChC,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,0CAA0C;IAC1C,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,mEAAmE;IACnE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,eAAe,EAAE,EAC1B,QAAQ,CAAC,EAAE,qBAAqB,EAAE,GACjC,iBAAiB,EAAE,CAgErB;AA6BD,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,gBAAgB,2CAqE3F"}
@@ -72,6 +72,7 @@ const NODE_TO_PHASE = {
72
72
  research: 'Researching',
73
73
  plan: 'Planning',
74
74
  implement: 'Implementing',
75
+ rebase: 'Rebasing',
75
76
  'fast-implement': 'Fast Implement',
76
77
  evidence: 'Evidence',
77
78
  validate: 'Validating',
@@ -0,0 +1,12 @@
1
+ import type { BranchSyncData } from '../../../hooks/use-branch-sync-status.js';
2
+ export interface BranchSyncStatusProps {
3
+ syncStatus: BranchSyncData | null;
4
+ syncLoading: boolean;
5
+ syncError: string | null;
6
+ onRefreshSync: () => void;
7
+ onRebaseOnMain: () => void;
8
+ rebaseLoading: boolean;
9
+ rebaseError: string | null;
10
+ }
11
+ export declare function BranchSyncStatus({ syncStatus, syncLoading, syncError, onRefreshSync, onRebaseOnMain, rebaseLoading, rebaseError, }: BranchSyncStatusProps): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=branch-sync-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-sync-status.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,cAAc,GAAG,IAAI,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,WAAW,EACX,SAAS,EACT,aAAa,EACb,cAAc,EACd,aAAa,EACb,WAAW,GACZ,EAAE,qBAAqB,2CAkGvB"}
@@ -0,0 +1,13 @@
1
+ 'use client';
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { AlertTriangle, CheckCircle2, GitMerge, RefreshCw } from 'lucide-react';
4
+ import { CometSpinner } from '../../ui/comet-spinner.js';
5
+ import { ActionButton } from '../../common/action-button/index.js';
6
+ import { Separator } from '../../ui/separator.js';
7
+ export function BranchSyncStatus({ syncStatus, syncLoading, syncError, onRefreshSync, onRebaseOnMain, rebaseLoading, rebaseError, }) {
8
+ const isRebasing = rebaseLoading;
9
+ const isBehind = syncStatus != null && syncStatus.behind > 0;
10
+ const isUpToDate = syncStatus?.behind === 0;
11
+ const baseBranch = syncStatus?.baseBranch ?? 'main';
12
+ return (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { "data-testid": "branch-sync-status", className: "flex flex-col gap-3 p-4", children: [_jsx("div", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "BRANCH SYNC" }), _jsxs("div", { className: "flex items-center justify-between", children: [_jsx("div", { className: "flex items-center gap-2", children: syncLoading && !syncStatus ? (_jsxs(_Fragment, { children: [_jsx(CometSpinner, { size: "sm", className: "shrink-0" }), _jsx("span", { className: "text-muted-foreground text-sm", children: "Checking..." })] })) : syncError ? (_jsxs(_Fragment, { children: [_jsx(AlertTriangle, { className: "h-4 w-4 shrink-0 text-red-500" }), _jsx("span", { className: "text-sm text-red-600", children: syncError })] })) : isRebasing ? (_jsxs(_Fragment, { children: [_jsx(CometSpinner, { size: "sm", className: "shrink-0" }), _jsxs("span", { className: "text-sm", children: ["Rebasing on", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 font-mono text-xs", children: baseBranch }), "..."] })] })) : isBehind ? (_jsxs(_Fragment, { children: [_jsx(AlertTriangle, { className: "h-4 w-4 shrink-0 text-orange-500" }), _jsxs("span", { className: "text-sm", children: [syncStatus.behind, " commit", syncStatus.behind === 1 ? '' : 's', " behind", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 font-mono text-xs", children: baseBranch }), syncStatus.ahead > 0 ? (_jsxs("span", { className: "text-muted-foreground ml-1", children: ["\u00B7 ", syncStatus.ahead, " ahead"] })) : null] })] })) : isUpToDate ? (_jsxs(_Fragment, { children: [_jsx(CheckCircle2, { className: "h-4 w-4 shrink-0 text-green-500" }), _jsxs("span", { className: "text-sm", children: ["Up to date with", ' ', _jsx("code", { className: "bg-muted rounded px-1 py-0.5 font-mono text-xs", children: baseBranch }), syncStatus.ahead > 0 ? (_jsxs("span", { className: "text-muted-foreground ml-1", children: ["\u00B7 ", syncStatus.ahead, " ahead"] })) : null] })] })) : null }), (syncStatus || syncError) && !isRebasing ? (_jsx("button", { "data-testid": "sync-refresh-button", onClick: onRefreshSync, disabled: syncLoading, className: "text-muted-foreground hover:text-foreground inline-flex items-center rounded p-1 transition-colors disabled:opacity-50", "aria-label": "Refresh sync status", children: _jsx(RefreshCw, { className: `h-3.5 w-3.5 ${syncLoading ? 'animate-spin' : ''}` }) })) : null] }), isBehind && !isRebasing ? (_jsx(ActionButton, { label: "Rebase on Main", onClick: onRebaseOnMain, loading: false, error: !!rebaseError, icon: GitMerge, variant: "outline", size: "sm" })) : null, rebaseError ? _jsx("p", { className: "text-destructive text-xs", children: rebaseError }) : null] })] }));
13
+ }
@@ -0,0 +1,15 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { BranchSyncStatus } from './branch-sync-status.js';
3
+ declare const meta: Meta<typeof BranchSyncStatus>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof BranchSyncStatus>;
6
+ export declare const Loading: Story;
7
+ export declare const UpToDate: Story;
8
+ export declare const UpToDateNoAhead: Story;
9
+ export declare const Behind: Story;
10
+ export declare const BehindOneCommit: Story;
11
+ export declare const Rebasing: Story;
12
+ export declare const RebaseError: Story;
13
+ export declare const FetchError: Story;
14
+ export declare const Refreshing: Story;
15
+ //# sourceMappingURL=branch-sync-status.stories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"branch-sync-status.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-drawer-tabs/branch-sync-status.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,gBAAgB,CAoBvC,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE/C,eAAO,MAAM,OAAO,EAAE,KAMrB,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAMtB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAM7B,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,KAMpB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAM7B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAOtB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC"}