@shepai/cli 1.142.0 → 1.142.1-pr454.60f0445

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 (259) hide show
  1. package/apis/json-schema/Feature.yaml +10 -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 +2 -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 +33 -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 +24 -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 +2 -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 +16 -1
  13. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +2 -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 +29 -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 +105 -0
  18. package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.d.ts.map +1 -1
  19. package/dist/packages/core/src/application/use-cases/features/start-feature.use-case.js +2 -0
  20. package/dist/packages/core/src/domain/generated/output.d.ts +22 -1
  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 +2 -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 +4 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-fields.d.ts +11 -0
  29. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-fields.d.ts.map +1 -0
  30. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-fields.js +28 -0
  31. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  32. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +6 -2
  33. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +10 -0
  34. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
  35. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +34 -0
  36. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
  37. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +2 -0
  38. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
  39. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +6 -0
  40. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +2 -0
  41. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  42. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +12 -0
  43. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts +2 -0
  44. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  45. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +89 -49
  46. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +2 -0
  47. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
  48. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +8 -0
  49. package/dist/packages/core/src/infrastructure/services/git/git-fork.service.d.ts +29 -0
  50. package/dist/packages/core/src/infrastructure/services/git/git-fork.service.d.ts.map +1 -0
  51. package/dist/packages/core/src/infrastructure/services/git/git-fork.service.js +204 -0
  52. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts +13 -3
  53. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts.map +1 -1
  54. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js +39 -10
  55. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  56. package/dist/src/presentation/cli/commands/ui.command.js +3 -1
  57. package/dist/src/presentation/web/app/actions/create-feature.d.ts +2 -0
  58. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  59. package/dist/src/presentation/web/app/actions/create-feature.js +5 -1
  60. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  61. package/dist/src/presentation/web/app/api/agent-events/route.js +1 -0
  62. package/dist/src/presentation/web/app/api/sessions/route.d.ts.map +1 -1
  63. package/dist/src/presentation/web/app/api/sessions/route.js +45 -13
  64. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +2 -0
  65. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  66. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +22 -5
  67. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +18 -0
  68. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  69. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +52 -0
  70. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.d.ts.map +1 -1
  71. package/dist/src/presentation/web/components/common/feature-node/derive-feature-state.js +1 -0
  72. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  73. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +1 -1
  74. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts +7 -0
  75. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  76. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +29 -0
  77. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts +3 -1
  78. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts.map +1 -1
  79. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.js +13 -5
  80. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  81. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +1 -1
  82. package/dist/src/presentation/web/dev-server.js +3 -1
  83. package/dist/src/presentation/web/next.config.d.ts.map +1 -1
  84. package/dist/src/presentation/web/next.config.js +4 -0
  85. package/dist/tsconfig.build.tsbuildinfo +1 -1
  86. package/package.json +1 -1
  87. package/web/.next/BUILD_ID +1 -1
  88. package/web/.next/build-manifest.json +2 -2
  89. package/web/.next/fallback-build-manifest.json +2 -2
  90. package/web/.next/prerender-manifest.json +3 -3
  91. package/web/.next/required-server-files.js +6 -4
  92. package/web/.next/required-server-files.json +6 -4
  93. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  94. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js +1 -1
  95. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  96. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  97. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +28 -28
  98. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  99. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  100. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  102. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js +1 -1
  103. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  104. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  105. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  106. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  107. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  108. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  109. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  110. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  111. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  112. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  113. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +28 -28
  114. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  115. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  116. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  117. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  118. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js +1 -1
  119. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  120. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  121. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  122. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  123. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  124. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  125. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  126. package/web/.next/server/app/(dashboard)/page.js +1 -1
  127. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  128. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  129. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  130. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  131. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  132. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  133. package/web/.next/server/app/_global-error.html +2 -2
  134. package/web/.next/server/app/_global-error.rsc +1 -1
  135. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  136. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  137. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  138. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  139. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  140. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  141. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  142. package/web/.next/server/app/api/sessions/route.js +3 -2
  143. package/web/.next/server/app/api/sessions/route.js.nft.json +1 -1
  144. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  145. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  146. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  147. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  148. package/web/.next/server/app/skills/page.js +1 -1
  149. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  150. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  151. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  152. package/web/.next/server/app/tools/page.js +1 -1
  153. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  154. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  155. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  156. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  157. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  158. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  159. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  160. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  161. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_ff60e4a5.js +3 -0
  162. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_ff60e4a5.js.map +1 -0
  163. package/web/.next/server/chunks/[externals]__448264a3._.js +3 -0
  164. package/web/.next/server/chunks/[externals]__448264a3._.js.map +1 -0
  165. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  166. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js +1 -1
  167. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
  168. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  169. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  170. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  171. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js +3 -0
  173. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js.map +1 -0
  174. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a5f9c6e5._.js → [root-of-the-server]__2138fa7e._.js} +3 -3
  175. package/web/.next/server/chunks/ssr/{[root-of-the-server]__a5f9c6e5._.js.map → [root-of-the-server]__2138fa7e._.js.map} +1 -1
  176. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js +1 -1
  177. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  180. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  181. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  186. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js +1 -1
  187. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
  189. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js +1 -1
  191. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js.map +1 -1
  192. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js +1 -1
  193. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/_0c5f56e3._.js +2 -2
  195. package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
  197. package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
  199. package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
  200. package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
  201. package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
  202. package/web/.next/server/chunks/ssr/_6256a985._.js +1 -1
  203. package/web/.next/server/chunks/ssr/_6256a985._.js.map +1 -1
  204. package/web/.next/server/chunks/ssr/_64bdfc6f._.js +2 -2
  205. package/web/.next/server/chunks/ssr/_64bdfc6f._.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/_67104d9e._.js +1 -1
  207. package/web/.next/server/chunks/ssr/_7dca1882._.js +1 -1
  208. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +1 -1
  209. package/web/.next/server/chunks/ssr/{_7e5c4d9c._.js → _a8a2233a._.js} +2 -2
  210. package/web/.next/server/chunks/ssr/{_7e5c4d9c._.js.map → _a8a2233a._.js.map} +1 -1
  211. package/web/.next/server/chunks/ssr/_a9f57758._.js +1 -1
  212. package/web/.next/server/chunks/ssr/_b71645b4._.js +1 -1
  213. package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
  214. package/web/.next/server/chunks/ssr/_cfbd1d7e._.js +1 -1
  215. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  216. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  217. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/_f39a1adb._.js +1 -1
  219. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/{_1c6fbecf._.js → _f4d19ff3._.js} +2 -2
  221. package/web/.next/server/chunks/ssr/{_1c6fbecf._.js.map → _f4d19ff3._.js.map} +1 -1
  222. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  223. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  225. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  226. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  227. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  228. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +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/chunks/ssr/{src_presentation_web_7bda2f00._.js → src_presentation_web_d50bc654._.js} +2 -2
  234. package/web/.next/server/chunks/ssr/{src_presentation_web_7bda2f00._.js.map → src_presentation_web_d50bc654._.js.map} +1 -1
  235. package/web/.next/server/pages/500.html +2 -2
  236. package/web/.next/server/server-reference-manifest.js +1 -1
  237. package/web/.next/server/server-reference-manifest.json +44 -44
  238. package/web/.next/static/chunks/{4d7e25ef4b8e2f62.js → 00fd65dc10f3da0a.js} +1 -1
  239. package/web/.next/static/chunks/{ea9969f79b2162ec.js → 024575217799dac8.js} +1 -1
  240. package/web/.next/static/chunks/101d4334f60ec83f.js +1 -0
  241. package/web/.next/static/chunks/{73889aad2b3356b1.js → 4c543e4daf8755a3.js} +2 -2
  242. package/web/.next/static/chunks/{e599050b1f6466fe.js → 72e48a32d1f244b9.js} +1 -1
  243. package/web/.next/static/chunks/{13978ecd00a81172.js → 8a42aa668b401526.js} +1 -1
  244. package/web/.next/static/chunks/94bb64cb067c785e.js +1 -0
  245. package/web/.next/static/chunks/{74eef53714ab461d.js → 9e93ecdd1b445607.js} +1 -1
  246. package/web/.next/static/chunks/a230d5954cc322fd.js +1 -0
  247. package/web/.next/static/chunks/{2eec9756f5220e22.js → a4c2c8c731b0875f.js} +1 -1
  248. package/web/.next/static/chunks/{21ddf1d59c98adf0.js → d5bb1d4f97abcdd7.js} +1 -1
  249. package/web/.next/static/chunks/{4adda8dd11458a46.js → d7425a1e8e823fb1.js} +2 -2
  250. package/web/.next/server/chunks/[root-of-the-server]__a62bd945._.js +0 -3
  251. package/web/.next/server/chunks/[root-of-the-server]__a62bd945._.js.map +0 -1
  252. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js +0 -3
  253. package/web/.next/server/chunks/ssr/[root-of-the-server]__6ec59045._.js.map +0 -1
  254. package/web/.next/static/chunks/3f18dfdd07d48ecd.js +0 -1
  255. package/web/.next/static/chunks/6ad8d8682f4836c9.js +0 -1
  256. package/web/.next/static/chunks/a6a6a8387bae31f0.js +0 -1
  257. /package/web/.next/static/{G2BdtwIuunZEcXQ0FjJJF → zv3n0xrL5vsVhyfYT8O1w}/_buildManifest.js +0 -0
  258. /package/web/.next/static/{G2BdtwIuunZEcXQ0FjJJF → zv3n0xrL5vsVhyfYT8O1w}/_clientMiddlewareManifest.json +0 -0
  259. /package/web/.next/static/{G2BdtwIuunZEcXQ0FjJJF → zv3n0xrL5vsVhyfYT8O1w}/_ssgManifest.js +0 -0
@@ -128,6 +128,8 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
128
128
  const [ciWatchEnabled, setCiWatchEnabled] = useState(workflowDefaults?.ciWatchEnabled !== false);
129
129
  const [enableEvidence, setEnableEvidence] = useState(defaultEnableEvidence);
130
130
  const [commitEvidence, setCommitEvidence] = useState(defaultCommitEvidence);
131
+ const [forkAndPr, setForkAndPr] = useState(false);
132
+ const [commitSpecs, setCommitSpecs] = useState(true);
131
133
  const [parentId, setParentId] = useState(undefined);
132
134
  const [fast, setFast] = useState(false);
133
135
  const [pending, setPending] = useState(false);
@@ -172,6 +174,8 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
172
174
  setCiWatchEnabled(defaultCiWatch);
173
175
  setEnableEvidence(defaultEnableEvidence);
174
176
  setCommitEvidence(defaultCommitEvidence);
177
+ setForkAndPr(false);
178
+ setCommitSpecs(true);
175
179
  setParentId(undefined);
176
180
  setSelectedRepoPath(validRepoPath || undefined);
177
181
  setLocalRepos(repositories ?? []);
@@ -320,11 +324,13 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
320
324
  allowPlan: approvalGates.allowPlan ?? false,
321
325
  allowMerge: approvalGates.allowMerge ?? false,
322
326
  },
323
- push: push || openPr,
324
- openPr,
327
+ push: push || openPr || forkAndPr,
328
+ openPr: openPr || forkAndPr,
325
329
  ciWatchEnabled,
326
330
  enableEvidence,
327
331
  commitEvidence,
332
+ forkAndPr,
333
+ commitSpecs,
328
334
  fast,
329
335
  ...(pending ? { pending } : {}),
330
336
  ...(overrideAgent ? { agentType: overrideAgent } : {}),
@@ -345,6 +351,8 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
345
351
  enableEvidence,
346
352
  ciWatchEnabled,
347
353
  commitEvidence,
354
+ forkAndPr,
355
+ commitSpecs,
348
356
  fast,
349
357
  pending,
350
358
  overrideAgent,
@@ -453,15 +461,24 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
453
461
  ? 'Requires PR to be enabled'
454
462
  : !enableEvidence
455
463
  ? 'Requires evidence collection to be enabled'
456
- : 'Include evidence in the pull request body.' })] })] })] }), _jsxs("div", { className: "border-input flex items-center gap-4 rounded-md border px-3 py-2.5", children: [_jsx("span", { className: "text-muted-foreground w-16 shrink-0 text-xs font-semibold tracking-wider", children: "GIT" }), _jsxs("div", { className: "flex flex-1 items-center gap-4", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex cursor-pointer items-center gap-1.5", children: [_jsx(Switch, { id: "push", size: "sm", checked: push || openPr, onCheckedChange: (v) => {
464
+ : 'Include evidence in the pull request body.' })] })] })] }), _jsxs("div", { className: "border-input flex items-center gap-4 rounded-md border px-3 py-2.5", children: [_jsx("span", { className: "text-muted-foreground w-16 shrink-0 text-xs font-semibold tracking-wider", children: "GIT" }), _jsxs("div", { className: "flex flex-1 items-center gap-4", children: [_jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex cursor-pointer items-center gap-1.5", children: [_jsx(Switch, { id: "push", size: "sm", checked: push || openPr || forkAndPr, onCheckedChange: (v) => {
457
465
  setPush(v);
458
466
  if (!v && openPr)
459
467
  setOpenPr(false);
460
- }, disabled: isSubmitting }), _jsx(Label, { htmlFor: "push", className: "cursor-pointer text-xs font-medium", children: "Push" })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Push branch to remote after implementation." })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex cursor-pointer items-center gap-1.5", children: [_jsx(Switch, { id: "open-pr", size: "sm", checked: openPr, onCheckedChange: (v) => {
468
+ }, disabled: isSubmitting || forkAndPr }), _jsx(Label, { htmlFor: "push", className: "cursor-pointer text-xs font-medium", children: "Push" })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Push branch to remote after implementation." })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex cursor-pointer items-center gap-1.5", children: [_jsx(Switch, { id: "open-pr", size: "sm", checked: openPr || forkAndPr, onCheckedChange: (v) => {
461
469
  setOpenPr(v);
462
470
  if (!v)
463
471
  setCommitEvidence(false);
464
- }, disabled: isSubmitting }), _jsx(Label, { htmlFor: "open-pr", className: "cursor-pointer text-xs font-medium", children: "PR" })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Open a pull request after pushing." })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex cursor-pointer items-center gap-1.5", children: [_jsx(Switch, { id: "ci-watch", size: "sm", checked: ciWatchEnabled, onCheckedChange: setCiWatchEnabled, disabled: isSubmitting }), _jsx(Label, { htmlFor: "ci-watch", className: "cursor-pointer text-xs font-medium", children: "Watch" })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Watch CI and auto-fix after push." })] })] })] })] })] }) }) }) }));
472
+ }, disabled: isSubmitting || forkAndPr }), _jsx(Label, { htmlFor: "open-pr", className: "cursor-pointer text-xs font-medium", children: "PR" })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Open a pull request after pushing." })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex cursor-pointer items-center gap-1.5", children: [_jsx(Switch, { id: "ci-watch", size: "sm", checked: ciWatchEnabled, onCheckedChange: setCiWatchEnabled, disabled: isSubmitting }), _jsx(Label, { htmlFor: "ci-watch", className: "cursor-pointer text-xs font-medium", children: "Watch" })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Watch CI and auto-fix after push." })] }), _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex cursor-pointer items-center gap-1.5", children: [_jsx(Switch, { id: "fork-and-pr", size: "sm", checked: forkAndPr, onCheckedChange: (v) => {
473
+ setForkAndPr(v);
474
+ if (v) {
475
+ setCommitSpecs(false);
476
+ setPush(true);
477
+ setOpenPr(true);
478
+ }
479
+ }, disabled: isSubmitting }), _jsx(Label, { htmlFor: "fork-and-pr", className: "cursor-pointer text-xs font-medium", children: "Fork" })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Fork the repository and open a PR from the fork." })] })] })] }), _jsxs("div", { className: "border-input flex items-center gap-4 rounded-md border px-3 py-2.5", children: [_jsx("span", { className: "text-muted-foreground w-16 shrink-0 text-xs font-semibold tracking-wider", children: "SPECS" }), _jsx("div", { className: "flex flex-1 items-center gap-4", children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("div", { className: "flex cursor-pointer items-center gap-1.5", children: [_jsx(Switch, { id: "commit-specs", size: "sm", checked: commitSpecs, onCheckedChange: setCommitSpecs, disabled: isSubmitting || forkAndPr }), _jsx(Label, { htmlFor: "commit-specs", className: cn('cursor-pointer text-xs font-medium', forkAndPr && 'opacity-50'), children: "Commit" })] }) }), _jsx(TooltipContent, { side: "bottom", children: forkAndPr
480
+ ? 'Disabled when Fork is enabled'
481
+ : 'Commit spec files alongside implementation.' })] }) })] })] })] }) }) }) }));
465
482
  }
466
483
  function ParentFeatureCombobox({ features, value, onChange, disabled, }) {
467
484
  const [open, setOpen] = useState(false);
@@ -131,4 +131,22 @@ export declare const WithRepoSelector: Story;
131
131
  * The submit button remains disabled until a repository is added.
132
132
  */
133
133
  export declare const WithRepoSelectorEmpty: Story;
134
+ /**
135
+ * Fork toggle enabled — clicking the "Fork" switch sets `forkAndPr: true`,
136
+ * which also forces Push and Create PR on and disables the Commit Specs toggle.
137
+ * The submitted payload will include `forkAndPr: true`.
138
+ */
139
+ export declare const ForkAndPrEnabled: Story;
140
+ /**
141
+ * Commit Specs disabled — the "Commit" switch under the SPECS section is
142
+ * turned off so spec files are not committed alongside the implementation.
143
+ * Demonstrates that `commitSpecs: false` flows through to the submitted payload.
144
+ */
145
+ export declare const CommitSpecsDisabled: Story;
146
+ /**
147
+ * Fork enabled with description typed — a fully ready-to-submit form with
148
+ * Fork-and-PR turned on. Demonstrates the combined state: Fork forces Push
149
+ * and Create PR on, disables Commit Specs, and the description is filled in.
150
+ */
151
+ export declare const ForkAndPrWithDescription: Story;
134
152
  //# sourceMappingURL=feature-create-drawer.stories.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-create-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAU9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,mBAAmB,CAgC1C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAmDlD,uFAAuF;AACvF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAiBvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,KAUxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,KAMzB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,KAUxB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAgBjC,CAAC;AAeF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAWlC,CAAC;AAkDF,+EAA+E;AAC/E,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAwCF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAM/B,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAgBjC,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,KAY3B,CAAC;AAMF,eAAO,MAAM,WAAW,EAAE,KAwCzB,CAAC;AAuCF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAM9B,CAAC;AA6BF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAMnC,CAAC"}
1
+ {"version":3,"file":"feature-create-drawer.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAU9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,OAAO,mBAAmB,CAgC1C,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAmDlD,uFAAuF;AACvF,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAiBvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,KAMhC,CAAC;AAEF,4DAA4D;AAC5D,eAAO,MAAM,SAAS,EAAE,KAMvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,KAM1B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,KAUxB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,KAUvB,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,WAAW,EAAE,KAMzB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,KAUxB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAgBjC,CAAC;AAeF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAWlC,CAAC;AAkDF,+EAA+E;AAC/E,eAAO,MAAM,QAAQ,EAAE,KAEtB,CAAC;AAwCF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAM/B,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAgBjC,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,KAY3B,CAAC;AAMF,eAAO,MAAM,WAAW,EAAE,KAwCzB,CAAC;AAuCF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAM9B,CAAC;AA6BF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAMnC,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,KAWjC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,KAetC,CAAC"}
@@ -449,3 +449,55 @@ export const WithRepoSelectorEmpty = {
449
449
  await userEvent.click(canvas.getByRole('button', { name: 'Open (No Repos)' }));
450
450
  },
451
451
  };
452
+ /* ---------------------------------------------------------------------------
453
+ * Fork-and-PR toggle stories
454
+ * ------------------------------------------------------------------------- */
455
+ /**
456
+ * Fork toggle enabled — clicking the "Fork" switch sets `forkAndPr: true`,
457
+ * which also forces Push and Create PR on and disables the Commit Specs toggle.
458
+ * The submitted payload will include `forkAndPr: true`.
459
+ */
460
+ export const ForkAndPrEnabled = {
461
+ render: () => _jsx(CreateDrawerTrigger, { label: "Open (Fork Enabled)" }),
462
+ play: async ({ canvasElement }) => {
463
+ const canvas = within(canvasElement);
464
+ await userEvent.click(canvas.getByRole('button', { name: 'Open (Fork Enabled)' }));
465
+ const body = within(canvasElement.ownerDocument.body);
466
+ // The Switch with id="fork-and-pr" is labeled "Fork"
467
+ const forkToggle = await body.findByRole('switch', { name: /fork/i });
468
+ await userEvent.click(forkToggle);
469
+ },
470
+ };
471
+ /**
472
+ * Commit Specs disabled — the "Commit" switch under the SPECS section is
473
+ * turned off so spec files are not committed alongside the implementation.
474
+ * Demonstrates that `commitSpecs: false` flows through to the submitted payload.
475
+ */
476
+ export const CommitSpecsDisabled = {
477
+ render: () => _jsx(CreateDrawerTrigger, { label: "Open (Commit Specs Off)" }),
478
+ play: async ({ canvasElement }) => {
479
+ const canvas = within(canvasElement);
480
+ await userEvent.click(canvas.getByRole('button', { name: 'Open (Commit Specs Off)' }));
481
+ const body = within(canvasElement.ownerDocument.body);
482
+ // The Switch with id="commit-specs" is labeled "Commit"
483
+ const commitToggle = await body.findByRole('switch', { name: /commit/i });
484
+ await userEvent.click(commitToggle);
485
+ },
486
+ };
487
+ /**
488
+ * Fork enabled with description typed — a fully ready-to-submit form with
489
+ * Fork-and-PR turned on. Demonstrates the combined state: Fork forces Push
490
+ * and Create PR on, disables Commit Specs, and the description is filled in.
491
+ */
492
+ export const ForkAndPrWithDescription = {
493
+ render: () => _jsx(CreateDrawerTrigger, { label: "Open (Fork + Description)" }),
494
+ play: async ({ canvasElement }) => {
495
+ const canvas = within(canvasElement);
496
+ await userEvent.click(canvas.getByRole('button', { name: 'Open (Fork + Description)' }));
497
+ const body = within(canvasElement.ownerDocument.body);
498
+ const descInput = await body.findByPlaceholderText('e.g. Add GitHub OAuth login with callback handling and token refresh...');
499
+ await userEvent.type(descInput, 'Add OAuth2 login via forked repo and open upstream PR.');
500
+ const forkToggle = body.getByRole('switch', { name: /fork/i });
501
+ await userEvent.click(forkToggle);
502
+ },
503
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"derive-feature-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/derive-feature-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE3F;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,gBAAgB,CAiElB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAYvD;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,CAsBtF;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CASlE,CAAC;AAgBF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,qBAAqB,CAQ7F;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpC,SAAS,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC7C,SAAS,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,qBAAqB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7F,cAAc,EAAE,CAmBlB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,qBAAqB,GAAG,SAAS,CAGnC"}
1
+ {"version":3,"file":"derive-feature-state.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/derive-feature-state.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAIL,qBAAqB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAE3F;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,QAAQ,GAAG,IAAI,EAC1B,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,gBAAgB,CAiElB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAYvD;AAED,oGAAoG;AACpG,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,qBAAqB,GAAG,gBAAgB,CAsBtF;AAED,wEAAwE;AACxE,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAUlE,CAAC;AAgBF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,IAAI,GAAG,qBAAqB,CAQ7F;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACpC,SAAS,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC7C,SAAS,EAAE,qBAAqB,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,SAAS;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,qBAAqB,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,GAC7F,cAAc,EAAE,CAmBlB;AAED,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,qBAAqB,GAAG,SAAS,CAGnC"}
@@ -125,6 +125,7 @@ export const sdlcLifecycleMap = {
125
125
  Maintain: 'maintain',
126
126
  Pending: 'pending',
127
127
  Archived: 'maintain',
128
+ AwaitingUpstream: 'review',
128
129
  };
129
130
  /** Map agent graph node names (from agent_run.result or SSE phaseName) to UI lifecycle phases. */
130
131
  const phaseNameToLifecycle = {
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA6CnE,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CA8dA"}
1
+ {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA6CnE,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAgeA"}
@@ -112,7 +112,7 @@ export function FeatureNode({ data, selected, }) {
112
112
  ? 'cursor-pointer opacity-80 transition-opacity hover:opacity-100'
113
113
  : 'cursor-default'), children: data.deployment.status === DeploymentState.Booting ? (_jsx(Loader2, { className: "h-3 w-3 animate-spin text-blue-500" })) : (_jsx(Globe, { className: "h-3 w-3 text-green-600" })) }) }), _jsx(TooltipContent, { side: "top", children: data.deployment.status === DeploymentState.Booting
114
114
  ? 'Deploying...'
115
- : (data.deployment.url ?? 'Live') })] }) })) : null, data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", children: _jsx(Zap, { className: "h-3 w-3 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "top", children: "Fast Mode" })] }) })) : null, data.repositoryPath ? (_jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath })) : null] }), data.state === 'deleting' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-gray-400" }), _jsx("span", { className: "text-muted-foreground", children: "Deleting\u2026" })] })) : data.state === 'creating' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-teal-600 dark:text-teal-400" }), _jsx("span", { className: "font-medium text-teal-600 dark:text-teal-400", children: getBadgeText(data) })] })) : data.state === 'running' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-teal-600 dark:text-teal-400" }), _jsx("span", { className: "font-medium text-teal-600 dark:text-teal-400", children: getBadgeText(data) })] })) : data.state === 'action-required' ? (_jsxs(Button, { variant: "default", size: "xs", "aria-label": getActionRequiredLabel(data), "data-testid": "feature-node-approve-button",
115
+ : (data.deployment.url ?? 'Live') })] }) })) : null, data.fastMode ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", children: _jsx(Zap, { className: "h-3 w-3 text-amber-500" }) }) }), _jsx(TooltipContent, { side: "top", children: "Fast Mode" })] }) })) : null, (data.worktreePath ?? data.repositoryPath) ? (_jsx(FeatureSessionsDropdown, { repositoryPath: data.worktreePath ?? data.repositoryPath })) : null] }), data.state === 'deleting' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-gray-400" }), _jsx("span", { className: "text-muted-foreground", children: "Deleting\u2026" })] })) : data.state === 'creating' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-teal-600 dark:text-teal-400" }), _jsx("span", { className: "font-medium text-teal-600 dark:text-teal-400", children: getBadgeText(data) })] })) : data.state === 'running' ? (_jsxs("div", { className: "flex items-center gap-1.5 text-xs", children: [_jsx(Icon, { className: "h-3.5 w-3.5 shrink-0 animate-spin text-teal-600 dark:text-teal-400" }), _jsx("span", { className: "font-medium text-teal-600 dark:text-teal-400", children: getBadgeText(data) })] })) : data.state === 'action-required' ? (_jsxs(Button, { variant: "default", size: "xs", "aria-label": getActionRequiredLabel(data), "data-testid": "feature-node-approve-button",
116
116
  // eslint-disable-next-line @typescript-eslint/no-empty-function -- click bubbles to card's onNodeClick
117
117
  onClick: () => { }, className: "nodrag dark:bg-primary dark:text-primary-foreground dark:hover:bg-primary/90 cursor-pointer bg-neutral-900 text-[11px] text-white hover:bg-neutral-800", children: [_jsx(Eye, { className: "h-3 w-3" }), getActionRequiredLabel(data)] })) : data.state === 'error' && data.onRetry ? (_jsxs(Button, { variant: "outline", size: "xs", "aria-label": "Retry", "data-testid": "feature-node-retry-button", onClick: (e) => {
118
118
  e.stopPropagation();
@@ -27,6 +27,13 @@ export declare const Interactive: Story;
27
27
  export declare const Pending: Story;
28
28
  export declare const PendingWithStart: Story;
29
29
  export declare const Archived: Story;
30
+ /**
31
+ * Awaiting upstream — the feature's fork PR has been submitted and the agent
32
+ * is now waiting for the upstream repository maintainer to merge it. The node
33
+ * shows the `review` lifecycle phase (AwaitingUpstream maps to `'review'` in
34
+ * `sdlcLifecycleMap`) with `state: 'running'` and a linked PR.
35
+ */
36
+ export declare const AwaitingUpstream: Story;
30
37
  export declare const ArchivedWithUnarchive: Story;
31
38
  export declare const DoneWithArchive: Story;
32
39
  /** Shows the archive confirmation dialog in its open state. */
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAOvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAoCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAqB/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AA+LF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAYF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AA2EF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAUvC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAY5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAatB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAY/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,KAe5C,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,KAWnC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,yBAAyB,EAAE,KAyBvC,CAAC;AA0DF,uFAAuF;AACvF,eAAO,MAAM,yBAAyB,EAAE,KAoCvC,CAAC"}
1
+ {"version":3,"file":"feature-node.stories.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.stories.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAOvD,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,6BAA6B,CAAC;AAoCrC,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,eAAe,CAqB/B,CAAC;AAEF,eAAe,IAAI,CAAC;AACpB,KAAK,KAAK,GAAG,QAAQ,CAAC,eAAe,CAAC,CAAC;AAEvC,eAAO,MAAM,OAAO,EAAE,KAErB,CAAC;AA+LF,eAAO,MAAM,SAAS,EAAE,KAQvB,CAAC;AAYF,eAAO,MAAM,aAAa,EAAE,KAqB3B,CAAC;AA2EF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,eAAO,MAAM,UAAU,EAAE,KAMxB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAW7B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,yBAAyB,EAAE,KAUvC,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,KAY5B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAatB,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAc1B,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,KAY/B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,KAYlC,CAAC;AAEF,eAAO,MAAM,8BAA8B,EAAE,KAe5C,CAAC;AA4EF,eAAO,MAAM,WAAW,EAAE,KAOzB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,KAUrB,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,KAW9B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAUtB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAsB9B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,KAWnC,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,KAa7B,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,yBAAyB,EAAE,KAyBvC,CAAC;AA0DF,uFAAuF;AACvF,eAAO,MAAM,yBAAyB,EAAE,KAoCvC,CAAC"}
@@ -616,6 +616,35 @@ export const Archived = {
616
616
  },
617
617
  render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
618
618
  };
619
+ /**
620
+ * Awaiting upstream — the feature's fork PR has been submitted and the agent
621
+ * is now waiting for the upstream repository maintainer to merge it. The node
622
+ * shows the `review` lifecycle phase (AwaitingUpstream maps to `'review'` in
623
+ * `sdlcLifecycleMap`) with `state: 'running'` and a linked PR.
624
+ */
625
+ export const AwaitingUpstream = {
626
+ args: {
627
+ name: 'Upstream Contribution',
628
+ description: 'Feature submitted as fork PR — awaiting upstream merge',
629
+ featureId: '#au1',
630
+ lifecycle: 'review',
631
+ state: 'running',
632
+ progress: 95,
633
+ agentType: 'claude-code',
634
+ modelId: 'claude-sonnet-4-6',
635
+ repositoryPath: '/home/user/upstream-fork',
636
+ repositoryName: 'upstream-fork',
637
+ branch: 'feat/upstream-contribution',
638
+ pr: {
639
+ url: 'https://github.com/upstream-org/project/pull/42',
640
+ number: 42,
641
+ status: PrStatus.Open,
642
+ ciStatus: CiStatus.Success,
643
+ mergeable: true,
644
+ },
645
+ },
646
+ render: (args) => _jsx(FeatureNodeCanvas, { data: args }),
647
+ };
619
648
  export const ArchivedWithUnarchive = {
620
649
  args: {
621
650
  name: 'Old Dashboard',
@@ -13,9 +13,11 @@ export interface SessionSummary {
13
13
  interface FeatureSessionsDropdownProps {
14
14
  repositoryPath: string;
15
15
  className?: string;
16
+ /** When true, also scan worktree session directories (used by repo nodes). */
17
+ includeWorktrees?: boolean;
16
18
  /** Callback to create a feature from a session. Only shown on repo nodes. */
17
19
  onCreateFromSession?: (session: SessionSummary, sessionFilePath: string) => void;
18
20
  }
19
- export declare function FeatureSessionsDropdown({ repositoryPath, className, onCreateFromSession, }: FeatureSessionsDropdownProps): import("react/jsx-runtime").JSX.Element;
21
+ export declare function FeatureSessionsDropdown({ repositoryPath, className, includeWorktrees, onCreateFromSession, }: FeatureSessionsDropdownProps): import("react/jsx-runtime").JSX.Element;
20
22
  export {};
21
23
  //# sourceMappingURL=feature-sessions-dropdown.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"feature-sessions-dropdown.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-sessions-dropdown.tsx"],"names":[],"mappings":"AA8BA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,4BAA4B;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC;CAClF;AAmDD,wBAAgB,uBAAuB,CAAC,EACtC,cAAc,EACd,SAAS,EACT,mBAAmB,GACpB,EAAE,4BAA4B,2CA2J9B"}
1
+ {"version":3,"file":"feature-sessions-dropdown.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-sessions-dropdown.tsx"],"names":[],"mappings":"AA8BA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,4BAA4B;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,6EAA6E;IAC7E,mBAAmB,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,KAAK,IAAI,CAAC;CAClF;AAmDD,wBAAgB,uBAAuB,CAAC,EACtC,cAAc,EACd,SAAS,EACT,gBAAgB,EAChB,mBAAmB,GACpB,EAAE,4BAA4B,2CAmK9B"}
@@ -56,7 +56,7 @@ async function copyToClipboard(text) {
56
56
  function stopNodeEvent(e) {
57
57
  e.stopPropagation();
58
58
  }
59
- export function FeatureSessionsDropdown({ repositoryPath, className, onCreateFromSession, }) {
59
+ export function FeatureSessionsDropdown({ repositoryPath, className, includeWorktrees, onCreateFromSession, }) {
60
60
  const [sessions, setSessions] = useState([]);
61
61
  const [loading, setLoading] = useState(false);
62
62
  const [fetched, setFetched] = useState(false);
@@ -77,7 +77,11 @@ export function FeatureSessionsDropdown({ repositoryPath, className, onCreateFro
77
77
  // Populates count badge + active indicator, and pre-loads the dropdown.
78
78
  useEffect(() => {
79
79
  let cancelled = false;
80
- const params = new URLSearchParams({ repositoryPath, limit: '10' });
80
+ const params = new URLSearchParams({
81
+ repositoryPath,
82
+ limit: '10',
83
+ ...(includeWorktrees && { includeWorktrees: 'true' }),
84
+ });
81
85
  fetch(`/api/sessions?${params.toString()}`)
82
86
  .then((res) => (res.ok ? res.json() : null))
83
87
  .then((data) => {
@@ -91,14 +95,18 @@ export function FeatureSessionsDropdown({ repositoryPath, className, onCreateFro
91
95
  return () => {
92
96
  cancelled = true;
93
97
  };
94
- }, [repositoryPath]);
98
+ }, [repositoryPath, includeWorktrees]);
95
99
  // Re-fetch on dropdown open if not already loaded (e.g. path changed)
96
100
  const doFetch = useCallback(async () => {
97
101
  if (fetched)
98
102
  return;
99
103
  setLoading(true);
100
104
  try {
101
- const params = new URLSearchParams({ repositoryPath, limit: '10' });
105
+ const params = new URLSearchParams({
106
+ repositoryPath,
107
+ limit: '10',
108
+ ...(includeWorktrees && { includeWorktrees: 'true' }),
109
+ });
102
110
  const res = await fetch(`/api/sessions?${params.toString()}`);
103
111
  if (res.ok) {
104
112
  const data = (await res.json());
@@ -113,7 +121,7 @@ export function FeatureSessionsDropdown({ repositoryPath, className, onCreateFro
113
121
  setLoading(false);
114
122
  setFetched(true);
115
123
  }
116
- }, [repositoryPath, fetched]);
124
+ }, [repositoryPath, fetched, includeWorktrees]);
117
125
  const handleOpenChange = useCallback((open) => {
118
126
  if (open)
119
127
  void doFetch();
@@ -1 +1 @@
1
- {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CAyaA"}
1
+ {"version":3,"file":"repository-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/repository-node/repository-node.tsx"],"names":[],"mappings":"AAmCA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAOnE,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,2CA0aA"}
@@ -71,7 +71,7 @@ export function RepositoryNode({ data, selected, }) {
71
71
  e.stopPropagation();
72
72
  data.onClick?.();
73
73
  }
74
- }, className: cn('nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm transition-[border-color,box-shadow] duration-200 dark:bg-neutral-800/80', selected && 'border-blue-400 dark:border-amber-500/60'), children: [_jsxs("div", { className: "flex items-center gap-3 px-4 py-3", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, onCreateFromSession: handleCreateFromSession })] })) : null, data.onAdd ? _jsx("div", { className: "ml-1.5" }) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { "aria-label": "New feature", "data-testid": "repository-node-add-button", onClick: (e) => {
74
+ }, className: cn('nodrag bg-card flex w-[26rem] cursor-pointer flex-col overflow-hidden rounded-xl border shadow-sm transition-[border-color,box-shadow] duration-200 dark:bg-neutral-800/80', selected && 'border-blue-400 dark:border-amber-500/60'), children: [_jsxs("div", { className: "flex items-center gap-3 px-4 py-3", children: [_jsx(Github, { className: "text-muted-foreground h-5 w-5 shrink-0" }), _jsx("span", { "data-testid": "repository-node-name", className: "min-w-0 truncate text-sm font-medium", children: data.name }), _jsxs("div", { className: cn('flex shrink-0 items-center gap-2', (data.repositoryPath ?? data.onAdd) && 'ml-auto'), onClick: (e) => e.stopPropagation(), children: [data.repositoryPath ? (_jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in IDE", onClick: actions.openInIde, loading: actions.ideLoading, error: !!actions.ideError, icon: Code2, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in IDE" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open in Shell", onClick: actions.openInShell, loading: actions.shellLoading, error: !!actions.shellError, icon: Terminal, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open in Shell" })] }) }), _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "flex items-center", children: _jsx(ActionButton, { label: "Open Folder", onClick: actions.openFolder, loading: actions.folderLoading, error: !!actions.folderError, icon: FolderOpen, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { children: "Open Folder" })] }) }), _jsx(FeatureSessionsDropdown, { repositoryPath: data.repositoryPath, includeWorktrees: true, onCreateFromSession: handleCreateFromSession })] })) : null, data.onAdd ? _jsx("div", { className: "ml-1.5" }) : null, data.onAdd ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { "aria-label": "New feature", "data-testid": "repository-node-add-button", onClick: (e) => {
75
75
  e.stopPropagation();
76
76
  data.onAdd?.();
77
77
  }, className: cn('flex h-6 shrink-0 cursor-pointer items-center gap-0.5 rounded bg-blue-500 px-1.5 text-[11px] font-bold text-white transition-colors hover:bg-blue-600 dark:bg-amber-500 dark:hover:bg-amber-400', data.pulseAdd && 'animate-pulse-cta'), children: [_jsx(Plus, { className: "h-3 w-3" }), _jsx("span", { className: "translate-y-px", children: "New" })] }) }), _jsx(TooltipContent, { side: "top", children: "New feature" })] }) })) : null] })] }), data.branch ? (_jsxs(_Fragment, { children: [_jsx("div", { "data-testid": "repository-node-git-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-3 text-xs", children: [_jsxs("span", { className: "flex items-center gap-1 truncate", "data-testid": "repository-node-branch", children: [_jsx(GitBranch, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "truncate", children: data.branch })] }), data.behindCount != null && data.behindCount > 0 ? (_jsxs("span", { className: "flex shrink-0 items-center gap-1 whitespace-nowrap text-amber-500", "data-testid": "repository-node-behind", children: [_jsx(ArrowDown, { className: "h-3 w-3 shrink-0" }), data.behindCount, " behind"] })) : null] }) }), data.commitMessage ? (_jsx("div", { "data-testid": "repository-node-commit-info", className: "text-muted-foreground border-border/50 border-t px-4 py-2", children: _jsxs("div", { className: "flex items-center gap-2 text-xs", children: [_jsx(GitCommitHorizontal, { className: "h-3 w-3 shrink-0" }), _jsx("span", { className: "min-w-0 truncate", "data-testid": "repository-node-commit-message", children: data.commitMessage }), data.committer ? (_jsxs("span", { className: "text-muted-foreground/70 ml-auto flex shrink-0 items-center gap-1", "data-testid": "repository-node-committer", children: [_jsx(User, { className: "h-3 w-3 shrink-0" }), _jsx("span", { children: data.committer })] })) : null] }) })) : null] })) : data.gitInfoStatus === 'not-a-repo' ? (
@@ -20,6 +20,7 @@ import { initializeSettings } from '../../../packages/core/src/infrastructure/se
20
20
  import { initializeNotificationWatcher, getNotificationWatcher, } from '../../../packages/core/src/infrastructure/services/notifications/notification-watcher.service.js';
21
21
  import { initializePrSyncWatcher, getPrSyncWatcher, } from '../../../packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js';
22
22
  import { getExistingConnection } from '../../../packages/core/src/infrastructure/persistence/sqlite/connection.js';
23
+ import { PollUpstreamPrUseCase } from '../../../packages/core/src/application/use-cases/features/poll-upstream-pr.use-case.js';
23
24
  const DEFAULT_PORT = 3000;
24
25
  async function isPortAvailable(port) {
25
26
  return new Promise((resolve) => {
@@ -66,7 +67,8 @@ async function main() {
66
67
  // Start PR sync watcher to detect PR/CI status transitions on GitHub
67
68
  const gitPrService = container.resolve('IGitPrService');
68
69
  const db = getExistingConnection();
69
- initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db);
70
+ const pollUpstreamPrUseCase = container.resolve(PollUpstreamPrUseCase);
71
+ initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db, pollUpstreamPrUseCase);
70
72
  getPrSyncWatcher().start();
71
73
  }
72
74
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"next.config.d.ts","sourceRoot":"","sources":["../../../../src/presentation/web/next.config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAiDvC,QAAA,MAAM,UAAU,EAAE,UAsCjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"next.config.d.ts","sourceRoot":"","sources":["../../../../src/presentation/web/next.config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAiDvC,QAAA,MAAM,UAAU,EAAE,UA2CjB,CAAC;AAEF,eAAe,UAAU,CAAC"}
@@ -45,6 +45,10 @@ function loadDevFallbacks() {
45
45
  }
46
46
  }
47
47
  const nextConfig = {
48
+ // Control per-request logging in dev mode (set NEXT_LOG_REQUESTS=false to suppress)
49
+ logging: {
50
+ incomingRequests: process.env.NEXT_LOG_REQUESTS !== 'false',
51
+ },
48
52
  // Pin turbopack root to the monorepo root so it doesn't infer a wrong
49
53
  // workspace root from unrelated lockfiles higher in the filesystem.
50
54
  turbopack: {