@shepai/cli 1.145.0 → 1.146.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/apis/json-schema/Feature.yaml +25 -0
  2. package/apis/json-schema/PullRequest.yaml +11 -0
  3. package/apis/json-schema/SdlcLifecycle.yaml +1 -0
  4. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts +5 -0
  5. package/dist/packages/core/src/application/ports/output/agents/feature-agent-process.interface.d.ts.map +1 -1
  6. package/dist/packages/core/src/application/ports/output/services/git-fork-service.interface.d.ts +79 -0
  7. package/dist/packages/core/src/application/ports/output/services/git-fork-service.interface.d.ts.map +1 -0
  8. package/dist/packages/core/src/application/ports/output/services/git-fork-service.interface.js +31 -0
  9. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.d.ts.map +1 -1
  10. package/dist/packages/core/src/application/use-cases/features/adopt-branch.use-case.js +5 -0
  11. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  12. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +10 -0
  13. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +10 -0
  14. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
  15. package/dist/packages/core/src/application/use-cases/features/poll-upstream-pr.use-case.d.ts +23 -0
  16. package/dist/packages/core/src/application/use-cases/features/poll-upstream-pr.use-case.d.ts.map +1 -0
  17. package/dist/packages/core/src/application/use-cases/features/poll-upstream-pr.use-case.js +84 -0
  18. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
  19. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +2 -0
  20. package/dist/packages/core/src/domain/generated/output.d.ts +33 -0
  21. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  22. package/dist/packages/core/src/domain/generated/output.js +1 -0
  23. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/di/container.js +2 -0
  25. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +8 -0
  26. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  27. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +18 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-columns.d.ts +13 -0
  29. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-columns.d.ts.map +1 -0
  30. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-columns.js +30 -0
  31. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-per-feature-workflow-columns.d.ts +12 -0
  32. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-per-feature-workflow-columns.d.ts.map +1 -0
  33. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-per-feature-workflow-columns.js +23 -0
  34. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  35. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +23 -4
  36. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +25 -0
  37. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
  38. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +85 -0
  39. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
  40. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +5 -0
  41. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
  42. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +15 -0
  43. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +5 -0
  44. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  45. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +23 -0
  46. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts +2 -0
  47. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  48. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +50 -0
  49. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +8 -0
  50. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  51. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +40 -1
  52. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.d.ts.map +1 -1
  53. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.js +11 -9
  54. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
  55. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +5 -1
  56. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.d.ts.map +1 -1
  57. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.js +8 -6
  58. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.d.ts.map +1 -1
  59. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.js +11 -9
  60. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.d.ts.map +1 -1
  61. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.js +8 -6
  62. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.d.ts.map +1 -1
  63. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.js +3 -1
  64. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.d.ts +1 -0
  65. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.d.ts.map +1 -1
  66. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.js +9 -0
  67. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +5 -0
  68. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
  69. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +20 -0
  70. package/dist/packages/core/src/infrastructure/services/git/git-fork.service.d.ts +25 -0
  71. package/dist/packages/core/src/infrastructure/services/git/git-fork.service.d.ts.map +1 -0
  72. package/dist/packages/core/src/infrastructure/services/git/git-fork.service.js +145 -0
  73. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts +17 -3
  74. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts.map +1 -1
  75. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js +98 -15
  76. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  77. package/dist/src/presentation/cli/commands/ui.command.js +2 -1
  78. package/dist/src/presentation/web/app/actions/create-feature.d.ts +10 -0
  79. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  80. package/dist/src/presentation/web/app/actions/create-feature.js +8 -1
  81. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  82. package/dist/src/presentation/web/app/api/agent-events/route.js +1 -0
  83. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  84. package/dist/src/presentation/web/app/build-feature-node-data.js +5 -3
  85. package/dist/src/presentation/web/app/build-graph-nodes.js +5 -3
  86. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +1 -1
  87. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +4 -0
  88. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  89. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +24 -7
  90. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +12 -0
  91. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  92. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +35 -0
  93. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +7 -1
  94. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +5 -1
  95. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  96. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +12 -0
  97. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  98. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +1 -0
  99. package/dist/src/presentation/web/dev-server.js +2 -1
  100. package/dist/tsconfig.build.tsbuildinfo +1 -1
  101. package/package.json +1 -1
  102. package/web/.next/BUILD_ID +1 -1
  103. package/web/.next/build-manifest.json +2 -2
  104. package/web/.next/fallback-build-manifest.json +2 -2
  105. package/web/.next/prerender-manifest.json +3 -3
  106. package/web/.next/required-server-files.js +2 -2
  107. package/web/.next/required-server-files.json +2 -2
  108. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  109. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  110. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  111. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +28 -28
  112. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  113. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  114. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  115. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  116. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  117. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  118. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  119. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  121. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  122. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  123. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +28 -28
  124. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  125. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  126. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  127. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  128. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  129. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  130. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  131. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  132. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  133. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  134. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  135. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  136. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  137. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  138. package/web/.next/server/app/_global-error.html +2 -2
  139. package/web/.next/server/app/_global-error.rsc +1 -1
  140. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  141. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  142. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  143. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  144. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  145. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  146. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  147. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  148. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  149. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  150. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  151. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  152. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  153. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  154. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  155. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  156. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  157. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  158. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  159. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  160. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  161. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js +1 -1
  162. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
  163. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  164. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  166. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js +1 -1
  168. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js +2 -2
  170. package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js.map +1 -1
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  174. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  175. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  180. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  181. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js +1 -1
  182. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js.map +1 -1
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js +1 -1
  186. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js.map +1 -1
  187. package/web/.next/server/chunks/ssr/[root-of-the-server]__df7c1cd3._.js +3 -0
  188. package/web/.next/server/chunks/ssr/[root-of-the-server]__df7c1cd3._.js.map +1 -0
  189. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js +1 -1
  190. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js.map +1 -1
  191. package/web/.next/server/chunks/ssr/_0c5f56e3._.js +2 -2
  192. package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -1
  193. package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
  194. package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
  195. package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
  196. package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
  197. package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
  198. package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
  199. package/web/.next/server/chunks/ssr/_6256a985._.js +1 -1
  200. package/web/.next/server/chunks/ssr/_6256a985._.js.map +1 -1
  201. package/web/.next/server/chunks/ssr/_64bdfc6f._.js +2 -2
  202. package/web/.next/server/chunks/ssr/_64bdfc6f._.js.map +1 -1
  203. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  204. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  205. package/web/.next/server/chunks/ssr/_8fcc39d4._.js +3 -0
  206. package/web/.next/server/chunks/ssr/_8fcc39d4._.js.map +1 -0
  207. package/web/.next/server/chunks/ssr/_b71645b4._.js +1 -1
  208. package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
  209. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  211. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/{_2a415784._.js → _f0507de3._.js} +2 -2
  213. package/web/.next/server/chunks/ssr/{_2a415784._.js.map → _f0507de3._.js.map} +1 -1
  214. package/web/.next/server/chunks/ssr/{_1fa6f5f0._.js → _f3428a54._.js} +2 -2
  215. package/web/.next/server/chunks/ssr/{_1fa6f5f0._.js.map → _f3428a54._.js.map} +1 -1
  216. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  217. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  219. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/src_presentation_web_3f392ed3._.js +3 -0
  221. package/web/.next/server/chunks/ssr/{src_presentation_web_721fb773._.js.map → src_presentation_web_3f392ed3._.js.map} +1 -1
  222. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  223. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  225. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  227. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  228. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  229. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  230. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  231. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  232. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  233. package/web/.next/server/pages/500.html +2 -2
  234. package/web/.next/server/server-reference-manifest.js +1 -1
  235. package/web/.next/server/server-reference-manifest.json +44 -44
  236. package/web/.next/static/chunks/{f2a6406394a41d3c.js → 00c975ddd2b87528.js} +1 -1
  237. package/web/.next/static/chunks/{74ee98538b63a4b2.css → 0b18c50740356276.css} +1 -1
  238. package/web/.next/static/chunks/{266fe61224d14058.js → 0ead3bd3449a6efe.js} +1 -1
  239. package/web/.next/static/chunks/{18c49ba954b15750.js → 5afa709c97ad44c3.js} +1 -1
  240. package/web/.next/static/chunks/{ed43f5ec24322234.js → 64a97bd60c175b9e.js} +1 -1
  241. package/web/.next/static/chunks/6dad9c4718b9ef1c.js +1 -0
  242. package/web/.next/static/chunks/{c0fd9ae3d7b3ebe3.js → 7558964bf146f27c.js} +1 -1
  243. package/web/.next/static/chunks/{7559d0ac9e155de8.js → 86bc398562d84b1d.js} +2 -2
  244. package/web/.next/static/chunks/{e2e3d8a7d339c110.js → 8ff013b5490a9111.js} +1 -1
  245. package/web/.next/static/chunks/{41667f7f505952e6.js → 96fb06a2ff46e152.js} +1 -1
  246. package/web/.next/static/chunks/b3ee28e6d690043f.js +2 -0
  247. package/web/.next/static/chunks/bb466ffb8a013811.js +1 -0
  248. package/web/.next/static/chunks/d8364c7cbc1a8432.js +1 -0
  249. package/web/.next/static/chunks/fa556c575c788679.js +1 -0
  250. package/web/.next/server/chunks/ssr/[root-of-the-server]__cb850066._.js +0 -3
  251. package/web/.next/server/chunks/ssr/[root-of-the-server]__cb850066._.js.map +0 -1
  252. package/web/.next/server/chunks/ssr/_a9f57758._.js +0 -3
  253. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +0 -1
  254. package/web/.next/server/chunks/ssr/src_presentation_web_721fb773._.js +0 -3
  255. package/web/.next/static/chunks/149c88eadafaf835.js +0 -1
  256. package/web/.next/static/chunks/37b065777853153c.js +0 -2
  257. package/web/.next/static/chunks/6a370f2709c81d83.js +0 -1
  258. package/web/.next/static/chunks/a6f8230f1756f318.js +0 -1
  259. package/web/.next/static/chunks/d1c52a649f1c7704.js +0 -1
  260. /package/web/.next/static/{CrBDjRQwzIQuEXTobFPfK → i_fav2t7dzinMjPL3vmUY}/_buildManifest.js +0 -0
  261. /package/web/.next/static/{CrBDjRQwzIQuEXTobFPfK → i_fav2t7dzinMjPL3vmUY}/_clientMiddlewareManifest.json +0 -0
  262. /package/web/.next/static/{CrBDjRQwzIQuEXTobFPfK → i_fav2t7dzinMjPL3vmUY}/_ssgManifest.js +0 -0
@@ -0,0 +1,145 @@
1
+ /**
2
+ * Git Fork Service Implementation
3
+ *
4
+ * Manages GitHub fork operations: forking repos, pushing to forks,
5
+ * creating upstream PRs, and polling upstream PR status.
6
+ * Uses `gh` CLI for all GitHub API interactions.
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 { GitForkError, GitForkErrorCode, } from '../../../application/ports/output/services/git-fork-service.interface.js';
22
+ import { PrStatus } from '../../../domain/generated/output.js';
23
+ let GitForkService = class GitForkService {
24
+ execFile;
25
+ constructor(execFile) {
26
+ this.execFile = execFile;
27
+ }
28
+ async forkRepository(cwd) {
29
+ // Check if origin is already a fork — if so, just ensure upstream remote exists
30
+ try {
31
+ const { stdout } = await this.execFile('gh', ['repo', 'view', '--json', 'isFork,parent'], {
32
+ cwd,
33
+ });
34
+ const repoInfo = JSON.parse(stdout);
35
+ if (repoInfo.isFork && repoInfo.parent) {
36
+ // Origin is already a fork — ensure upstream remote points to parent
37
+ const parentUrl = `https://github.com/${repoInfo.parent.owner.login}/${repoInfo.parent.name}.git`;
38
+ try {
39
+ await this.execFile('git', ['remote', 'add', 'upstream', parentUrl], { cwd });
40
+ }
41
+ catch {
42
+ // Remote may already exist — update it
43
+ await this.execFile('git', ['remote', 'set-url', 'upstream', parentUrl], { cwd });
44
+ }
45
+ return;
46
+ }
47
+ }
48
+ catch {
49
+ // gh repo view failed — could be auth issue or not a GitHub repo
50
+ }
51
+ // Fork the repository: gh repo fork --remote remaps origin to fork, adds upstream
52
+ try {
53
+ await this.execFile('gh', ['repo', 'fork', '--remote', '--remote-name', 'origin'], { cwd });
54
+ }
55
+ catch (err) {
56
+ const message = err instanceof Error ? err.message : String(err);
57
+ if (message.includes('auth') || message.includes('login')) {
58
+ throw new GitForkError('GitHub authentication required to fork', GitForkErrorCode.AUTH_FAILURE, err instanceof Error ? err : undefined);
59
+ }
60
+ throw new GitForkError(`Failed to fork repository: ${message}`, GitForkErrorCode.FORK_FAILED, err instanceof Error ? err : undefined);
61
+ }
62
+ }
63
+ async pushToFork(cwd, branch) {
64
+ try {
65
+ await this.execFile('git', ['push', '-u', 'origin', branch], { cwd });
66
+ }
67
+ catch (err) {
68
+ const message = err instanceof Error ? err.message : String(err);
69
+ throw new GitForkError(`Failed to push to fork: ${message}`, GitForkErrorCode.PUSH_FAILED, err instanceof Error ? err : undefined);
70
+ }
71
+ }
72
+ async createUpstreamPr(cwd, title, body, head, base) {
73
+ try {
74
+ // Get the upstream repo identifier
75
+ const { stdout: upstreamUrl } = await this.execFile('git', ['remote', 'get-url', 'upstream'], { cwd });
76
+ const upstreamRepo = this.extractRepoFromUrl(upstreamUrl.trim());
77
+ // Get the fork owner for the head ref (owner:branch format)
78
+ const { stdout: forkUrl } = await this.execFile('git', ['remote', 'get-url', 'origin'], {
79
+ cwd,
80
+ });
81
+ const forkRepo = this.extractRepoFromUrl(forkUrl.trim());
82
+ const forkOwner = forkRepo.split('/')[0];
83
+ const { stdout } = await this.execFile('gh', [
84
+ 'pr',
85
+ 'create',
86
+ '--repo',
87
+ upstreamRepo,
88
+ '--title',
89
+ title,
90
+ '--body',
91
+ body,
92
+ '--head',
93
+ `${forkOwner}:${head}`,
94
+ '--base',
95
+ base,
96
+ '--json',
97
+ 'url,number',
98
+ ], { cwd });
99
+ const result = JSON.parse(stdout);
100
+ return { url: result.url, number: result.number };
101
+ }
102
+ catch (err) {
103
+ const message = err instanceof Error ? err.message : String(err);
104
+ throw new GitForkError(`Failed to create upstream PR: ${message}`, GitForkErrorCode.PR_CREATE_FAILED, err instanceof Error ? err : undefined);
105
+ }
106
+ }
107
+ async getUpstreamPrStatus(upstreamRepo, prNumber) {
108
+ try {
109
+ const { stdout } = await this.execFile('gh', ['pr', 'view', String(prNumber), '--repo', upstreamRepo, '--json', 'state'], {});
110
+ const result = JSON.parse(stdout);
111
+ const state = (result.state ?? '').toUpperCase();
112
+ if (state === 'MERGED')
113
+ return PrStatus.Merged;
114
+ if (state === 'CLOSED')
115
+ return PrStatus.Closed;
116
+ return PrStatus.Open;
117
+ }
118
+ catch (err) {
119
+ const message = err instanceof Error ? err.message : String(err);
120
+ throw new GitForkError(`Failed to get upstream PR status: ${message}`, GitForkErrorCode.PR_STATUS_FAILED, err instanceof Error ? err : undefined);
121
+ }
122
+ }
123
+ /**
124
+ * Extract owner/repo from a git remote URL.
125
+ * Handles both HTTPS and SSH formats.
126
+ */
127
+ extractRepoFromUrl(url) {
128
+ // SSH: git@github.com:owner/repo.git
129
+ const sshMatch = url.match(/git@[^:]+:([^/]+\/[^/.]+)/);
130
+ if (sshMatch)
131
+ return sshMatch[1];
132
+ // HTTPS: https://github.com/owner/repo.git
133
+ const httpsMatch = url.match(/github\.com\/([^/]+\/[^/.]+)/);
134
+ if (httpsMatch)
135
+ return httpsMatch[1];
136
+ // Strip .git suffix and return as-is
137
+ return url.replace(/\.git$/, '');
138
+ }
139
+ };
140
+ GitForkService = __decorate([
141
+ injectable(),
142
+ __param(0, inject('ExecFunction')),
143
+ __metadata("design:paramtypes", [Function])
144
+ ], GitForkService);
145
+ export { GitForkService };
@@ -2,7 +2,8 @@
2
2
  * PR Sync Watcher Service
3
3
  *
4
4
  * Polls GitHub PR status and CI status for features in the Review lifecycle
5
- * stage, updating feature records and emitting notifications when transitions
5
+ * stage, and upstream PR status for features in the AwaitingUpstream stage,
6
+ * updating feature records and emitting notifications when transitions
6
7
  * are detected. Follows the NotificationWatcherService polling pattern.
7
8
  *
8
9
  * Maintains in-memory tracking of last-known PR and CI status per feature
@@ -13,12 +14,14 @@ import type { IFeatureRepository } from '../../../application/ports/output/repos
13
14
  import type { IAgentRunRepository } from '../../../application/ports/output/agents/agent-run-repository.interface.js';
14
15
  import type { IGitPrService } from '../../../application/ports/output/services/git-pr-service.interface.js';
15
16
  import type { INotificationService } from '../../../application/ports/output/services/notification-service.interface.js';
17
+ import type { IGitForkService } from '../../../application/ports/output/services/git-fork-service.interface.js';
16
18
  import type Database from 'better-sqlite3';
17
19
  export declare class PrSyncWatcherService {
18
20
  private readonly featureRepo;
19
21
  private readonly agentRunRepo;
20
22
  private readonly gitPrService;
21
23
  private readonly notificationService;
24
+ private readonly gitForkService;
22
25
  private readonly pollIntervalMs;
23
26
  private readonly trackedFeatures;
24
27
  private readonly skippedRepos;
@@ -27,7 +30,7 @@ export declare class PrSyncWatcherService {
27
30
  private readonly processId;
28
31
  private intervalId;
29
32
  private pollCycle;
30
- constructor(featureRepo: IFeatureRepository, agentRunRepo: IAgentRunRepository, gitPrService: IGitPrService, notificationService: INotificationService, pollIntervalMs?: number, db?: Database.Database | null);
33
+ constructor(featureRepo: IFeatureRepository, agentRunRepo: IAgentRunRepository, gitPrService: IGitPrService, notificationService: INotificationService, pollIntervalMs?: number, db?: Database.Database | null, gitForkService?: IGitForkService | null);
31
34
  isRunning(): boolean;
32
35
  start(): void;
33
36
  stop(): void;
@@ -40,6 +43,17 @@ export declare class PrSyncWatcherService {
40
43
  private handleRateLimitError;
41
44
  private processRepository;
42
45
  private processFeature;
46
+ /**
47
+ * Extract upstream repo (owner/name) from an upstream PR URL.
48
+ * Expected format: https://github.com/owner/repo/pull/123
49
+ */
50
+ private extractUpstreamRepo;
51
+ /**
52
+ * Poll upstream PR status for a feature in AwaitingUpstream lifecycle.
53
+ * If the upstream PR is merged, transition to Maintain.
54
+ * If the upstream PR is closed, update upstreamPrStatus to Closed.
55
+ */
56
+ private processAwaitingUpstreamFeature;
43
57
  /** Mark associated agent run as completed so the UI reflects "done" state. */
44
58
  private completeAgentRun;
45
59
  private emitNotification;
@@ -50,7 +64,7 @@ export declare class PrSyncWatcherService {
50
64
  *
51
65
  * @throws Error if the watcher is already initialized
52
66
  */
53
- export declare function initializePrSyncWatcher(featureRepo: IFeatureRepository, agentRunRepo: IAgentRunRepository, gitPrService: IGitPrService, notificationService: INotificationService, pollIntervalMs?: number, db?: Database.Database | null): void;
67
+ export declare function initializePrSyncWatcher(featureRepo: IFeatureRepository, agentRunRepo: IAgentRunRepository, gitPrService: IGitPrService, notificationService: INotificationService, pollIntervalMs?: number, db?: Database.Database | null, gitForkService?: IGitForkService | null): void;
54
68
  /**
55
69
  * Get the PR sync watcher singleton.
56
70
  *
@@ -1 +1 @@
1
- {"version":3,"file":"pr-sync-watcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gFAAgF,CAAC;AACzH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4EAA4E,CAAC;AACtH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAK5G,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8EAA8E,CAAC;AACzH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAqB3C,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAC3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAK;gBAGpB,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,GAAE,MAAiC,EACjD,EAAE,GAAE,QAAQ,CAAC,QAAQ,GAAG,IAAW;IAWrC,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,IAAI;IAcb,IAAI,IAAI,IAAI;IASZ,gFAAgF;IAChF,OAAO,CAAC,cAAc;IAiBtB,0FAA0F;IAC1F,OAAO,CAAC,iBAAiB;YAUX,IAAI;IA6ClB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,oBAAoB;YAYd,iBAAiB;YA+CjB,cAAc;IAkM5B,8EAA8E;YAChE,gBAAgB;IAW9B,OAAO,CAAC,gBAAgB;CAoBzB;AAMD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,CAAC,EAAE,MAAM,EACvB,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,GAC5B,IAAI,CAaN;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,oBAAoB,CAQvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
1
+ {"version":3,"file":"pr-sync-watcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAWH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gFAAgF,CAAC;AACzH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4EAA4E,CAAC;AACtH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wEAAwE,CAAC;AAK5G,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8EAA8E,CAAC;AACzH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0EAA0E,CAAC;AAChH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAqB3C,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAgB;IAC7C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAuB;IAC3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA6B;IAC9D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA2B;IAC9C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAK;gBAGpB,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,GAAE,MAAiC,EACjD,EAAE,GAAE,QAAQ,CAAC,QAAQ,GAAG,IAAW,EACnC,cAAc,GAAE,eAAe,GAAG,IAAW;IAY/C,SAAS,IAAI,OAAO;IAIpB,KAAK,IAAI,IAAI;IAcb,IAAI,IAAI,IAAI;IASZ,gFAAgF;IAChF,OAAO,CAAC,cAAc;IAiBtB,0FAA0F;IAC1F,OAAO,CAAC,iBAAiB;YAUX,IAAI;IAmDlB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,oBAAoB;YAYd,iBAAiB;YA+CjB,cAAc;IAkM5B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;;;OAIG;YACW,8BAA8B;IA0F5C,8EAA8E;YAChE,gBAAgB;IAW9B,OAAO,CAAC,gBAAgB;CAoBzB;AAMD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,kBAAkB,EAC/B,YAAY,EAAE,mBAAmB,EACjC,YAAY,EAAE,aAAa,EAC3B,mBAAmB,EAAE,oBAAoB,EACzC,cAAc,CAAC,EAAE,MAAM,EACvB,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,IAAI,EAC7B,cAAc,CAAC,EAAE,eAAe,GAAG,IAAI,GACtC,IAAI,CAcN;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,oBAAoB,CAQvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,OAAO,CAE1C;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,IAAI,IAAI,CAKzC"}
@@ -2,7 +2,8 @@
2
2
  * PR Sync Watcher Service
3
3
  *
4
4
  * Polls GitHub PR status and CI status for features in the Review lifecycle
5
- * stage, updating feature records and emitting notifications when transitions
5
+ * stage, and upstream PR status for features in the AwaitingUpstream stage,
6
+ * updating feature records and emitting notifications when transitions
6
7
  * are detected. Follows the NotificationWatcherService polling pattern.
7
8
  *
8
9
  * Maintains in-memory tracking of last-known PR and CI status per feature
@@ -24,6 +25,7 @@ export class PrSyncWatcherService {
24
25
  agentRunRepo;
25
26
  gitPrService;
26
27
  notificationService;
28
+ gitForkService;
27
29
  pollIntervalMs;
28
30
  trackedFeatures = new Map();
29
31
  skippedRepos = new Set();
@@ -32,11 +34,12 @@ export class PrSyncWatcherService {
32
34
  processId;
33
35
  intervalId = null;
34
36
  pollCycle = 0;
35
- constructor(featureRepo, agentRunRepo, gitPrService, notificationService, pollIntervalMs = DEFAULT_POLL_INTERVAL_MS, db = null) {
37
+ constructor(featureRepo, agentRunRepo, gitPrService, notificationService, pollIntervalMs = DEFAULT_POLL_INTERVAL_MS, db = null, gitForkService = null) {
36
38
  this.featureRepo = featureRepo;
37
39
  this.agentRunRepo = agentRunRepo;
38
40
  this.gitPrService = gitPrService;
39
41
  this.notificationService = notificationService;
42
+ this.gitForkService = gitForkService;
40
43
  this.pollIntervalMs = pollIntervalMs;
41
44
  this.db = db;
42
45
  this.processId = `${process.pid}-${Date.now()}`;
@@ -97,26 +100,32 @@ export class PrSyncWatcherService {
97
100
  return; // another process holds the lock — skip this cycle
98
101
  }
99
102
  this.pollCycle++;
100
- const allFeatures = await this.featureRepo.list({ lifecycle: SdlcLifecycle.Review });
103
+ const allReviewFeatures = await this.featureRepo.list({ lifecycle: SdlcLifecycle.Review });
101
104
  // Include features with a valid repositoryPath (with or without PR data)
102
- const features = allFeatures.filter((f) => f.repositoryPath);
103
- if (features.length === 0) {
104
- this.trackedFeatures.clear();
105
- return;
106
- }
107
- // Group features by repositoryPath for batch queries
105
+ const reviewFeatures = allReviewFeatures.filter((f) => f.repositoryPath);
106
+ // Group Review features by repositoryPath for batch queries
108
107
  const byRepo = new Map();
109
- for (const feature of features) {
108
+ for (const feature of reviewFeatures) {
110
109
  const group = byRepo.get(feature.repositoryPath) ?? [];
111
110
  group.push(feature);
112
111
  byRepo.set(feature.repositoryPath, group);
113
112
  }
114
- // Process each repository
113
+ // Process each repository (Review features)
115
114
  for (const [repoPath, repoFeatures] of byRepo) {
116
115
  await this.processRepository(repoPath, repoFeatures);
117
116
  }
118
- // Prune features no longer in Review
119
- const currentFeatureIds = new Set(features.map((f) => f.id));
117
+ // Process AwaitingUpstream features (poll upstream PR status individually)
118
+ const awaitingFeatures = await this.featureRepo.list({
119
+ lifecycle: SdlcLifecycle.AwaitingUpstream,
120
+ });
121
+ for (const feature of awaitingFeatures) {
122
+ await this.processAwaitingUpstreamFeature(feature);
123
+ }
124
+ // Prune features no longer in Review or AwaitingUpstream
125
+ const currentFeatureIds = new Set([
126
+ ...reviewFeatures.map((f) => f.id),
127
+ ...awaitingFeatures.map((f) => f.id),
128
+ ]);
120
129
  for (const trackedId of this.trackedFeatures.keys()) {
121
130
  if (!currentFeatureIds.has(trackedId)) {
122
131
  this.trackedFeatures.delete(trackedId);
@@ -319,6 +328,80 @@ export class PrSyncWatcherService {
319
328
  tracked.unchangedCycles++;
320
329
  }
321
330
  }
331
+ /**
332
+ * Extract upstream repo (owner/name) from an upstream PR URL.
333
+ * Expected format: https://github.com/owner/repo/pull/123
334
+ */
335
+ extractUpstreamRepo(upstreamPrUrl) {
336
+ const match = upstreamPrUrl.match(/github\.com\/([^/]+\/[^/]+)\/pull\//);
337
+ return match?.[1] ?? null;
338
+ }
339
+ /**
340
+ * Poll upstream PR status for a feature in AwaitingUpstream lifecycle.
341
+ * If the upstream PR is merged, transition to Maintain.
342
+ * If the upstream PR is closed, update upstreamPrStatus to Closed.
343
+ */
344
+ async processAwaitingUpstreamFeature(feature) {
345
+ if (!this.gitForkService)
346
+ return;
347
+ if (!feature.pr?.upstreamPrUrl || !feature.pr?.upstreamPrNumber)
348
+ return;
349
+ // Check exponential backoff — skip features that haven't changed recently
350
+ if (!this.shouldPollFeature(feature.id)) {
351
+ return;
352
+ }
353
+ const upstreamRepo = this.extractUpstreamRepo(feature.pr.upstreamPrUrl);
354
+ if (!upstreamRepo) {
355
+ // eslint-disable-next-line no-console
356
+ console.warn(`${TAG} Could not extract upstream repo from URL: ${feature.pr.upstreamPrUrl}`);
357
+ return;
358
+ }
359
+ let upstreamStatus;
360
+ try {
361
+ upstreamStatus = await this.gitForkService.getUpstreamPrStatus(upstreamRepo, feature.pr.upstreamPrNumber);
362
+ }
363
+ catch (error) {
364
+ const msg = error instanceof Error ? error.message : String(error);
365
+ // eslint-disable-next-line no-console
366
+ console.warn(`${TAG} getUpstreamPrStatus failed for "${feature.name}" (${upstreamRepo}#${feature.pr.upstreamPrNumber}): ${msg}`);
367
+ return;
368
+ }
369
+ // Initialize tracking if needed
370
+ const prevState = this.trackedFeatures.get(feature.id);
371
+ if (!prevState) {
372
+ this.trackedFeatures.set(feature.id, {
373
+ prStatus: feature.pr.upstreamPrStatus ?? PrStatus.Open,
374
+ ciStatus: undefined,
375
+ mergeable: undefined,
376
+ featureName: feature.name,
377
+ unchangedCycles: 0,
378
+ });
379
+ }
380
+ const tracked = this.trackedFeatures.get(feature.id);
381
+ const previousStatus = tracked.prStatus;
382
+ if (upstreamStatus === previousStatus) {
383
+ tracked.unchangedCycles++;
384
+ return;
385
+ }
386
+ // eslint-disable-next-line no-console
387
+ console.log(`${TAG} Upstream PR #${feature.pr.upstreamPrNumber} status changed: ${previousStatus} -> ${upstreamStatus} for "${feature.name}"`);
388
+ tracked.prStatus = upstreamStatus;
389
+ tracked.unchangedCycles = 0;
390
+ if (upstreamStatus === PrStatus.Merged) {
391
+ feature.lifecycle = SdlcLifecycle.Maintain;
392
+ feature.pr = { ...feature.pr, upstreamPrStatus: PrStatus.Merged };
393
+ feature.updatedAt = new Date();
394
+ await this.featureRepo.update(feature);
395
+ await this.completeAgentRun(feature);
396
+ this.emitNotification(NotificationEventType.PrMerged, feature.id, feature.agentRunId ?? '', feature.name, `Upstream PR #${feature.pr.upstreamPrNumber} merged for ${feature.name}`, NotificationSeverity.Success);
397
+ }
398
+ else if (upstreamStatus === PrStatus.Closed) {
399
+ feature.pr = { ...feature.pr, upstreamPrStatus: PrStatus.Closed };
400
+ feature.updatedAt = new Date();
401
+ await this.featureRepo.update(feature);
402
+ this.emitNotification(NotificationEventType.PrClosed, feature.id, feature.agentRunId ?? '', feature.name, `Upstream PR #${feature.pr.upstreamPrNumber} closed for ${feature.name}`, NotificationSeverity.Warning);
403
+ }
404
+ }
322
405
  /** Mark associated agent run as completed so the UI reflects "done" state. */
323
406
  async completeAgentRun(feature) {
324
407
  if (!feature.agentRunId)
@@ -353,11 +436,11 @@ let watcherInstance = null;
353
436
  *
354
437
  * @throws Error if the watcher is already initialized
355
438
  */
356
- export function initializePrSyncWatcher(featureRepo, agentRunRepo, gitPrService, notificationService, pollIntervalMs, db) {
439
+ export function initializePrSyncWatcher(featureRepo, agentRunRepo, gitPrService, notificationService, pollIntervalMs, db, gitForkService) {
357
440
  if (watcherInstance !== null) {
358
441
  throw new Error('PR sync watcher already initialized. Cannot re-initialize.');
359
442
  }
360
- watcherInstance = new PrSyncWatcherService(featureRepo, agentRunRepo, gitPrService, notificationService, pollIntervalMs, db ?? null);
443
+ watcherInstance = new PrSyncWatcherService(featureRepo, agentRunRepo, gitPrService, notificationService, pollIntervalMs, db ?? null, gitForkService ?? null);
361
444
  }
362
445
  /**
363
446
  * Get the PR sync watcher singleton.
@@ -1 +1 @@
1
- {"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAgC1D;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CA0FzC"}
1
+ {"version":3,"file":"ui.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/ui.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAiC1D;;GAEG;AACH,wBAAgB,eAAe,IAAI,OAAO,CA4FzC"}
@@ -67,8 +67,9 @@ Examples:
67
67
  getNotificationWatcher().start();
68
68
  // Start PR sync watcher to detect PR/CI status transitions on GitHub
69
69
  const gitPrService = container.resolve('IGitPrService');
70
+ const gitForkService = container.resolve('IGitForkService');
70
71
  const db = getExistingConnection();
71
- initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db);
72
+ initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db, gitForkService);
72
73
  getPrSyncWatcher().start();
73
74
  const url = `http://localhost:${port}`;
74
75
  messages.success(`Server ready at ${fmt.code(url)}`);
@@ -20,6 +20,16 @@ interface CreateFeatureInput {
20
20
  fast?: boolean;
21
21
  /** When true, create the feature in pending state (no agent spawned). */
22
22
  pending?: boolean;
23
+ /** Fork repo and create PR to upstream at merge time. */
24
+ forkAndPr?: boolean;
25
+ /** Commit specs/evidences into the repo (default: true, auto-false when forkAndPr). */
26
+ commitSpecs?: boolean;
27
+ /** Enable CI watch/fix loop after push. */
28
+ ciWatchEnabled?: boolean;
29
+ /** Enable evidence collection after implementation. */
30
+ enableEvidence?: boolean;
31
+ /** Commit evidence to PR. */
32
+ commitEvidence?: boolean;
23
33
  /** Optional agent type override for this feature run */
24
34
  agentType?: string;
25
35
  /** Optional model identifier for this feature run */
@@ -1 +1 @@
1
- {"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAGpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA+EhD"}
1
+ {"version":3,"file":"create-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/create-feature.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAC;AAGpE,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,UAAU,kBAAkB;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE;QACd,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,yDAAyD;IACzD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,uFAAuF;IACvF,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2CAA2C;IAC3C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uDAAuD;IACvD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6BAA6B;IAC7B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2FhD"}
@@ -2,7 +2,7 @@
2
2
  import { resolve } from '../../lib/server-container.js';
3
3
  import { composeUserInput } from './compose-user-input.js';
4
4
  export async function createFeature(input) {
5
- const { description, repositoryPath, attachments, sessionId, approvalGates, push, openPr, parentId, fast, pending, agentType, model, } = input;
5
+ const { description, repositoryPath, attachments, sessionId, approvalGates, push, openPr, parentId, fast, pending, forkAndPr, commitSpecs, ciWatchEnabled, enableEvidence, commitEvidence, agentType, model, } = input;
6
6
  if (!description?.trim()) {
7
7
  return { error: 'description is required' };
8
8
  }
@@ -28,6 +28,11 @@ export async function createFeature(input) {
28
28
  description,
29
29
  ...(fast ? { fast } : {}),
30
30
  ...(pending ? { pending } : {}),
31
+ ...(forkAndPr != null ? { forkAndPr } : {}),
32
+ ...(commitSpecs != null ? { commitSpecs } : {}),
33
+ ...(ciWatchEnabled != null ? { ciWatchEnabled } : {}),
34
+ ...(enableEvidence != null ? { enableEvidence } : {}),
35
+ ...(commitEvidence != null ? { commitEvidence } : {}),
31
36
  ...(agentType ? { agentType } : {}),
32
37
  ...(model ? { model } : {}),
33
38
  });
@@ -43,6 +48,8 @@ export async function createFeature(input) {
43
48
  ...(parentId ? { parentId } : {}),
44
49
  ...(fast ? { fast } : {}),
45
50
  ...(pending ? { pending } : {}),
51
+ ...(forkAndPr != null ? { forkAndPr } : {}),
52
+ ...(commitSpecs != null ? { commitSpecs } : {}),
46
53
  ...(agentType ? { agentType } : {}),
47
54
  ...(model ? { model } : {}),
48
55
  ...(sessionId ? { sessionId } : {}),
@@ -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;AAuEvC,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;AAwEvC,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.AwaitingUpstream]: 'merge',
39
40
  [SdlcLifecycle.Archived]: 'archived',
40
41
  };
41
42
  const STATUS_TO_EVENT = {
@@ -1 +1 @@
1
- {"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAS9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,eAAe,CAoDjB"}
1
+ {"version":3,"file":"build-feature-node-data.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-feature-node-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAS9E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAExE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,qEAAqE;IACrE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,yEAAyE;IACzE,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,QAAQ,GAAG,IAAI,EACpB,OAAO,CAAC,EAAE,2BAA2B,GACpC,eAAe,CAsDjB"}
@@ -28,9 +28,11 @@ export function buildFeatureNodeData(feature, run, options) {
28
28
  approvalGates: feature.approvalGates,
29
29
  push: feature.push,
30
30
  openPr: feature.openPr,
31
- ...(options?.enableEvidence != null && { enableEvidence: options.enableEvidence }),
32
- ...(options?.commitEvidence != null && { commitEvidence: options.commitEvidence }),
33
- ...(options?.ciWatchEnabled != null && { ciWatchEnabled: options.ciWatchEnabled }),
31
+ forkAndPr: feature.forkAndPr,
32
+ commitSpecs: feature.commitSpecs,
33
+ enableEvidence: feature.enableEvidence ?? options?.enableEvidence ?? false,
34
+ commitEvidence: feature.commitEvidence ?? options?.commitEvidence ?? false,
35
+ ciWatchEnabled: feature.ciWatchEnabled ?? options?.ciWatchEnabled ?? true,
34
36
  ...(options?.hideCiStatus != null && { hideCiStatus: options.hideCiStatus }),
35
37
  ...(options?.repositoryName && { repositoryName: options.repositoryName }),
36
38
  ...(options?.baseBranch && { baseBranch: options.baseBranch }),
@@ -118,9 +118,11 @@ function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes
118
118
  approvalGates: feature.approvalGates,
119
119
  push: feature.push,
120
120
  openPr: feature.openPr,
121
- ...(options?.enableEvidence != null && { enableEvidence: options.enableEvidence }),
122
- ...(options?.commitEvidence != null && { commitEvidence: options.commitEvidence }),
123
- ...(options?.ciWatchEnabled != null && { ciWatchEnabled: options.ciWatchEnabled }),
121
+ forkAndPr: feature.forkAndPr,
122
+ commitSpecs: feature.commitSpecs,
123
+ enableEvidence: feature.enableEvidence ?? options?.enableEvidence ?? false,
124
+ commitEvidence: feature.commitEvidence ?? options?.commitEvidence ?? false,
125
+ ciWatchEnabled: feature.ciWatchEnabled ?? options?.ciWatchEnabled ?? true,
124
126
  ...(repoName && { repositoryName: repoName }),
125
127
  ...(run?.agentType && { agentType: run.agentType }),
126
128
  ...(run?.modelId && { modelId: run.modelId }),
@@ -59,5 +59,5 @@ export function BaseDrawer({ open, onClose, modal = false, dismissOnOutsideClick
59
59
  function DeployBar({ deployTarget }) {
60
60
  const deployAction = useDeployAction(deployTarget);
61
61
  const isDeploymentActive = deployAction.status === 'Booting' || deployAction.status === 'Ready';
62
- return (_jsxs("div", { "data-testid": "base-drawer-deploy-bar", className: "flex items-center gap-2 px-4 pb-3", children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeploymentActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeploymentActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: deployTarget.targetId })) : null] }));
62
+ return (_jsxs("div", { "data-testid": "base-drawer-deploy-bar", className: "flex items-center gap-2 px-4 pt-3 pb-3", children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { children: _jsx(ActionButton, { label: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server', onClick: isDeploymentActive ? deployAction.stop : deployAction.deploy, loading: deployAction.deployLoading || deployAction.stopLoading, error: !!deployAction.deployError, icon: isDeploymentActive ? Square : Play, iconOnly: true, variant: "outline", size: "icon-sm" }) }) }), _jsx(TooltipContent, { children: isDeploymentActive ? 'Stop Dev Server' : 'Start Dev Server' })] }) }), isDeploymentActive ? (_jsx(DeploymentStatusBadge, { status: deployAction.status, url: deployAction.url, targetId: deployTarget.targetId })) : null] }));
63
63
  }
@@ -39,6 +39,10 @@ export interface FeatureCreatePayload {
39
39
  fast: boolean;
40
40
  /** When true, create the feature in pending state (no agent spawned). */
41
41
  pending?: boolean;
42
+ /** Fork repo and create PR to upstream at merge time. */
43
+ forkAndPr: boolean;
44
+ /** Commit specs/evidences into the repo (defaults false when forkAndPr is enabled). */
45
+ commitSpecs: boolean;
42
46
  /** Optional agent type override for this feature run */
43
47
  agentType?: string;
44
48
  /** Optional model override for this feature run */
@@ -1 +1 @@
1
- {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"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"}