@shepai/cli 1.145.0 → 1.146.0-pr459.5feeaf5

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 (278) 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/archive-feature.use-case.d.ts +3 -1
  12. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.d.ts.map +1 -1
  13. package/dist/packages/core/src/application/use-cases/features/archive-feature.use-case.js +4 -10
  14. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  15. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +10 -0
  16. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts +10 -0
  17. package/dist/packages/core/src/application/use-cases/features/create/types.d.ts.map +1 -1
  18. package/dist/packages/core/src/application/use-cases/features/poll-upstream-pr.use-case.d.ts +23 -0
  19. package/dist/packages/core/src/application/use-cases/features/poll-upstream-pr.use-case.d.ts.map +1 -0
  20. package/dist/packages/core/src/application/use-cases/features/poll-upstream-pr.use-case.js +84 -0
  21. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
  22. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +2 -0
  23. package/dist/packages/core/src/domain/generated/output.d.ts +33 -0
  24. package/dist/packages/core/src/domain/generated/output.d.ts.map +1 -1
  25. package/dist/packages/core/src/domain/generated/output.js +1 -0
  26. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  27. package/dist/packages/core/src/infrastructure/di/container.js +2 -0
  28. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts +8 -0
  29. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/persistence/sqlite/mappers/feature.mapper.js +18 -0
  31. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-columns.d.ts +13 -0
  32. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-columns.d.ts.map +1 -0
  33. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/045-add-fork-and-pr-columns.js +30 -0
  34. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-per-feature-workflow-columns.d.ts +12 -0
  35. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-per-feature-workflow-columns.d.ts.map +1 -0
  36. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations/046-add-per-feature-workflow-columns.js +23 -0
  37. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.d.ts.map +1 -1
  38. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +23 -4
  39. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts +25 -0
  40. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/fast-feature-agent-graph.d.ts.map +1 -1
  41. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts +85 -0
  42. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-graph.d.ts.map +1 -1
  43. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts +5 -0
  44. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.d.ts.map +1 -1
  45. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-process.service.js +15 -0
  46. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts +5 -0
  47. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.d.ts.map +1 -1
  48. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/feature-agent-worker.js +23 -0
  49. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts +2 -0
  50. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  51. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +50 -0
  52. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts +8 -0
  53. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.d.ts.map +1 -1
  54. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/node-helpers.js +40 -1
  55. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.d.ts.map +1 -1
  56. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/analyze.prompt.js +11 -9
  57. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
  58. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +5 -1
  59. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.d.ts.map +1 -1
  60. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.js +8 -6
  61. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.d.ts.map +1 -1
  62. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.js +11 -9
  63. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.d.ts.map +1 -1
  64. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/research.prompt.js +8 -6
  65. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.d.ts.map +1 -1
  66. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/spec.schema.js +3 -1
  67. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.d.ts +1 -0
  68. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.d.ts.map +1 -1
  69. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/schemas/validation.js +9 -0
  70. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts +5 -0
  71. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.d.ts.map +1 -1
  72. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/state.js +20 -0
  73. package/dist/packages/core/src/infrastructure/services/git/git-fork.service.d.ts +25 -0
  74. package/dist/packages/core/src/infrastructure/services/git/git-fork.service.d.ts.map +1 -0
  75. package/dist/packages/core/src/infrastructure/services/git/git-fork.service.js +145 -0
  76. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts +17 -3
  77. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.d.ts.map +1 -1
  78. package/dist/packages/core/src/infrastructure/services/pr-sync/pr-sync-watcher.service.js +98 -15
  79. package/dist/src/presentation/cli/commands/ui.command.d.ts.map +1 -1
  80. package/dist/src/presentation/cli/commands/ui.command.js +2 -1
  81. package/dist/src/presentation/web/app/actions/create-feature.d.ts +10 -0
  82. package/dist/src/presentation/web/app/actions/create-feature.d.ts.map +1 -1
  83. package/dist/src/presentation/web/app/actions/create-feature.js +8 -1
  84. package/dist/src/presentation/web/app/api/agent-events/route.d.ts.map +1 -1
  85. package/dist/src/presentation/web/app/api/agent-events/route.js +1 -0
  86. package/dist/src/presentation/web/app/build-feature-node-data.d.ts.map +1 -1
  87. package/dist/src/presentation/web/app/build-feature-node-data.js +5 -3
  88. package/dist/src/presentation/web/app/build-graph-nodes.js +5 -3
  89. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +1 -1
  90. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts +4 -0
  91. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  92. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +24 -7
  93. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts +12 -0
  94. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.d.ts.map +1 -1
  95. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.stories.js +35 -0
  96. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +7 -1
  97. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts +5 -1
  98. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.d.ts.map +1 -1
  99. package/dist/src/presentation/web/components/common/feature-node/feature-node-state-config.js +12 -0
  100. package/dist/src/presentation/web/components/common/feature-node/feature-node.d.ts.map +1 -1
  101. package/dist/src/presentation/web/components/common/feature-node/feature-node.js +32 -17
  102. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.d.ts.map +1 -1
  103. package/dist/src/presentation/web/components/common/feature-node/feature-node.stories.js +1 -0
  104. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.d.ts.map +1 -1
  105. package/dist/src/presentation/web/components/common/feature-node/feature-sessions-dropdown.js +1 -3
  106. package/dist/src/presentation/web/dev-server.js +2 -1
  107. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
  108. package/dist/src/presentation/web/lib/derive-graph.js +4 -1
  109. package/dist/tsconfig.build.tsbuildinfo +1 -1
  110. package/package.json +1 -1
  111. package/web/.next/BUILD_ID +1 -1
  112. package/web/.next/build-manifest.json +2 -2
  113. package/web/.next/fallback-build-manifest.json +2 -2
  114. package/web/.next/prerender-manifest.json +3 -3
  115. package/web/.next/required-server-files.js +3 -3
  116. package/web/.next/required-server-files.json +3 -3
  117. package/web/.next/server/app/(dashboard)/@drawer/adopt/page/server-reference-manifest.json +28 -28
  118. package/web/.next/server/app/(dashboard)/@drawer/adopt/page.js.nft.json +1 -1
  119. package/web/.next/server/app/(dashboard)/@drawer/adopt/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +28 -28
  121. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  122. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  123. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  124. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  125. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  126. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +36 -36
  127. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  128. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  129. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  130. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  131. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  132. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +28 -28
  133. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  134. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  135. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +36 -36
  136. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  137. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  138. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +36 -36
  139. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  140. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  141. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +26 -26
  142. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  143. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  144. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +26 -26
  145. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  146. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  147. package/web/.next/server/app/_global-error.html +2 -2
  148. package/web/.next/server/app/_global-error.rsc +1 -1
  149. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  150. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  151. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  152. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  153. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  154. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +3 -3
  155. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  156. package/web/.next/server/app/settings/page/server-reference-manifest.json +8 -8
  157. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  158. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  159. package/web/.next/server/app/skills/page/server-reference-manifest.json +8 -8
  160. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  161. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  162. package/web/.next/server/app/tools/page/server-reference-manifest.json +8 -8
  163. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  164. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  165. package/web/.next/server/app/version/page/server-reference-manifest.json +3 -3
  166. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  167. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js +1 -1
  168. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_370c43b1.js.map +1 -1
  169. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js +2 -2
  170. package/web/.next/server/chunks/403f9_next_dist_esm_build_templates_app-route_4d623b8e.js.map +1 -1
  171. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  172. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js +1 -1
  173. package/web/.next/server/chunks/[root-of-the-server]__c6e32a23._.js.map +1 -1
  174. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js +1 -1
  175. package/web/.next/server/chunks/[root-of-the-server]__cd67a84c._.js.map +1 -1
  176. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  177. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  178. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js +1 -1
  179. package/web/.next/server/chunks/ssr/[root-of-the-server]__0b150ddf._.js.map +1 -1
  180. package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js +2 -2
  181. package/web/.next/server/chunks/ssr/[root-of-the-server]__2138fa7e._.js.map +1 -1
  182. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js +1 -1
  183. package/web/.next/server/chunks/ssr/[root-of-the-server]__29580090._.js.map +1 -1
  184. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  185. package/web/.next/server/chunks/ssr/[root-of-the-server]__3ef34e4c._.js +1 -1
  186. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js +1 -1
  187. package/web/.next/server/chunks/ssr/[root-of-the-server]__43f51aa6._.js.map +1 -1
  188. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js +1 -1
  189. package/web/.next/server/chunks/ssr/[root-of-the-server]__815546bd._.js.map +1 -1
  190. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  191. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  192. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js +1 -1
  193. package/web/.next/server/chunks/ssr/[root-of-the-server]__c094882b._.js.map +1 -1
  194. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js +1 -1
  195. package/web/.next/server/chunks/ssr/[root-of-the-server]__d48c5b11._.js.map +1 -1
  196. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js +1 -1
  197. package/web/.next/server/chunks/ssr/[root-of-the-server]__dac5dbf1._.js.map +1 -1
  198. package/web/.next/server/chunks/ssr/[root-of-the-server]__df7c1cd3._.js +3 -0
  199. package/web/.next/server/chunks/ssr/[root-of-the-server]__df7c1cd3._.js.map +1 -0
  200. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js +1 -1
  201. package/web/.next/server/chunks/ssr/[root-of-the-server]__fae8b355._.js.map +1 -1
  202. package/web/.next/server/chunks/ssr/_05c23ad9._.js +3 -0
  203. package/web/.next/server/chunks/ssr/_05c23ad9._.js.map +1 -0
  204. package/web/.next/server/chunks/ssr/_0c5f56e3._.js +2 -2
  205. package/web/.next/server/chunks/ssr/_0c5f56e3._.js.map +1 -1
  206. package/web/.next/server/chunks/ssr/_16eb4fec._.js +3 -0
  207. package/web/.next/server/chunks/ssr/_16eb4fec._.js.map +1 -0
  208. package/web/.next/server/chunks/ssr/_1b719e7f._.js +1 -1
  209. package/web/.next/server/chunks/ssr/_1b719e7f._.js.map +1 -1
  210. package/web/.next/server/chunks/ssr/_37e8548b._.js +1 -1
  211. package/web/.next/server/chunks/ssr/_37e8548b._.js.map +1 -1
  212. package/web/.next/server/chunks/ssr/{_2a415784._.js → _39bbc4a5._.js} +2 -2
  213. package/web/.next/server/chunks/ssr/{_2a415784._.js.map → _39bbc4a5._.js.map} +1 -1
  214. package/web/.next/server/chunks/ssr/_55d763e2._.js +1 -1
  215. package/web/.next/server/chunks/ssr/_55d763e2._.js.map +1 -1
  216. package/web/.next/server/chunks/ssr/_6256a985._.js +1 -1
  217. package/web/.next/server/chunks/ssr/_6256a985._.js.map +1 -1
  218. package/web/.next/server/chunks/ssr/_64bdfc6f._.js +2 -2
  219. package/web/.next/server/chunks/ssr/_64bdfc6f._.js.map +1 -1
  220. package/web/.next/server/chunks/ssr/_8fcc39d4._.js +3 -0
  221. package/web/.next/server/chunks/ssr/_8fcc39d4._.js.map +1 -0
  222. package/web/.next/server/chunks/ssr/_b71645b4._.js +1 -1
  223. package/web/.next/server/chunks/ssr/_b71645b4._.js.map +1 -1
  224. package/web/.next/server/chunks/ssr/_d4b20e29._.js.map +1 -1
  225. package/web/.next/server/chunks/ssr/_d8575088._.js +1 -1
  226. package/web/.next/server/chunks/ssr/_d8575088._.js.map +1 -1
  227. package/web/.next/server/chunks/ssr/{_1fa6f5f0._.js → _dc646c2a._.js} +2 -2
  228. package/web/.next/server/chunks/ssr/_dc646c2a._.js.map +1 -0
  229. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  230. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  231. package/web/.next/server/chunks/ssr/src_presentation_web_370707ae._.js +3 -0
  232. package/web/.next/server/chunks/ssr/{src_presentation_web_721fb773._.js.map → src_presentation_web_370707ae._.js.map} +1 -1
  233. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js +1 -1
  234. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1b176e3c.js.map +1 -1
  235. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js +1 -1
  236. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_bd9f0dda.js.map +1 -1
  237. package/web/.next/server/chunks/ssr/src_presentation_web_app_actions_open-ide_ts_baaca5d5._.js +1 -1
  238. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js +1 -1
  239. package/web/.next/server/chunks/ssr/src_presentation_web_ca99d62d._.js.map +1 -1
  240. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  241. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  242. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  243. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  244. package/web/.next/server/pages/500.html +2 -2
  245. package/web/.next/server/server-reference-manifest.js +1 -1
  246. package/web/.next/server/server-reference-manifest.json +44 -44
  247. package/web/.next/static/chunks/{ed43f5ec24322234.js → 10698f748e213f56.js} +1 -1
  248. package/web/.next/static/chunks/{f2a6406394a41d3c.js → 1cf06b34d929ed00.js} +1 -1
  249. package/web/.next/static/chunks/{41667f7f505952e6.js → 23880d2619875c76.js} +1 -1
  250. package/web/.next/static/chunks/2b3c4d9c3c2d780d.js +1 -0
  251. package/web/.next/static/chunks/{37b065777853153c.js → 45cccb4305162fd2.js} +2 -2
  252. package/web/.next/static/chunks/{d1c52a649f1c7704.js → 7158c8d70ae62152.js} +1 -1
  253. package/web/.next/static/chunks/{149c88eadafaf835.js → 8723fcb4bc1b7368.js} +1 -1
  254. package/web/.next/static/chunks/{266fe61224d14058.js → 9aa1c71be85ef9a0.js} +1 -1
  255. package/web/.next/static/chunks/adaab8915fc3d9ed.js +1 -0
  256. package/web/.next/static/chunks/{7559d0ac9e155de8.js → bc08a0979553926c.js} +2 -2
  257. package/web/.next/static/chunks/d61c239df26c61fd.css +1 -0
  258. package/web/.next/static/chunks/e9c4d3ec6c41dce3.js +1 -0
  259. package/web/.next/static/chunks/fa556c575c788679.js +1 -0
  260. package/web/.next/static/chunks/{e2e3d8a7d339c110.js → fac60c7ffd427538.js} +1 -1
  261. package/web/.next/server/chunks/ssr/[root-of-the-server]__cb850066._.js +0 -3
  262. package/web/.next/server/chunks/ssr/[root-of-the-server]__cb850066._.js.map +0 -1
  263. package/web/.next/server/chunks/ssr/_1fa6f5f0._.js.map +0 -1
  264. package/web/.next/server/chunks/ssr/_7dca1882._.js +0 -3
  265. package/web/.next/server/chunks/ssr/_7dca1882._.js.map +0 -1
  266. package/web/.next/server/chunks/ssr/_a9f57758._.js +0 -3
  267. package/web/.next/server/chunks/ssr/_a9f57758._.js.map +0 -1
  268. package/web/.next/server/chunks/ssr/_f39a1adb._.js +0 -3
  269. package/web/.next/server/chunks/ssr/_f39a1adb._.js.map +0 -1
  270. package/web/.next/server/chunks/ssr/src_presentation_web_721fb773._.js +0 -3
  271. package/web/.next/static/chunks/18c49ba954b15750.js +0 -1
  272. package/web/.next/static/chunks/6a370f2709c81d83.js +0 -1
  273. package/web/.next/static/chunks/74ee98538b63a4b2.css +0 -1
  274. package/web/.next/static/chunks/a6f8230f1756f318.js +0 -1
  275. package/web/.next/static/chunks/c0fd9ae3d7b3ebe3.js +0 -1
  276. /package/web/.next/static/{CrBDjRQwzIQuEXTobFPfK → wIQ1ac1VsXy7AymiKjjh-}/_buildManifest.js +0 -0
  277. /package/web/.next/static/{CrBDjRQwzIQuEXTobFPfK → wIQ1ac1VsXy7AymiKjjh-}/_clientMiddlewareManifest.json +0 -0
  278. /package/web/.next/static/{CrBDjRQwzIQuEXTobFPfK → wIQ1ac1VsXy7AymiKjjh-}/_ssgManifest.js +0 -0
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState, useCallback, useEffect, useRef } from 'react';
4
- import { PaperclipIcon, ChevronsUpDown, CheckIcon, Zap, Clock, FolderPlus, Loader2, } from 'lucide-react';
4
+ import { PaperclipIcon, ChevronsUpDown, CheckIcon, Zap, Clock, FolderPlus, Loader2, GitFork, FileText, } from 'lucide-react';
5
5
  import { cn } from '../../../lib/utils.js';
6
6
  import { useSoundAction } from '../../../hooks/use-sound-action.js';
7
7
  import { BaseDrawer } from '../../common/base-drawer/index.js';
@@ -131,6 +131,8 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
131
131
  const [parentId, setParentId] = useState(undefined);
132
132
  const [fast, setFast] = useState(false);
133
133
  const [pending, setPending] = useState(false);
134
+ const [forkAndPr, setForkAndPr] = useState(false);
135
+ const [commitSpecs, setCommitSpecs] = useState(true);
134
136
  const [overrideAgent, setOverrideAgent] = useState(undefined);
135
137
  const [overrideModel, setOverrideModel] = useState(undefined);
136
138
  const [selectedRepoPath, setSelectedRepoPath] = useState(validRepoPath || undefined);
@@ -177,6 +179,8 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
177
179
  setLocalRepos(repositories ?? []);
178
180
  setFast(false);
179
181
  setPending(false);
182
+ setForkAndPr(false);
183
+ setCommitSpecs(true);
180
184
  setOverrideAgent(undefined);
181
185
  setOverrideModel(undefined);
182
186
  setUploadError(null);
@@ -320,12 +324,14 @@ 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: forkAndPr ? true : push || openPr,
328
+ openPr: forkAndPr ? true : openPr,
325
329
  ciWatchEnabled,
326
330
  enableEvidence,
327
331
  commitEvidence,
328
332
  fast,
333
+ forkAndPr,
334
+ commitSpecs,
329
335
  ...(pending ? { pending } : {}),
330
336
  ...(overrideAgent ? { agentType: overrideAgent } : {}),
331
337
  ...(overrideModel ? { model: overrideModel } : {}),
@@ -346,6 +352,8 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
346
352
  ciWatchEnabled,
347
353
  commitEvidence,
348
354
  fast,
355
+ forkAndPr,
356
+ commitSpecs,
349
357
  pending,
350
358
  overrideAgent,
351
359
  overrideModel,
@@ -449,19 +457,28 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
449
457
  setEnableEvidence(v);
450
458
  if (!v)
451
459
  setCommitEvidence(false);
452
- }, disabled: isSubmitting }), _jsx(Label, { htmlFor: "enable-evidence", className: "cursor-pointer text-xs font-medium", children: "Collect" })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Capture screenshots and artifacts 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: "commit-evidence", size: "sm", checked: commitEvidence, onCheckedChange: setCommitEvidence, disabled: isSubmitting || !enableEvidence || !openPr }), _jsx(Label, { htmlFor: "commit-evidence", className: cn('cursor-pointer text-xs font-medium', (!enableEvidence || !openPr) && 'opacity-50'), children: "Add to PR" })] }) }), _jsx(TooltipContent, { side: "bottom", children: !openPr
460
+ }, disabled: isSubmitting }), _jsx(Label, { htmlFor: "enable-evidence", className: "cursor-pointer text-xs font-medium", children: "Collect" })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Capture screenshots and artifacts 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: "commit-evidence", size: "sm", checked: commitEvidence, onCheckedChange: setCommitEvidence, disabled: isSubmitting || !enableEvidence || (!openPr && !forkAndPr) }), _jsx(Label, { htmlFor: "commit-evidence", className: cn('cursor-pointer text-xs font-medium', (!enableEvidence || (!openPr && !forkAndPr)) && 'opacity-50'), children: "Add to PR" })] }) }), _jsx(TooltipContent, { side: "bottom", children: !openPr && !forkAndPr
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-start gap-4 rounded-md border px-3 py-2.5", children: [_jsx("span", { className: "text-muted-foreground w-16 shrink-0 pt-0.5 text-xs font-semibold tracking-wider", children: "GIT" }), _jsxs("div", { className: "flex flex-1 flex-wrap 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: forkAndPr ? true : push || openPr, 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: cn('cursor-pointer text-xs font-medium', forkAndPr && 'opacity-50'), children: "Push" })] }) }), _jsx(TooltipContent, { side: "bottom", children: forkAndPr
469
+ ? 'Enabled — contributing to upstream'
470
+ : '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: forkAndPr ? true : openPr, onCheckedChange: (v) => {
461
471
  setOpenPr(v);
462
472
  if (!v)
463
473
  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." })] })] })] })] })] }) }) }) }));
474
+ }, disabled: isSubmitting || forkAndPr }), _jsx(Label, { htmlFor: "open-pr", className: cn('cursor-pointer text-xs font-medium', forkAndPr && 'opacity-50'), children: "PR" })] }) }), _jsx(TooltipContent, { side: "bottom", children: forkAndPr
475
+ ? 'Enabled — contributing to upstream'
476
+ : '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." })] }), _jsx("div", { className: "bg-border h-4 w-px shrink-0" }), _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 }), _jsxs(Label, { htmlFor: "commit-specs", className: "flex cursor-pointer items-center gap-1 text-xs font-medium", children: [_jsx(FileText, { className: "h-3 w-3" }), "Commit Specs"] })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Commit specs to repository." })] }), _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) => {
477
+ setForkAndPr(v);
478
+ // Auto-flip commitSpecs to false when enabling contribute mode
479
+ if (v)
480
+ setCommitSpecs(false);
481
+ }, disabled: isSubmitting }), _jsxs(Label, { htmlFor: "fork-and-pr", className: "flex cursor-pointer items-center gap-1 text-xs font-medium", children: [_jsx(GitFork, { className: "h-3 w-3" }), "Fork & PR"] })] }) }), _jsx(TooltipContent, { side: "bottom", children: "Contribute via fork (PR to upstream)." })] })] })] })] })] }) }) }) }));
465
482
  }
466
483
  function ParentFeatureCombobox({ features, value, onChange, disabled, }) {
467
484
  const [open, setOpen] = useState(false);
@@ -120,6 +120,18 @@ export declare const DiscardConfirmation: Story;
120
120
  */
121
121
  export declare const DragDropReady: Story;
122
122
  export declare const Interactive: Story;
123
+ /**
124
+ * Fork & PR enabled — the "Fork & PR" toggle in the GIT row is checked.
125
+ * When enabled, Push and PR toggles are locked to `true` (disabled with
126
+ * "Enabled — contributing to upstream" tooltip), and `commitSpecs`
127
+ * auto-flips to `false`.
128
+ */
129
+ export declare const ForkAndPrEnabled: Story;
130
+ /**
131
+ * Fork & PR with Commit Specs re-enabled — after enabling contribute mode
132
+ * (which auto-disables commitSpecs), the user overrides commitSpecs back to `true`.
133
+ */
134
+ export declare const ForkAndPrWithCommitSpecs: Story;
123
135
  /**
124
136
  * With repository selector — opened from sidebar without repo context.
125
137
  * Shows the searchable repository combobox at the top of the form.
@@ -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;AAMF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAU9B,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,wBAAwB,EAAE,KAatC,CAAC;AAuCF;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,KAM9B,CAAC;AA6BF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,KAMnC,CAAC"}
@@ -398,6 +398,41 @@ export const Interactive = {
398
398
  }, repositoryPath: "/Users/dev/my-repo", currentAgentType: "claude-code", currentModel: "claude-sonnet-4-6" })] }));
399
399
  },
400
400
  };
401
+ /* ---------------------------------------------------------------------------
402
+ * Contribute (Fork & PR) stories
403
+ * ------------------------------------------------------------------------- */
404
+ /**
405
+ * Fork & PR enabled — the "Fork & PR" toggle in the GIT row is checked.
406
+ * When enabled, Push and PR toggles are locked to `true` (disabled with
407
+ * "Enabled — contributing to upstream" tooltip), and `commitSpecs`
408
+ * auto-flips to `false`.
409
+ */
410
+ export const ForkAndPrEnabled = {
411
+ render: () => _jsx(CreateDrawerTrigger, { label: "Open (Fork & PR)" }),
412
+ play: async ({ canvasElement }) => {
413
+ const canvas = within(canvasElement);
414
+ await userEvent.click(canvas.getByRole('button', { name: 'Open (Fork & PR)' }));
415
+ const body = within(canvasElement.ownerDocument.body);
416
+ const forkToggle = await body.findByLabelText('Fork & PR');
417
+ await userEvent.click(forkToggle);
418
+ },
419
+ };
420
+ /**
421
+ * Fork & PR with Commit Specs re-enabled — after enabling contribute mode
422
+ * (which auto-disables commitSpecs), the user overrides commitSpecs back to `true`.
423
+ */
424
+ export const ForkAndPrWithCommitSpecs = {
425
+ render: () => _jsx(CreateDrawerTrigger, { label: "Open (Fork + Specs)" }),
426
+ play: async ({ canvasElement }) => {
427
+ const canvas = within(canvasElement);
428
+ await userEvent.click(canvas.getByRole('button', { name: 'Open (Fork + Specs)' }));
429
+ const body = within(canvasElement.ownerDocument.body);
430
+ const forkToggle = await body.findByLabelText('Fork & PR');
431
+ await userEvent.click(forkToggle);
432
+ const specsToggle = body.getByLabelText('Commit Specs');
433
+ await userEvent.click(specsToggle);
434
+ },
435
+ };
401
436
  /* ---------------------------------------------------------------------------
402
437
  * Repository selector stories
403
438
  * ------------------------------------------------------------------------- */
@@ -120,10 +120,16 @@ function FeatureSettings({ data }) {
120
120
  data.openPr != null ||
121
121
  data.ciWatchEnabled != null ||
122
122
  data.enableEvidence != null ||
123
+ data.forkAndPr != null ||
124
+ data.commitSpecs != null ||
123
125
  data.modelId;
124
126
  if (!hasSettings)
125
127
  return null;
126
- return (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { "data-testid": "feature-drawer-settings", className: "flex flex-col gap-3 p-4", children: [_jsx("span", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "SETTINGS" }), data.modelId ? (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Model" }), _jsx("span", { className: "text-sm", children: getModelMeta(data.modelId).displayName || data.modelId })] })) : null, data.approvalGates ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs font-medium", children: [_jsx(ShieldCheck, { className: "h-3 w-3" }), "Auto-Approve"] }), _jsxs("div", { className: "flex flex-wrap gap-1.5", children: [_jsx(SettingBadge, { enabled: data.approvalGates.allowPrd, label: "PRD" }), _jsx(SettingBadge, { enabled: data.approvalGates.allowPlan, label: "Plan" }), _jsx(SettingBadge, { enabled: data.approvalGates.allowMerge, label: "Merge" })] })] })) : null, data.enableEvidence != null ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs font-medium", children: [_jsx(FileSearch, { className: "h-3 w-3" }), "Evidence"] }), _jsxs("div", { className: "flex flex-wrap gap-1.5", children: [_jsx(SettingBadge, { enabled: data.enableEvidence, label: "Collect" }), data.commitEvidence != null ? (_jsx(SettingBadge, { enabled: data.commitEvidence, label: "Add to PR" })) : null] })] })) : null, data.push != null || data.openPr != null || data.ciWatchEnabled != null ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs font-medium", children: [_jsx(GitBranch, { className: "h-3 w-3" }), "Git"] }), _jsxs("div", { className: "flex flex-wrap gap-1.5", children: [data.push != null ? _jsx(SettingBadge, { enabled: data.push, label: "Push" }) : null, data.openPr != null ? _jsx(SettingBadge, { enabled: data.openPr, label: "PR" }) : null, data.ciWatchEnabled != null ? (_jsx(SettingBadge, { enabled: data.ciWatchEnabled, label: "Watch" })) : null] })] })) : null] })] }));
128
+ return (_jsxs(_Fragment, { children: [_jsx(Separator, {}), _jsxs("div", { "data-testid": "feature-drawer-settings", className: "flex flex-col gap-3 p-4", children: [_jsx("span", { className: "text-muted-foreground text-xs font-semibold tracking-wider", children: "SETTINGS" }), data.modelId ? (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: "Model" }), _jsx("span", { className: "text-sm", children: getModelMeta(data.modelId).displayName || data.modelId })] })) : null, data.approvalGates ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs font-medium", children: [_jsx(ShieldCheck, { className: "h-3 w-3" }), "Auto-Approve"] }), _jsxs("div", { className: "flex flex-wrap gap-1.5", children: [_jsx(SettingBadge, { enabled: data.approvalGates.allowPrd, label: "PRD" }), _jsx(SettingBadge, { enabled: data.approvalGates.allowPlan, label: "Plan" }), _jsx(SettingBadge, { enabled: data.approvalGates.allowMerge, label: "Merge" })] })] })) : null, data.enableEvidence != null ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs font-medium", children: [_jsx(FileSearch, { className: "h-3 w-3" }), "Evidence"] }), _jsxs("div", { className: "flex flex-wrap gap-1.5", children: [_jsx(SettingBadge, { enabled: data.enableEvidence, label: "Collect" }), data.commitEvidence != null ? (_jsx(SettingBadge, { enabled: data.commitEvidence, label: "Add to PR" })) : null] })] })) : null, data.push != null ||
129
+ data.openPr != null ||
130
+ data.ciWatchEnabled != null ||
131
+ data.commitSpecs != null ||
132
+ data.forkAndPr != null ? (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("span", { className: "text-muted-foreground flex items-center gap-1 text-xs font-medium", children: [_jsx(GitBranch, { className: "h-3 w-3" }), "Git"] }), _jsxs("div", { className: "flex flex-wrap gap-1.5", children: [data.push != null ? _jsx(SettingBadge, { enabled: data.push, label: "Push" }) : null, data.openPr != null ? _jsx(SettingBadge, { enabled: data.openPr, label: "PR" }) : null, data.ciWatchEnabled != null ? (_jsx(SettingBadge, { enabled: data.ciWatchEnabled, label: "Watch" })) : null, data.commitSpecs != null ? (_jsx(SettingBadge, { enabled: data.commitSpecs, label: "Commit Specs" })) : null, data.forkAndPr != null ? (_jsx(SettingBadge, { enabled: data.forkAndPr, label: "Fork & PR" })) : null] })] })) : null] })] }));
127
133
  }
128
134
  function DetailRow({ label, value }) {
129
135
  return (_jsxs("div", { className: "flex flex-col gap-0.5", children: [_jsx("span", { className: "text-muted-foreground text-xs font-medium", children: label }), _jsx("span", { className: "text-sm", children: value })] }));
@@ -3,7 +3,7 @@ import type { Node } from '@xyflow/react';
3
3
  import type { PrStatus, CiStatus, DeploymentState } from '../../../../../../packages/core/src/domain/generated/output.js';
4
4
  import type { AgentTypeValue } from './agent-type-icons.js';
5
5
  export type FeatureNodeState = 'creating' | 'running' | 'action-required' | 'done' | 'blocked' | 'pending' | 'error' | 'deleting' | 'archived';
6
- export type FeatureLifecyclePhase = 'pending' | 'requirements' | 'research' | 'implementation' | 'review' | 'deploy' | 'maintain';
6
+ export type FeatureLifecyclePhase = 'pending' | 'requirements' | 'research' | 'implementation' | 'review' | 'awaitingUpstream' | 'deploy' | 'maintain';
7
7
  /** Human-readable display labels for lifecycle phases. */
8
8
  export declare const lifecycleDisplayLabels: Record<FeatureLifecyclePhase, string>;
9
9
  /** Left border color for each lifecycle phase. */
@@ -94,6 +94,10 @@ export interface FeatureNodeData {
94
94
  enableEvidence?: boolean;
95
95
  /** Whether evidence is committed to the PR body */
96
96
  commitEvidence?: boolean;
97
+ /** Whether to fork the repo and create a PR to upstream */
98
+ forkAndPr?: boolean;
99
+ /** Whether to commit specs into the repository */
100
+ commitSpecs?: boolean;
97
101
  /** Whether to hide CI status badges from UI */
98
102
  hideCiStatus?: boolean;
99
103
  /** Whether the feature has an associated agent run (for log tab visibility) */
@@ -1 +1 @@
1
- {"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"feature-node-state-config.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node-state-config.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export const lifecycleDisplayLabels = {
6
6
  research: 'RESEARCH',
7
7
  implementation: 'IMPLEMENTATION',
8
8
  review: 'REVIEW',
9
+ awaitingUpstream: 'AWAITING UPSTREAM',
9
10
  deploy: 'DEPLOY & QA',
10
11
  maintain: 'COMPLETED',
11
12
  };
@@ -16,6 +17,7 @@ export const lifecycleBorderColors = {
16
17
  research: 'border-l-cyan-500',
17
18
  implementation: 'border-l-blue-500',
18
19
  review: 'border-l-amber-500',
20
+ awaitingUpstream: 'border-l-amber-500',
19
21
  deploy: 'border-l-emerald-500',
20
22
  maintain: 'border-l-gray-400',
21
23
  };
@@ -26,6 +28,7 @@ export const lifecycleAccentColors = {
26
28
  research: 'bg-cyan-500',
27
29
  implementation: 'bg-blue-500',
28
30
  review: 'bg-amber-500',
31
+ awaitingUpstream: 'bg-amber-500',
29
32
  deploy: 'bg-emerald-500',
30
33
  maintain: 'bg-gray-400',
31
34
  };
@@ -71,6 +74,14 @@ export const lifecyclePhaseBadge = {
71
74
  tooltip: 'Merge Review',
72
75
  description: 'Ready to merge — the code is complete. Review the changes and approve to merge into your repository.',
73
76
  },
77
+ awaitingUpstream: {
78
+ letter: 'U',
79
+ bg: 'bg-amber-100 dark:bg-amber-900/40',
80
+ text: 'text-amber-600 dark:text-amber-300',
81
+ dot: 'bg-amber-500',
82
+ tooltip: 'Awaiting upstream merge',
83
+ description: 'PR submitted to upstream — waiting for the upstream maintainer to review and merge.',
84
+ },
74
85
  deploy: {
75
86
  letter: 'Q',
76
87
  bg: 'bg-lime-100 dark:bg-lime-900/40',
@@ -107,6 +118,7 @@ export const lifecycleRunningVerbs = {
107
118
  research: 'Researching',
108
119
  implementation: 'Implementing',
109
120
  review: 'Reviewing',
121
+ awaitingUpstream: 'Awaiting upstream',
110
122
  deploy: 'Deploying',
111
123
  maintain: 'Maintaining',
112
124
  };
@@ -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,2CAgeA"}
1
+ {"version":3,"file":"feature-node.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-node/feature-node.tsx"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AA4CnE,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,2CA4kBA"}
@@ -2,16 +2,18 @@
2
2
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
3
  import { useState } from 'react';
4
4
  import { Handle, Position } from '@xyflow/react';
5
- import { Plus, Trash2, Zap, Loader2, Globe, RotateCcw, Play, Eye, Archive, ArchiveRestore, } from 'lucide-react';
5
+ import { Plus, Trash2, Zap, ClipboardList, Loader2, Globe, RotateCcw, Play, Square, Eye, Archive, ArchiveRestore, } from 'lucide-react';
6
6
  import { cn } from '../../../lib/utils.js';
7
+ import { ActionButton } from '../../common/action-button/action-button.js';
7
8
  import { Button } from '../../ui/button.js';
8
9
  import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '../../ui/tooltip.js';
10
+ import { useDeployAction } from '../../../hooks/use-deploy-action.js';
11
+ import { useFeatureFlags } from '../../../hooks/feature-flags-context.js';
9
12
  import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from '../../ui/alert-dialog.js';
10
13
  import { DeleteFeatureDialog } from '../../common/delete-feature-dialog/index.js';
11
14
  import { featureNodeStateConfig, lifecycleRunningVerbs, lifecyclePhaseBadge, } from './feature-node-state-config.js';
12
15
  import { getAgentTypeIcon } from './agent-type-icons.js';
13
16
  import { FeatureSessionsDropdown } from './feature-sessions-dropdown.js';
14
- import { DeploymentState } from '../../../../../../packages/core/src/domain/generated/output.js';
15
17
  function AgentIcon({ agentType, className }) {
16
18
  const IconComponent = getAgentTypeIcon(agentType);
17
19
  return _jsx(IconComponent, { className: className });
@@ -57,6 +59,18 @@ export function FeatureNode({ data, selected, }) {
57
59
  const [confirmOpen, setConfirmOpen] = useState(false);
58
60
  const [idCopied, setIdCopied] = useState(false);
59
61
  const [archiveConfirmOpen, setArchiveConfirmOpen] = useState(false);
62
+ const featureFlags = useFeatureFlags();
63
+ const deployTarget = featureFlags.envDeploy && data.repositoryPath && data.branch
64
+ ? {
65
+ targetId: data.featureId,
66
+ targetType: 'feature',
67
+ repositoryPath: data.repositoryPath,
68
+ branch: data.branch,
69
+ }
70
+ : null;
71
+ const deployAction = useDeployAction(deployTarget);
72
+ const isDeployActive = deployAction.status === 'Booting' || deployAction.status === 'Ready';
73
+ const isDeployReady = deployAction.status === 'Ready';
60
74
  return (_jsxs("div", { className: "animate-in fade-in group relative duration-300", children: [data.showHandles ? (_jsx(Handle, { type: "target", position: Position.Left, isConnectable: false, className: "opacity-0!", style: { top: 70 } })) : null, _jsx("div", { className: "absolute top-0 bottom-0 -left-14 flex items-center justify-center pr-3 pl-4 opacity-0 transition-opacity group-hover:opacity-100", onPointerDown: (e) => e.stopPropagation(), children: _jsxs("div", { className: "flex flex-col items-center gap-2", children: [data.onArchive &&
61
75
  data.featureId &&
62
76
  data.state !== 'deleting' &&
@@ -83,7 +97,7 @@ export function FeatureNode({ data, selected, }) {
83
97
  selected &&
84
98
  'border-t-rose-400 border-r-rose-400 border-b-rose-400 dark:border-t-amber-500 dark:border-r-amber-500 dark:border-b-amber-500', selected &&
85
99
  data.state !== 'action-required' &&
86
- 'border-blue-400 dark:border-amber-500/60', data.state === 'deleting' && 'opacity-60', data.state === 'archived' && 'opacity-50'), children: [data.state !== 'creating' ? (_jsx("div", { className: "absolute top-3 right-4", children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { "data-testid": "feature-node-phase-badge", className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-[10px]", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("span", { className: cn('h-1.5 w-1.5 -translate-y-px rounded-full', lifecyclePhaseBadge[data.lifecycle].dot) })] }) }), _jsxs(TooltipContent, { side: "right", className: "max-w-56", children: [_jsx("p", { className: "font-semibold", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("p", { className: "mt-1 text-xs leading-relaxed text-neutral-500", children: lifecyclePhaseBadge[data.lifecycle].description })] })] }) }) })) : null, _jsxs("div", { className: "flex items-center gap-1.5 pr-24", children: [data.agentType ? (_jsx(AgentIcon, { agentType: data.agentType, className: "h-4 w-4 shrink-0" })) : null, _jsx("h3", { className: "min-w-0 truncate text-sm font-bold", children: data.name })] }), data.description ? (_jsx("p", { "data-testid": "feature-node-description", className: "text-muted-foreground mt-1 line-clamp-2 text-xs", children: data.description })) : null, _jsxs("div", { className: "mt-auto pt-2", children: [config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground flex items-center justify-end text-[10px]", children: _jsxs("span", { children: [data.progress, "%"] }) }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : null, !config.showProgressBar &&
100
+ 'border-blue-400 dark:border-amber-500/60', data.state === 'deleting' && 'opacity-60', data.state === 'archived' && 'opacity-50'), children: [data.state !== 'creating' ? (_jsx("div", { className: "absolute top-3 right-4", children: _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("span", { "data-testid": "feature-node-phase-badge", className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-muted-foreground text-[10px]", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("span", { className: cn('h-1.5 w-1.5 -translate-y-px rounded-full', lifecyclePhaseBadge[data.lifecycle].dot) })] }) }), _jsxs(TooltipContent, { side: "right", className: "max-w-56", children: [_jsx("p", { className: "font-semibold", children: lifecyclePhaseBadge[data.lifecycle].tooltip }), _jsx("p", { className: "mt-1 text-xs leading-relaxed text-neutral-500", children: lifecyclePhaseBadge[data.lifecycle].description })] })] }) }) })) : null, _jsxs("div", { className: "flex items-center gap-1.5 pr-24", children: [data.agentType ? (_jsx(AgentIcon, { agentType: data.agentType, className: "h-4 w-4 shrink-0" })) : null, _jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { "data-testid": "feature-node-fast-mode-badge", className: "shrink-0", children: data.fastMode ? (_jsx(Zap, { className: "h-3.5 w-3.5 text-amber-500" })) : (_jsx(ClipboardList, { className: "h-3.5 w-3.5 text-indigo-500" })) }) }), _jsx(TooltipContent, { side: "top", children: data.fastMode ? 'Fast Mode' : 'Spec Driven' })] }) }), _jsx("h3", { className: "min-w-0 truncate text-sm font-bold", children: data.name })] }), data.description ? (_jsx("p", { "data-testid": "feature-node-description", className: "text-muted-foreground mt-1 line-clamp-2 text-xs", children: data.description })) : null, _jsxs("div", { className: "mt-auto pt-2", children: [config.showProgressBar ? (_jsxs(_Fragment, { children: [_jsx("div", { className: "text-muted-foreground flex items-center justify-end text-[10px]", children: _jsxs("span", { children: [data.progress, "%"] }) }), _jsx("div", { "data-testid": "feature-node-progress-bar", className: "bg-muted mt-1.5 h-1 w-full overflow-hidden rounded-full", children: _jsx("div", { className: cn('h-full rounded-full transition-all', config.progressClass), style: { width: `${data.progress}%` } }) })] })) : null, !config.showProgressBar &&
87
101
  ![
88
102
  'deleting',
89
103
  'creating',
@@ -95,24 +109,25 @@ export function FeatureNode({ data, selected, }) {
95
109
  ].includes(data.state) ? (_jsxs("div", { "data-testid": "feature-node-badge", className: "relative flex min-w-0 items-center gap-1.5 text-xs", children: [(() => {
96
110
  const BadgeIcon = getBadgeIcon(data);
97
111
  return _jsx(BadgeIcon, { className: cn('h-3.5 w-3.5 shrink-0', config.badgeClass) });
98
- })(), _jsx("span", { className: cn('translate-y-px truncate text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : null, _jsxs("div", { className: "mt-1.5 flex min-h-[26px] items-center justify-between gap-2", children: [_jsxs("div", { className: "flex items-center gap-1.5", style: { transform: 'translateY(1px)' }, children: [data.featureId ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsxs("button", { type: "button", "data-testid": "feature-node-id", className: "nodrag text-muted-foreground/60 hover:text-muted-foreground flex cursor-pointer items-baseline gap-1 font-mono text-[10px] transition-colors active:scale-95", onClick: (e) => {
112
+ })(), _jsx("span", { className: cn('translate-y-px truncate text-[11px] font-medium', config.badgeClass), children: getBadgeText(data) })] })) : null, _jsxs("div", { className: "mt-1.5 flex min-h-[26px] items-center justify-between gap-2", style: { transform: 'translateY(1px)' }, children: [_jsxs("div", { className: "flex min-w-0 items-center gap-1.5", children: [data.featureId ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "data-testid": "feature-node-id", className: "nodrag text-muted-foreground/60 hover:text-muted-foreground flex shrink-0 cursor-pointer items-baseline gap-1 font-mono text-[10px] transition-colors active:scale-95", onClick: (e) => {
99
113
  e.stopPropagation();
100
114
  navigator.clipboard.writeText(data.featureId);
101
115
  setIdCopied(true);
102
116
  setTimeout(() => setIdCopied(false), 1500);
103
- }, children: [_jsx("span", { className: "text-muted-foreground/50 font-sans text-[10px]", children: "ID" }), idCopied ? (_jsx("span", { className: "text-emerald-500", children: "Copied!" })) : (data.featureId.slice(0, 6))] }) }), _jsxs(TooltipContent, { side: "top", children: ["Click to copy: ", data.featureId] })] }) })) : null, data.deployment ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": data.deployment.status === DeploymentState.Booting
104
- ? 'Deploying'
105
- : 'Open dev server', "data-testid": "feature-node-deployment-indicator", onClick: (e) => {
106
- e.stopPropagation();
107
- if (data.deployment?.status === DeploymentState.Ready &&
108
- data.deployment.url) {
109
- window.open(data.deployment.url, '_blank', 'noopener,noreferrer');
110
- }
111
- }, className: cn('nodrag', data.deployment.status === DeploymentState.Ready && data.deployment.url
112
- ? 'cursor-pointer opacity-80 transition-opacity hover:opacity-100'
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
- ? '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.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",
117
+ }, children: idCopied ? (_jsx("span", { className: "text-emerald-500", children: "Copied!" })) : (data.featureId.slice(0, 6)) }) }), _jsxs(TooltipContent, { side: "top", children: ["Click to copy: ", data.featureId] })] }) })) : null, (data.worktreePath ?? data.repositoryPath) ? (_jsx(FeatureSessionsDropdown, { repositoryPath: data.worktreePath ?? data.repositoryPath })) : null, deployTarget && data.state !== 'deleting' && data.state !== 'creating' ? (_jsxs(_Fragment, { children: [_jsx("span", { className: "bg-border h-3 w-px shrink-0" }), isDeployReady ? (
118
+ /* Ready: Globe + URL — Globe morphs to Stop on hover */
119
+ _jsxs("span", { className: "group/deploy nodrag flex min-w-0 items-center gap-1.5", "data-testid": "feature-node-deploy-button", onClick: (e) => e.stopPropagation(), children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Stop Dev Server", className: "flex h-5 shrink-0 cursor-pointer items-center justify-center rounded-full transition-colors", onClick: (e) => {
120
+ e.stopPropagation();
121
+ deployAction.stop();
122
+ }, children: deployAction.stopLoading ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin text-red-500" })) : (_jsxs("span", { className: "relative h-3.5 w-3.5", children: [_jsx(Globe, { className: "absolute inset-0 h-3.5 w-3.5 text-green-600 transition-opacity duration-200 group-hover/deploy:opacity-0 dark:text-green-400" }), _jsx(Square, { className: "absolute inset-0 h-3.5 w-3.5 text-red-500 opacity-0 transition-opacity duration-200 group-hover/deploy:opacity-100 dark:text-red-400" })] })) }) }), _jsx(TooltipContent, { side: "top", children: "Stop Dev Server" })] }) }), deployAction.url ? (_jsx("a", { href: deployAction.url, target: "_blank", rel: "noopener noreferrer", "data-testid": "feature-node-deployment-indicator", className: "nodrag min-w-0 truncate text-[10px] text-green-700 hover:underline dark:text-green-400", onClick: (e) => e.stopPropagation(), children: deployAction.url })) : null] })) : isDeployActive ? (
123
+ /* Booting: Stop button + "Starting…" */
124
+ _jsxs("span", { className: "nodrag flex min-w-0 items-center gap-1.5", "data-testid": "feature-node-deploy-button", onClick: (e) => e.stopPropagation(), children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("button", { type: "button", "aria-label": "Stop Dev Server", className: "flex h-5 shrink-0 cursor-pointer items-center justify-center rounded-full text-red-500 transition-colors hover:text-red-600 dark:text-red-400 dark:hover:text-red-300", onClick: (e) => {
125
+ e.stopPropagation();
126
+ deployAction.stop();
127
+ }, children: deployAction.stopLoading ? (_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" })) : (_jsx(Square, { className: "h-3.5 w-3.5" })) }) }), _jsx(TooltipContent, { side: "top", children: "Stop Dev Server" })] }) }), _jsx("span", { className: "text-muted-foreground animate-pulse text-[10px]", children: "Starting\u2026" })] })) : (
128
+ /* Idle / Error: Play or Retry button */
129
+ _jsxs(_Fragment, { children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: cn('nodrag flex shrink-0 items-center', !deployAction.deployError &&
130
+ '[&_button]:text-green-600 [&_button]:hover:text-green-700 dark:[&_button]:text-green-400 dark:[&_button]:hover:text-green-300'), "data-testid": "feature-node-deploy-button", onClick: (e) => e.stopPropagation(), children: _jsx(ActionButton, { label: deployAction.deployError ? 'Retry' : 'Start Dev Server', onClick: deployAction.deploy, loading: deployAction.deployLoading, error: false, icon: deployAction.deployError ? RotateCcw : Play, iconOnly: true, variant: "ghost", size: "icon-xs" }) }) }), _jsx(TooltipContent, { side: "top", children: deployAction.deployError ? 'Retry Dev Server' : 'Start Dev Server' })] }) }), deployAction.deployError ? (_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx("span", { className: "min-w-0 truncate text-[10px] text-red-500", children: "Failed" }) }), _jsx(TooltipContent, { side: "top", className: "max-w-64", children: _jsx("p", { className: "text-xs", children: deployAction.deployError }) })] }) })) : null] }))] })) : 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
131
  // eslint-disable-next-line @typescript-eslint/no-empty-function -- click bubbles to card's onNodeClick
117
132
  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
133
  e.stopPropagation();
@@ -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;AAaF,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"}
@@ -234,6 +234,7 @@ const allLifecycles = [
234
234
  'research',
235
235
  'implementation',
236
236
  'review',
237
+ 'awaitingUpstream',
237
238
  'deploy',
238
239
  'maintain',
239
240
  ];
@@ -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,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"}
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,2CAiK9B"}
@@ -128,9 +128,7 @@ export function FeatureSessionsDropdown({ repositoryPath, className, includeWork
128
128
  }, [doFetch]);
129
129
  const visibleSessions = expanded ? sessions : sessions.slice(0, PREVIEW_COUNT);
130
130
  const hasMore = sessions.length > PREVIEW_COUNT;
131
- return (_jsxs(DropdownMenu, { modal: false, onOpenChange: handleOpenChange, children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs("button", { type: "button", "aria-label": "View sessions", "data-testid": "feature-node-sessions-button", className: cn('nodrag relative flex h-5 cursor-pointer items-center gap-0.5 rounded px-0.5 text-[10px] transition-colors', hasActiveSessions
132
- ? 'text-emerald-600 hover:bg-emerald-50 hover:text-emerald-700'
133
- : 'text-muted-foreground hover:text-foreground hover:bg-muted', className), onClick: stopNodeEvent, onPointerDown: stopNodeEvent, children: [_jsx(History, { className: "h-3 w-3 shrink-0" }), sessions.length > 0 ? (_jsx("span", { "data-testid": "feature-node-sessions-count", children: sessions.length })) : null, hasActiveSessions ? (_jsx("span", { className: "absolute -top-0.5 -right-0.5 h-1.5 w-1.5 rounded-full bg-emerald-500" })) : null] }) }) }), _jsx(TooltipContent, { side: "top", children: hasActiveSessions ? 'Sessions (active)' : 'Sessions' })] }) }), _jsxs(DropdownMenuContent, { align: "start", side: "bottom", className: "w-80", onClick: stopNodeEvent, onPointerDown: stopNodeEvent, children: [_jsxs(DropdownMenuLabel, { className: "flex items-center gap-1.5 text-xs", children: [_jsx(History, { className: "h-3 w-3" }), "Agent Sessions"] }), _jsx(DropdownMenuSeparator, {}), loading ? (_jsxs("div", { className: "text-muted-foreground flex items-center justify-center gap-2 py-4 text-xs", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }), "Loading..."] })) : sessions.length === 0 ? (_jsx("div", { className: "text-muted-foreground py-4 text-center text-xs", children: "No sessions found" })) : (_jsxs(_Fragment, { children: [visibleSessions.map((session) => (_jsx(SessionRow, { session: session, repositoryPath: repositoryPath, onCreateFromSession: onCreateFromSession }, session.id))), hasMore ? (_jsxs(DropdownMenuItem, { className: "text-muted-foreground justify-center gap-1 py-1.5 text-[10px]", onClick: (e) => {
131
+ return (_jsxs(DropdownMenu, { modal: false, onOpenChange: handleOpenChange, children: [_jsx(TooltipProvider, { children: _jsxs(Tooltip, { children: [_jsx(TooltipTrigger, { asChild: true, children: _jsx(DropdownMenuTrigger, { asChild: true, children: _jsxs("button", { type: "button", "aria-label": "View sessions", "data-testid": "feature-node-sessions-button", className: cn('nodrag relative flex h-5 cursor-pointer items-center gap-0.5 rounded px-0.5 text-[10px] transition-colors', 'text-muted-foreground hover:text-foreground hover:bg-muted', className), onClick: stopNodeEvent, onPointerDown: stopNodeEvent, children: [_jsx(History, { className: "h-3 w-3 shrink-0" }), sessions.length > 0 ? (_jsx("span", { "data-testid": "feature-node-sessions-count", children: sessions.length })) : null, hasActiveSessions ? (_jsx("span", { className: "absolute -top-0.5 -right-0.5 h-1.5 w-1.5 rounded-full bg-emerald-500" })) : null] }) }) }), _jsx(TooltipContent, { side: "top", children: hasActiveSessions ? 'Sessions (active)' : 'Sessions' })] }) }), _jsxs(DropdownMenuContent, { align: "start", side: "bottom", className: "w-80", onClick: stopNodeEvent, onPointerDown: stopNodeEvent, children: [_jsxs(DropdownMenuLabel, { className: "flex items-center gap-1.5 text-xs", children: [_jsx(History, { className: "h-3 w-3" }), "Agent Sessions"] }), _jsx(DropdownMenuSeparator, {}), loading ? (_jsxs("div", { className: "text-muted-foreground flex items-center justify-center gap-2 py-4 text-xs", children: [_jsx(Loader2, { className: "h-3.5 w-3.5 animate-spin" }), "Loading..."] })) : sessions.length === 0 ? (_jsx("div", { className: "text-muted-foreground py-4 text-center text-xs", children: "No sessions found" })) : (_jsxs(_Fragment, { children: [visibleSessions.map((session) => (_jsx(SessionRow, { session: session, repositoryPath: repositoryPath, onCreateFromSession: onCreateFromSession }, session.id))), hasMore ? (_jsxs(DropdownMenuItem, { className: "text-muted-foreground justify-center gap-1 py-1.5 text-[10px]", onClick: (e) => {
134
132
  e.preventDefault();
135
133
  setExpanded((v) => !v);
136
134
  }, children: [_jsx(ChevronDown, { className: cn('h-3 w-3 transition-transform', expanded && 'rotate-180') }), expanded ? 'Show less' : `Show ${sessions.length - PREVIEW_COUNT} more`] })) : null] }))] })] }));
@@ -65,8 +65,9 @@ async function main() {
65
65
  getNotificationWatcher().start();
66
66
  // Start PR sync watcher to detect PR/CI status transitions on GitHub
67
67
  const gitPrService = container.resolve('IGitPrService');
68
+ const gitForkService = container.resolve('IGitForkService');
68
69
  const db = getExistingConnection();
69
- initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db);
70
+ initializePrSyncWatcher(featureRepo, runRepo, gitPrService, notificationService, undefined, db, gitForkService);
70
71
  getPrSyncWatcher().start();
71
72
  }
72
73
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"derive-graph.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/derive-graph.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,eAAe,CAAC;IACtB,sGAAsG;IACtG,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wDAAwD;AACxD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,4FAA4F;IAC5F,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,qEAAqE;IACrE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,8CAA8C;IAC9C,eAAe,CAAC,EAAE,CAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,EACjB,aAAa,CAAC,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,OAAO,KACd,IAAI,CAAC;IACV,6EAA6E;IAC7E,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,qDAAqD;IACrD,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,qDAAqD;IACrD,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,oDAAoD;IACpD,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACrC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACrC,SAAS,CAAC,EAAE,cAAc,GACzB;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CA4K5C"}
1
+ {"version":3,"file":"derive-graph.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/lib/derive-graph.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,eAAe,CAAC;IACtB,sGAAsG;IACtG,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wDAAwD;AACxD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,gFAAgF;AAChF,MAAM,WAAW,cAAc;IAC7B,4FAA4F;IAC5F,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,qEAAqE;IACrE,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,8CAA8C;IAC9C,eAAe,CAAC,EAAE,CAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,OAAO,EACjB,aAAa,CAAC,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,OAAO,KACd,IAAI,CAAC;IACV,6EAA6E;IAC7E,eAAe,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,8EAA8E;IAC9E,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IACjD,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,qDAAqD;IACrD,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,qDAAqD;IACrD,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,oDAAoD;IACpD,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,+CAA+C;IAC/C,gBAAgB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/C,iDAAiD;IACjD,kBAAkB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CAClD;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACrC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACrC,SAAS,CAAC,EAAE,cAAc,GACzB;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAiL5C"}
@@ -134,7 +134,10 @@ export function deriveGraph(featureMap, repoMap, pendingMap, callbacks) {
134
134
  data,
135
135
  });
136
136
  // Edge derivation
137
- if (entry.parentNodeId) {
137
+ // If parentNodeId references a feature that's not visible (e.g. archived/filtered),
138
+ // fall through to repo→feature edge so the child reconnects to the repository.
139
+ if (entry.parentNodeId &&
140
+ (featureMap.has(entry.parentNodeId) || pendingMap.has(entry.parentNodeId))) {
138
141
  // Dependency edge (parent→child feature)
139
142
  edges.push({
140
143
  id: `dep-${entry.parentNodeId}-${nodeId}`,