@shepai/cli 1.65.1 → 1.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (326) hide show
  1. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts +1 -1
  2. package/dist/packages/core/src/application/ports/output/repositories/repository-repository.interface.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/ports/output/services/deployment-service.interface.d.ts +62 -0
  4. package/dist/packages/core/src/application/ports/output/services/deployment-service.interface.d.ts.map +1 -0
  5. package/dist/packages/core/src/application/ports/output/services/deployment-service.interface.js +12 -0
  6. package/dist/packages/core/src/application/ports/output/services/index.d.ts +1 -0
  7. package/dist/packages/core/src/application/ports/output/services/index.d.ts.map +1 -1
  8. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  9. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +4 -1
  10. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/di/container.js +3 -0
  12. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +25 -0
  14. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +1 -1
  15. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -1
  16. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +5 -2
  17. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +6 -2
  19. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +11 -7
  21. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.js +11 -7
  23. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.js +11 -7
  25. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts +57 -0
  26. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -0
  27. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +192 -0
  28. package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.d.ts +26 -0
  29. package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.d.ts.map +1 -0
  30. package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.js +59 -0
  31. package/dist/packages/core/src/infrastructure/services/deployment/parse-port.d.ts +15 -0
  32. package/dist/packages/core/src/infrastructure/services/deployment/parse-port.d.ts.map +1 -0
  33. package/dist/packages/core/src/infrastructure/services/deployment/parse-port.js +52 -0
  34. package/dist/src/presentation/cli/commands/_serve.command.d.ts.map +1 -1
  35. package/dist/src/presentation/cli/commands/_serve.command.js +2 -0
  36. package/dist/src/presentation/web/app/actions/deploy-feature.d.ts +7 -0
  37. package/dist/src/presentation/web/app/actions/deploy-feature.d.ts.map +1 -0
  38. package/dist/src/presentation/web/app/actions/deploy-feature.js +28 -0
  39. package/dist/src/presentation/web/app/actions/deploy-repository.d.ts +7 -0
  40. package/dist/src/presentation/web/app/actions/deploy-repository.d.ts.map +1 -0
  41. package/dist/src/presentation/web/app/actions/deploy-repository.js +21 -0
  42. package/dist/src/presentation/web/app/actions/get-deployment-status.d.ts +3 -0
  43. package/dist/src/presentation/web/app/actions/get-deployment-status.d.ts.map +1 -0
  44. package/dist/src/presentation/web/app/actions/get-deployment-status.js +9 -0
  45. package/dist/src/presentation/web/app/actions/stop-deployment.d.ts +5 -0
  46. package/dist/src/presentation/web/app/actions/stop-deployment.d.ts.map +1 -0
  47. package/dist/src/presentation/web/app/actions/stop-deployment.js +16 -0
  48. package/dist/src/presentation/web/app/build-graph-nodes.d.ts +20 -0
  49. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -0
  50. package/dist/src/presentation/web/app/build-graph-nodes.js +142 -0
  51. package/dist/src/presentation/web/app/page.d.ts.map +1 -1
  52. package/dist/src/presentation/web/app/page.js +2 -112
  53. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts +3 -1
  54. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts.map +1 -1
  55. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +13 -3
  56. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts +2 -0
  57. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts.map +1 -1
  58. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.js +9 -0
  59. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.d.ts +7 -0
  60. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.d.ts.map +1 -0
  61. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.js +14 -0
  62. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.d.ts +14 -0
  63. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.d.ts.map +1 -0
  64. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.js +27 -0
  65. package/dist/src/presentation/web/components/common/deployment-status-badge/index.d.ts +2 -0
  66. package/dist/src/presentation/web/components/common/deployment-status-badge/index.d.ts.map +1 -0
  67. package/dist/src/presentation/web/components/common/deployment-status-badge/index.js +1 -0
  68. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  69. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +8 -1
  70. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
  71. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +7 -1
  72. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  73. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +13 -2
  74. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +1 -1
  75. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +12 -2
  76. package/dist/src/presentation/web/hooks/use-deploy-action.d.ts +18 -0
  77. package/dist/src/presentation/web/hooks/use-deploy-action.d.ts.map +1 -0
  78. package/dist/src/presentation/web/hooks/use-deploy-action.js +130 -0
  79. package/dist/src/presentation/web/lib/feature-flags.d.ts +1 -0
  80. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  81. package/dist/src/presentation/web/lib/feature-flags.js +1 -0
  82. package/dist/tsconfig.build.tsbuildinfo +1 -1
  83. package/package.json +1 -1
  84. package/web/.next/BUILD_ID +1 -1
  85. package/web/.next/build-manifest.json +7 -6
  86. package/web/.next/cache/.previewinfo +1 -1
  87. package/web/.next/cache/.rscinfo +1 -1
  88. package/web/.next/cache/.tsbuildinfo +1 -1
  89. package/web/.next/cache/config.json +3 -3
  90. package/web/.next/fallback-build-manifest.json +2 -2
  91. package/web/.next/prerender-manifest.json +3 -3
  92. package/web/.next/required-server-files.js +1 -1
  93. package/web/.next/required-server-files.json +1 -1
  94. package/web/.next/server/app/_global-error/page/build-manifest.json +5 -4
  95. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  96. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  97. package/web/.next/server/app/_global-error.html +2 -2
  98. package/web/.next/server/app/_global-error.rsc +1 -1
  99. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  100. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  101. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  102. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  103. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  104. package/web/.next/server/app/_not-found/page/build-manifest.json +5 -4
  105. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  106. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  107. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  108. package/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
  109. package/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
  110. package/web/.next/server/app/page/build-manifest.json +5 -4
  111. package/web/.next/server/app/page/server-reference-manifest.json +88 -28
  112. package/web/.next/server/app/page.js +2 -2
  113. package/web/.next/server/app/page.js.nft.json +1 -1
  114. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  115. package/web/.next/server/app/skills/page/build-manifest.json +5 -4
  116. package/web/.next/server/app/skills/page/server-reference-manifest.json +62 -2
  117. package/web/.next/server/app/skills/page.js +2 -2
  118. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  119. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/app/tools/page/build-manifest.json +5 -4
  121. package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  122. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  123. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  124. package/web/.next/server/app/version/page/build-manifest.json +5 -4
  125. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  126. package/web/.next/server/app/version/page.js +1 -1
  127. package/web/.next/server/app/version/page.js.nft.json +1 -1
  128. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  129. package/web/.next/server/chunks/{[root-of-the-server]__e926de65._.js → [root-of-the-server]__09413611._.js} +2 -2
  130. package/web/.next/server/chunks/{[root-of-the-server]__e926de65._.js.map → [root-of-the-server]__09413611._.js.map} +1 -1
  131. package/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js +3 -0
  132. package/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js.map +1 -0
  133. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  134. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js → [root-of-the-server]__248ee887._.js} +2 -2
  136. package/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js.map → [root-of-the-server]__248ee887._.js.map} +1 -1
  137. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__fbc89707._.js → server/chunks/ssr/[root-of-the-server]__249c74f6._.js} +2 -2
  138. package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +4 -0
  139. package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js.map +1 -0
  140. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  141. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  142. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js +3 -0
  143. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js.map +1 -0
  144. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  145. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js +3 -0
  149. package/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js.map +1 -0
  150. package/web/.next/{standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__dd5b62cb._.js → server/chunks/ssr/[root-of-the-server]__f5830fa9._.js} +2 -2
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__f5830fa9._.js.map +1 -0
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js +9 -0
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js.map +1 -0
  154. package/web/.next/server/chunks/ssr/_28993370._.js +3 -0
  155. package/web/.next/server/chunks/ssr/_28993370._.js.map +1 -0
  156. package/web/.next/server/chunks/ssr/_380c6567._.js +1 -1
  157. package/web/.next/server/chunks/ssr/_380c6567._.js.map +1 -1
  158. package/web/.next/server/chunks/ssr/_45715073._.js +3 -0
  159. package/web/.next/server/chunks/ssr/{_d81184e2._.js.map → _45715073._.js.map} +1 -1
  160. package/web/.next/server/chunks/ssr/_6978d868._.js +3 -0
  161. package/web/.next/server/chunks/ssr/_6978d868._.js.map +1 -0
  162. package/web/.next/server/chunks/ssr/_85965278._.js +6 -0
  163. package/web/.next/server/chunks/ssr/_85965278._.js.map +1 -0
  164. package/web/.next/server/chunks/ssr/_c52cace8._.js +3 -0
  165. package/web/.next/server/chunks/ssr/_c52cace8._.js.map +1 -0
  166. package/web/.next/server/chunks/ssr/_ed9132c9._.js +3 -0
  167. package/web/.next/server/chunks/ssr/_ed9132c9._.js.map +1 -0
  168. package/web/.next/server/chunks/ssr/{node_modules__pnpm_87f920e7._.js → node_modules__pnpm_febcbea6._.js} +2 -2
  169. package/web/.next/server/chunks/ssr/node_modules__pnpm_febcbea6._.js.map +1 -0
  170. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  171. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  172. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  173. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  174. package/web/.next/server/middleware-build-manifest.js +5 -4
  175. package/web/.next/server/pages/500.html +2 -2
  176. package/web/.next/server/server-reference-manifest.js +1 -1
  177. package/web/.next/server/server-reference-manifest.json +118 -30
  178. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  179. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +7 -6
  180. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  181. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  182. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +5 -4
  183. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  184. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  185. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  186. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  187. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  188. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  189. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  190. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  191. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  192. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +5 -4
  193. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  194. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  195. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  196. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
  197. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
  198. package/web/.next/standalone/src/presentation/web/.next/server/app/page/build-manifest.json +5 -4
  199. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +88 -28
  200. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +2 -2
  201. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  202. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  203. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/build-manifest.json +5 -4
  204. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +62 -2
  205. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js +2 -2
  206. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  207. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  208. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/build-manifest.json +5 -4
  209. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  210. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  211. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  212. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +5 -4
  213. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  214. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js +1 -1
  215. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  216. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  217. package/web/.next/standalone/src/presentation/web/.next/server/chunks/{[root-of-the-server]__e926de65._.js → [root-of-the-server]__09413611._.js} +2 -2
  218. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js +3 -0
  219. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  220. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js → [root-of-the-server]__248ee887._.js} +2 -2
  221. package/web/.next/{server/chunks/ssr/[root-of-the-server]__fbc89707._.js → standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__249c74f6._.js} +2 -2
  222. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +4 -0
  223. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  224. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js +3 -0
  225. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  226. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  227. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js +3 -0
  228. package/web/.next/{server/chunks/ssr/[root-of-the-server]__dd5b62cb._.js → standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f5830fa9._.js} +2 -2
  229. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js +9 -0
  230. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_28993370._.js +3 -0
  231. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_380c6567._.js +1 -1
  232. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_45715073._.js +3 -0
  233. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_6978d868._.js +3 -0
  234. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_85965278._.js +6 -0
  235. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_c52cace8._.js +3 -0
  236. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_ed9132c9._.js +3 -0
  237. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{node_modules__pnpm_87f920e7._.js → node_modules__pnpm_febcbea6._.js} +2 -2
  238. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  239. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  240. package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +5 -4
  241. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  242. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  243. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +118 -30
  244. package/web/.next/standalone/src/presentation/web/app/actions/deploy-feature.ts +39 -0
  245. package/web/.next/standalone/src/presentation/web/app/actions/deploy-repository.ts +28 -0
  246. package/web/.next/standalone/src/presentation/web/app/actions/get-deployment-status.ts +16 -0
  247. package/web/.next/standalone/src/presentation/web/app/actions/stop-deployment.ts +22 -0
  248. package/web/.next/standalone/src/presentation/web/app/build-graph-nodes.ts +180 -0
  249. package/web/.next/standalone/src/presentation/web/app/page.tsx +2 -129
  250. package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.stories.tsx +26 -0
  251. package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.tsx +45 -1
  252. package/web/.next/standalone/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.tsx +35 -0
  253. package/web/.next/standalone/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.tsx +42 -0
  254. package/web/.next/standalone/src/presentation/web/components/common/deployment-status-badge/index.ts +1 -0
  255. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +10 -0
  256. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-drawer.tsx +9 -0
  257. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.tsx +43 -2
  258. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +79 -44
  259. package/web/.next/standalone/src/presentation/web/hooks/use-deploy-action.ts +161 -0
  260. package/web/.next/standalone/src/presentation/web/lib/feature-flags.ts +1 -0
  261. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  262. package/web/.next/static/chunks/0b99eb9664d47ca7.js +1 -0
  263. package/web/.next/static/chunks/177f1dcbe83c136a.js +1 -0
  264. package/web/.next/static/chunks/41a2adc09edfffaf.js +1 -0
  265. package/web/.next/static/chunks/5054c72b1c8f5912.js +1 -0
  266. package/web/.next/static/chunks/71d2618e41d7da6d.js +1 -0
  267. package/web/.next/static/chunks/7ad36bef63f15bc6.js +1 -0
  268. package/web/.next/static/chunks/{3b941e59ac013e12.js → 87421ab1062a39b7.js} +2 -2
  269. package/web/.next/static/chunks/{21541b346dd4dd28.js → 8c60d1bd87239066.js} +1 -1
  270. package/web/.next/static/chunks/96f49affaceab206.css +2 -0
  271. package/web/.next/static/chunks/a6d1d774260fc927.js +2 -0
  272. package/web/.next/static/chunks/c7e793951b20a67f.js +1 -0
  273. package/web/.next/static/chunks/f54ff9c15fb7b383.js +1 -0
  274. package/web/.next/static/chunks/f5fb2f182ae9b015.js +1 -0
  275. package/web/.next/static/chunks/{15f4f62844c3ea0e.js → f6766e799a69fb5d.js} +7 -7
  276. package/web/.next/static/chunks/turbopack-b6b5b4f015327a9a.js +4 -0
  277. package/web/.next/trace +1 -1
  278. package/web/.next/trace-build +1 -1
  279. package/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js +0 -3
  280. package/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js.map +0 -1
  281. package/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js +0 -3
  282. package/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js.map +0 -1
  283. package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +0 -9
  284. package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js.map +0 -1
  285. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +0 -4
  286. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js.map +0 -1
  287. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd5b62cb._.js.map +0 -1
  288. package/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js +0 -3
  289. package/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js.map +0 -1
  290. package/web/.next/server/chunks/ssr/_73d14b70._.js +0 -3
  291. package/web/.next/server/chunks/ssr/_73d14b70._.js.map +0 -1
  292. package/web/.next/server/chunks/ssr/_7f386377._.js +0 -3
  293. package/web/.next/server/chunks/ssr/_7f386377._.js.map +0 -1
  294. package/web/.next/server/chunks/ssr/_d3711354._.js +0 -6
  295. package/web/.next/server/chunks/ssr/_d3711354._.js.map +0 -1
  296. package/web/.next/server/chunks/ssr/_d81184e2._.js +0 -3
  297. package/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js +0 -3
  298. package/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js.map +0 -1
  299. package/web/.next/server/chunks/ssr/node_modules__pnpm_87f920e7._.js.map +0 -1
  300. package/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js +0 -3
  301. package/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js.map +0 -1
  302. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js +0 -3
  303. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js +0 -3
  304. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +0 -9
  305. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +0 -4
  306. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js +0 -3
  307. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_73d14b70._.js +0 -3
  308. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_7f386377._.js +0 -3
  309. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_d3711354._.js +0 -6
  310. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_d81184e2._.js +0 -3
  311. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js +0 -3
  312. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js +0 -3
  313. package/web/.next/static/chunks/0c6654ec27f11c7e.js +0 -1
  314. package/web/.next/static/chunks/12c70bfd5951cf9b.js +0 -1
  315. package/web/.next/static/chunks/1887af4ad3781531.js +0 -2
  316. package/web/.next/static/chunks/78919481e7c5ad4f.js +0 -1
  317. package/web/.next/static/chunks/a5b6a22de303e877.css +0 -2
  318. package/web/.next/static/chunks/aa33d2874dacee4a.js +0 -1
  319. package/web/.next/static/chunks/acdb8af5a21f1ae9.js +0 -1
  320. package/web/.next/static/chunks/af7a5bcb7c49e46e.js +0 -1
  321. package/web/.next/static/chunks/be784143669bb992.js +0 -1
  322. package/web/.next/static/chunks/turbopack-eb24b869babb34b4.js +0 -4
  323. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__fbc89707._.js.map → [root-of-the-server]__249c74f6._.js.map} +0 -0
  324. /package/web/.next/static/{7tTtII__gsa2CGwarYgOr → 5RMUwLfTnzL0pvJOwfuxg}/_buildManifest.js +0 -0
  325. /package/web/.next/static/{7tTtII__gsa2CGwarYgOr → 5RMUwLfTnzL0pvJOwfuxg}/_clientMiddlewareManifest.json +0 -0
  326. /package/web/.next/static/{7tTtII__gsa2CGwarYgOr → 5RMUwLfTnzL0pvJOwfuxg}/_ssgManifest.js +0 -0
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Detect Dev Script
3
+ *
4
+ * Pure utility that reads package.json from a directory, scans for common dev
5
+ * scripts (dev, start, serve), and detects the package manager from lockfile
6
+ * presence. Returns the detected command or an error.
7
+ */
8
+ export interface DetectDevScriptSuccess {
9
+ success: true;
10
+ packageManager: string;
11
+ scriptName: string;
12
+ command: string;
13
+ }
14
+ export interface DetectDevScriptError {
15
+ success: false;
16
+ error: string;
17
+ }
18
+ export type DetectDevScriptResult = DetectDevScriptSuccess | DetectDevScriptError;
19
+ /**
20
+ * Detect the dev script and package manager for a project directory.
21
+ *
22
+ * @param dirPath - Absolute path to the project directory
23
+ * @returns Detection result with command info, or an error
24
+ */
25
+ export declare function detectDevScript(dirPath: string): DetectDevScriptResult;
26
+ //# sourceMappingURL=detect-dev-script.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-dev-script.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/deployment/detect-dev-script.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAeH,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,IAAI,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,KAAK,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,MAAM,qBAAqB,GAAG,sBAAsB,GAAG,oBAAoB,CAAC;AAElF;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CA4BtE"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Detect Dev Script
3
+ *
4
+ * Pure utility that reads package.json from a directory, scans for common dev
5
+ * scripts (dev, start, serve), and detects the package manager from lockfile
6
+ * presence. Returns the detected command or an error.
7
+ */
8
+ import { readFileSync, existsSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ /** Script names to search for, in priority order */
11
+ const SCRIPT_PRIORITY = ['dev', 'start', 'serve'];
12
+ /** Lockfile-to-package-manager mapping, checked in order */
13
+ const LOCKFILE_MANAGERS = [
14
+ { lockfile: 'pnpm-lock.yaml', manager: 'pnpm' },
15
+ { lockfile: 'yarn.lock', manager: 'yarn' },
16
+ { lockfile: 'package-lock.json', manager: 'npm' },
17
+ ];
18
+ /**
19
+ * Detect the dev script and package manager for a project directory.
20
+ *
21
+ * @param dirPath - Absolute path to the project directory
22
+ * @returns Detection result with command info, or an error
23
+ */
24
+ export function detectDevScript(dirPath) {
25
+ // Read and parse package.json
26
+ let packageJson;
27
+ try {
28
+ const raw = readFileSync(join(dirPath, 'package.json'), 'utf-8');
29
+ packageJson = JSON.parse(raw);
30
+ }
31
+ catch {
32
+ return { success: false, error: `No package.json found in ${dirPath}` };
33
+ }
34
+ // Find the first matching script in priority order
35
+ const scripts = packageJson.scripts ?? {};
36
+ const scriptName = SCRIPT_PRIORITY.find((name) => name in scripts);
37
+ if (!scriptName) {
38
+ return {
39
+ success: false,
40
+ error: `No dev script found in package.json. Expected one of: ${SCRIPT_PRIORITY.join(', ')}`,
41
+ };
42
+ }
43
+ // Detect package manager from lockfile
44
+ const packageManager = detectPackageManager(dirPath);
45
+ // Build the command — pnpm/yarn use `<pm> <script>`, npm uses `npm run <script>`
46
+ const command = packageManager === 'npm' ? `npm run ${scriptName}` : `${packageManager} ${scriptName}`;
47
+ return { success: true, packageManager, scriptName, command };
48
+ }
49
+ /**
50
+ * Detect the package manager by checking for lockfile presence.
51
+ */
52
+ function detectPackageManager(dirPath) {
53
+ for (const { lockfile, manager } of LOCKFILE_MANAGERS) {
54
+ if (existsSync(join(dirPath, lockfile))) {
55
+ return manager;
56
+ }
57
+ }
58
+ return 'npm';
59
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Parse Port
3
+ *
4
+ * Pure utility that extracts a localhost URL or port number from a line of
5
+ * dev server stdout/stderr output. Handles common patterns from Next.js,
6
+ * Vite, Express, and generic servers.
7
+ */
8
+ /**
9
+ * Parse a line of stdout/stderr output for a localhost URL or port.
10
+ *
11
+ * @param line - A single line of process output
12
+ * @returns The detected URL string, or null if no URL/port was found
13
+ */
14
+ export declare function parsePort(line: string): string | null;
15
+ //# sourceMappingURL=parse-port.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-port.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/deployment/parse-port.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkCH;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAarD"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Parse Port
3
+ *
4
+ * Pure utility that extracts a localhost URL or port number from a line of
5
+ * dev server stdout/stderr output. Handles common patterns from Next.js,
6
+ * Vite, Express, and generic servers.
7
+ */
8
+ /** Named patterns for port/URL detection, checked in order */
9
+ const PORT_PATTERNS = [
10
+ {
11
+ name: 'local-url',
12
+ // Matches "Local: http://localhost:3000" or "- Local: http://localhost:5173/"
13
+ regex: /Local:\s+(https?:\/\/(?:localhost|127\.0\.0\.1):\d+\S*)/,
14
+ extract: (m) => m[1],
15
+ },
16
+ {
17
+ name: 'next-ready',
18
+ // Matches "ready - started server on 0.0.0.0:3000, url: http://localhost:3000"
19
+ regex: /url:\s+(https?:\/\/(?:localhost|127\.0\.0\.1):\d+\S*)/,
20
+ extract: (m) => m[1],
21
+ },
22
+ {
23
+ name: 'listening-port',
24
+ // Matches "listening on port 3000", "started on port 9000", etc.
25
+ regex: /(?:listening|started)\s+on\s+port\s+(\d+)/i,
26
+ extract: (m) => `http://localhost:${m[1]}`,
27
+ },
28
+ {
29
+ name: 'generic-localhost',
30
+ // Matches any "http://localhost:PORT" or "https://localhost:PORT" in the line
31
+ regex: /(https?:\/\/(?:localhost|127\.0\.0\.1):\d+\S*)/,
32
+ extract: (m) => m[1],
33
+ },
34
+ ];
35
+ /**
36
+ * Parse a line of stdout/stderr output for a localhost URL or port.
37
+ *
38
+ * @param line - A single line of process output
39
+ * @returns The detected URL string, or null if no URL/port was found
40
+ */
41
+ export function parsePort(line) {
42
+ if (!line?.trim()) {
43
+ return null;
44
+ }
45
+ for (const { regex, extract } of PORT_PATTERNS) {
46
+ const match = line.match(regex);
47
+ if (match) {
48
+ return extract(match);
49
+ }
50
+ }
51
+ return null;
52
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"_serve.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/_serve.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAuB1D;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAwD5C"}
1
+ {"version":3,"file":"_serve.command.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/cli/commands/_serve.command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAwB1D;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CA0D5C"}
@@ -72,6 +72,8 @@ export function createServeCommand() {
72
72
  const forceExit = setTimeout(() => process.exit(0), 5000);
73
73
  forceExit.unref();
74
74
  getNotificationWatcher().stop();
75
+ const deploymentService = container.resolve('IDeploymentService');
76
+ deploymentService.stopAll();
75
77
  await service.stop();
76
78
  process.exit(0);
77
79
  };
@@ -0,0 +1,7 @@
1
+ import { DeploymentState } from '../../../../../packages/core/src/domain/generated/output.js';
2
+ export declare function deployFeature(featureId: string): Promise<{
3
+ success: boolean;
4
+ error?: string;
5
+ state?: DeploymentState;
6
+ }>;
7
+ //# sourceMappingURL=deploy-feature.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-feature.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/deploy-feature.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC,CA2BxE"}
@@ -0,0 +1,28 @@
1
+ 'use server';
2
+ import { existsSync } from 'node:fs';
3
+ import { resolve } from '../../lib/server-container.js';
4
+ import { computeWorktreePath } from '../../../../../packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js';
5
+ import { DeploymentState } from '../../../../../packages/core/src/domain/generated/output.js';
6
+ export async function deployFeature(featureId) {
7
+ if (!featureId?.trim()) {
8
+ return { success: false, error: 'featureId is required' };
9
+ }
10
+ try {
11
+ const featureRepo = resolve('IFeatureRepository');
12
+ const feature = await featureRepo.findById(featureId);
13
+ if (!feature) {
14
+ return { success: false, error: `Feature not found: ${featureId}` };
15
+ }
16
+ const worktreePath = computeWorktreePath(feature.repositoryPath, feature.branch);
17
+ if (!existsSync(worktreePath)) {
18
+ return { success: false, error: `Worktree path does not exist: ${worktreePath}` };
19
+ }
20
+ const deploymentService = resolve('IDeploymentService');
21
+ deploymentService.start(featureId, worktreePath);
22
+ return { success: true, state: DeploymentState.Booting };
23
+ }
24
+ catch (error) {
25
+ const message = error instanceof Error ? error.message : 'Failed to deploy feature';
26
+ return { success: false, error: message };
27
+ }
28
+ }
@@ -0,0 +1,7 @@
1
+ import { DeploymentState } from '../../../../../packages/core/src/domain/generated/output.js';
2
+ export declare function deployRepository(repositoryPath: string): Promise<{
3
+ success: boolean;
4
+ error?: string;
5
+ state?: DeploymentState;
6
+ }>;
7
+ //# sourceMappingURL=deploy-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-repository.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/deploy-repository.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,eAAe,CAAA;CAAE,CAAC,CAkBxE"}
@@ -0,0 +1,21 @@
1
+ 'use server';
2
+ import { existsSync } from 'node:fs';
3
+ import { resolve } from '../../lib/server-container.js';
4
+ import { DeploymentState } from '../../../../../packages/core/src/domain/generated/output.js';
5
+ export async function deployRepository(repositoryPath) {
6
+ if (!repositoryPath?.startsWith('/')) {
7
+ return { success: false, error: 'repositoryPath must be an absolute path' };
8
+ }
9
+ try {
10
+ if (!existsSync(repositoryPath)) {
11
+ return { success: false, error: `Directory does not exist: ${repositoryPath}` };
12
+ }
13
+ const deploymentService = resolve('IDeploymentService');
14
+ deploymentService.start(repositoryPath, repositoryPath);
15
+ return { success: true, state: DeploymentState.Booting };
16
+ }
17
+ catch (error) {
18
+ const message = error instanceof Error ? error.message : 'Failed to deploy repository';
19
+ return { success: false, error: message };
20
+ }
21
+ }
@@ -0,0 +1,3 @@
1
+ import type { DeploymentStatus } from '../../../../../packages/core/src/application/ports/output/services/deployment-service.interface.js';
2
+ export declare function getDeploymentStatus(targetId: string): Promise<DeploymentStatus | null>;
3
+ //# sourceMappingURL=get-deployment-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-deployment-status.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/get-deployment-status.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,gBAAgB,EACjB,MAAM,6EAA6E,CAAC;AAErF,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAO5F"}
@@ -0,0 +1,9 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function getDeploymentStatus(targetId) {
4
+ if (!targetId?.trim()) {
5
+ return null;
6
+ }
7
+ const deploymentService = resolve('IDeploymentService');
8
+ return deploymentService.getStatus(targetId);
9
+ }
@@ -0,0 +1,5 @@
1
+ export declare function stopDeployment(targetId: string): Promise<{
2
+ success: boolean;
3
+ error?: string;
4
+ }>;
5
+ //# sourceMappingURL=stop-deployment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-deployment.d.ts","sourceRoot":"","sources":["../../../../../../src/presentation/web/app/actions/stop-deployment.ts"],"names":[],"mappings":"AAKA,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAc/C"}
@@ -0,0 +1,16 @@
1
+ 'use server';
2
+ import { resolve } from '../../lib/server-container.js';
3
+ export async function stopDeployment(targetId) {
4
+ if (!targetId?.trim()) {
5
+ return { success: false, error: 'targetId is required' };
6
+ }
7
+ try {
8
+ const deploymentService = resolve('IDeploymentService');
9
+ await deploymentService.stop(targetId);
10
+ return { success: true };
11
+ }
12
+ catch (error) {
13
+ const message = error instanceof Error ? error.message : 'Failed to stop deployment';
14
+ return { success: false, error: message };
15
+ }
16
+ }
@@ -0,0 +1,20 @@
1
+ import type { Feature, Repository, AgentRun } from '../../../../packages/core/src/domain/generated/output.js';
2
+ import type { CanvasNodeType } from '../components/features/features-canvas/index.js';
3
+ import type { Edge } from '@xyflow/react';
4
+ export interface FeatureWithRun {
5
+ feature: Feature;
6
+ run: AgentRun | null;
7
+ }
8
+ /**
9
+ * Builds React Flow nodes and edges from persisted repositories and features.
10
+ *
11
+ * Features whose repositoryPath is not covered by any real repository row are
12
+ * grouped under a synthetic "virtual" repository node
13
+ * (id: `virtual-repo-${repositoryPath}`). This ensures the dashboard never
14
+ * renders empty when features exist but their repository rows are missing.
15
+ */
16
+ export declare function buildGraphNodes(repositories: Repository[], featuresWithRuns: FeatureWithRun[]): {
17
+ nodes: CanvasNodeType[];
18
+ edges: Edge[];
19
+ };
20
+ //# sourceMappingURL=build-graph-nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-graph-nodes.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/build-graph-nodes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,sCAAsC,CAAC;AAK1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAuB1C,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,UAAU,EAAE,EAC1B,gBAAgB,EAAE,cAAc,EAAE,GACjC;IAAE,KAAK,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,IAAI,EAAE,CAAA;CAAE,CAiE5C"}
@@ -0,0 +1,142 @@
1
+ import { deriveNodeState, deriveProgress, } from '../components/common/feature-node/derive-feature-state.js';
2
+ /** Map domain SdlcLifecycle enum values to UI FeatureLifecyclePhase (1:1). */
3
+ const lifecycleMap = {
4
+ Requirements: 'requirements',
5
+ Research: 'research',
6
+ Implementation: 'implementation',
7
+ Review: 'review',
8
+ 'Deploy & QA': 'deploy',
9
+ Maintain: 'maintain',
10
+ };
11
+ /** Map agent graph node names (from agent_run.result) to UI lifecycle phases. */
12
+ const nodeToLifecyclePhase = {
13
+ analyze: 'requirements',
14
+ requirements: 'requirements',
15
+ research: 'research',
16
+ plan: 'implementation',
17
+ implement: 'implementation',
18
+ merge: 'review',
19
+ };
20
+ /**
21
+ * Builds React Flow nodes and edges from persisted repositories and features.
22
+ *
23
+ * Features whose repositoryPath is not covered by any real repository row are
24
+ * grouped under a synthetic "virtual" repository node
25
+ * (id: `virtual-repo-${repositoryPath}`). This ensures the dashboard never
26
+ * renders empty when features exist but their repository rows are missing.
27
+ */
28
+ export function buildGraphNodes(repositories, featuresWithRuns) {
29
+ // Group features by repository path
30
+ const featuresByRepo = {};
31
+ featuresWithRuns.forEach((entry) => {
32
+ const repoKey = entry.feature.repositoryPath;
33
+ if (!featuresByRepo[repoKey]) {
34
+ featuresByRepo[repoKey] = [];
35
+ }
36
+ featuresByRepo[repoKey].push(entry);
37
+ });
38
+ const nodes = [];
39
+ const edges = [];
40
+ // Track which repository paths have been rendered (to avoid orphan duplicates)
41
+ const coveredPaths = new Set();
42
+ // First, add nodes for all persisted repositories (including those without features)
43
+ for (const repo of repositories) {
44
+ coveredPaths.add(repo.path);
45
+ const repoNodeId = `repo-${repo.id}`;
46
+ nodes.push({
47
+ id: repoNodeId,
48
+ type: 'repositoryNode',
49
+ position: { x: 0, y: 0 },
50
+ data: { name: repo.name, repositoryPath: repo.path, id: repo.id },
51
+ });
52
+ const repoFeatures = featuresByRepo[repo.path] ?? [];
53
+ appendFeatureNodes(repoFeatures, repoNodeId, featuresWithRuns, nodes, edges);
54
+ }
55
+ // Second pass: group orphaned features under virtual repository nodes
56
+ for (const [repoPath, orphanFeatures] of Object.entries(featuresByRepo)) {
57
+ if (coveredPaths.has(repoPath))
58
+ continue;
59
+ const virtualRepoNodeId = `virtual-repo-${repoPath}`;
60
+ const repoName = repoPath.split('/').filter(Boolean).at(-1) ?? repoPath;
61
+ nodes.push({
62
+ id: virtualRepoNodeId,
63
+ type: 'repositoryNode',
64
+ position: { x: 0, y: 0 },
65
+ data: { name: repoName, repositoryPath: repoPath },
66
+ });
67
+ appendFeatureNodes(orphanFeatures, virtualRepoNodeId, featuresWithRuns, nodes, edges);
68
+ }
69
+ // Add parent→child dependency edges
70
+ for (const { feature } of featuresWithRuns) {
71
+ if (feature.parentId) {
72
+ const parentNodeId = `feat-${feature.parentId}`;
73
+ const childNodeId = `feat-${feature.id}`;
74
+ if (nodes.some((n) => n.id === parentNodeId) && nodes.some((n) => n.id === childNodeId)) {
75
+ edges.push({
76
+ id: `dep-${parentNodeId}-${childNodeId}`,
77
+ source: parentNodeId,
78
+ target: childNodeId,
79
+ type: 'dependencyEdge',
80
+ });
81
+ }
82
+ }
83
+ }
84
+ return { nodes, edges };
85
+ }
86
+ function appendFeatureNodes(repoFeatures, repoNodeId, allFeaturesWithRuns, nodes, edges) {
87
+ repoFeatures.forEach(({ feature, run }) => {
88
+ const agentNode = run?.result?.startsWith('node:') ? run.result.slice(5) : undefined;
89
+ const lifecycle = run?.status === 'completed'
90
+ ? 'maintain'
91
+ : ((agentNode ? nodeToLifecyclePhase[agentNode] : undefined) ??
92
+ lifecycleMap[feature.lifecycle] ??
93
+ 'requirements');
94
+ // Resolve blockedBy display name from parent feature
95
+ let blockedBy;
96
+ if (feature.parentId && feature.lifecycle === 'Blocked') {
97
+ const parentEntry = allFeaturesWithRuns.find((e) => e.feature.id === feature.parentId);
98
+ if (parentEntry) {
99
+ blockedBy = parentEntry.feature.name;
100
+ }
101
+ }
102
+ const nodeData = {
103
+ name: feature.name,
104
+ description: feature.description ?? feature.slug,
105
+ featureId: feature.id,
106
+ lifecycle,
107
+ repositoryPath: feature.repositoryPath,
108
+ branch: feature.branch,
109
+ specPath: feature.specPath,
110
+ state: deriveNodeState(feature, run),
111
+ progress: deriveProgress(feature),
112
+ ...(run?.agentType && { agentType: run.agentType }),
113
+ ...(run?.error && { errorMessage: run.error }),
114
+ ...(blockedBy && { blockedBy }),
115
+ ...(feature.pr && {
116
+ pr: {
117
+ url: feature.pr.url,
118
+ number: feature.pr.number,
119
+ status: feature.pr.status,
120
+ ciStatus: feature.pr.ciStatus,
121
+ commitHash: feature.pr.commitHash,
122
+ },
123
+ }),
124
+ };
125
+ const featureNodeId = `feat-${feature.id}`;
126
+ nodes.push({
127
+ id: featureNodeId,
128
+ type: 'featureNode',
129
+ position: { x: 0, y: 0 },
130
+ data: nodeData,
131
+ });
132
+ // Child features connect via parent→child dependency edge, not directly to repo
133
+ if (!feature.parentId) {
134
+ edges.push({
135
+ id: `edge-${repoNodeId}-${featureNodeId}`,
136
+ source: repoNodeId,
137
+ target: featureNodeId,
138
+ style: { strokeDasharray: '5 5' },
139
+ });
140
+ }
141
+ });
142
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/page.tsx"],"names":[],"mappings":"AAcA,uFAAuF;AACvF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAsBvC,wBAA8B,QAAQ,qDAiIrC"}
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../../src/presentation/web/app/page.tsx"],"names":[],"mappings":"AAQA,uFAAuF;AACvF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AAEvC,wBAA8B,QAAQ,qDA4BrC"}
@@ -1,28 +1,10 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { ControlCenter } from '../components/features/control-center/index.js';
3
3
  import { resolve } from '../lib/server-container.js';
4
- import { deriveNodeState, deriveProgress, } from '../components/common/feature-node/derive-feature-state.js';
5
4
  import { layoutWithDagre } from '../lib/layout-with-dagre.js';
5
+ import { buildGraphNodes } from './build-graph-nodes.js';
6
6
  /** Skip static pre-rendering since we need runtime DI container and server context. */
7
7
  export const dynamic = 'force-dynamic';
8
- /** Map domain SdlcLifecycle enum values to UI FeatureLifecyclePhase (1:1). */
9
- const lifecycleMap = {
10
- Requirements: 'requirements',
11
- Research: 'research',
12
- Implementation: 'implementation',
13
- Review: 'review',
14
- 'Deploy & QA': 'deploy',
15
- Maintain: 'maintain',
16
- };
17
- /** Map agent graph node names (from agent_run.result) to UI lifecycle phases. */
18
- const nodeToLifecyclePhase = {
19
- analyze: 'requirements',
20
- requirements: 'requirements',
21
- research: 'research',
22
- plan: 'implementation',
23
- implement: 'implementation',
24
- merge: 'review',
25
- };
26
8
  export default async function HomePage() {
27
9
  const listFeatures = resolve('ListFeaturesUseCase');
28
10
  const listRepos = resolve('ListRepositoriesUseCase');
@@ -32,99 +14,7 @@ export default async function HomePage() {
32
14
  const run = feature.agentRunId ? await agentRunRepo.findById(feature.agentRunId) : null;
33
15
  return { feature, run };
34
16
  }));
35
- // Group features by repository path (features may still reference paths not yet in repositories table)
36
- const featuresByRepo = {};
37
- featuresWithRuns.forEach((entry) => {
38
- const repoKey = entry.feature.repositoryPath;
39
- if (!featuresByRepo[repoKey]) {
40
- featuresByRepo[repoKey] = [];
41
- }
42
- featuresByRepo[repoKey].push(entry);
43
- });
44
- const nodes = [];
45
- const edges = [];
46
- // First, add nodes for all persisted repositories (including those without features)
47
- for (const repo of repositories) {
48
- const repoNodeId = `repo-${repo.id}`;
49
- nodes.push({
50
- id: repoNodeId,
51
- type: 'repositoryNode',
52
- position: { x: 0, y: 0 },
53
- data: { name: repo.name, repositoryPath: repo.path, id: repo.id },
54
- });
55
- const repoFeatures = featuresByRepo[repo.path] ?? [];
56
- repoFeatures.forEach(({ feature, run }) => {
57
- const agentNode = run?.result?.startsWith('node:') ? run.result.slice(5) : undefined;
58
- const lifecycle = run?.status === 'completed'
59
- ? 'maintain'
60
- : ((agentNode ? nodeToLifecyclePhase[agentNode] : undefined) ??
61
- lifecycleMap[feature.lifecycle] ??
62
- 'requirements');
63
- // Resolve blockedBy display name from parent feature
64
- let blockedBy;
65
- if (feature.parentId && feature.lifecycle === 'Blocked') {
66
- const parentEntry = featuresWithRuns.find((e) => e.feature.id === feature.parentId);
67
- if (parentEntry) {
68
- blockedBy = parentEntry.feature.name;
69
- }
70
- }
71
- const nodeData = {
72
- name: feature.name,
73
- description: feature.description ?? feature.slug,
74
- featureId: feature.id,
75
- lifecycle,
76
- repositoryPath: feature.repositoryPath,
77
- branch: feature.branch,
78
- specPath: feature.specPath,
79
- state: deriveNodeState(feature, run),
80
- progress: deriveProgress(feature),
81
- ...(run?.agentType && { agentType: run.agentType }),
82
- ...(run?.error && { errorMessage: run.error }),
83
- ...(blockedBy && { blockedBy }),
84
- ...(feature.pr && {
85
- pr: {
86
- url: feature.pr.url,
87
- number: feature.pr.number,
88
- status: feature.pr.status,
89
- ciStatus: feature.pr.ciStatus,
90
- commitHash: feature.pr.commitHash,
91
- },
92
- }),
93
- };
94
- const featureNodeId = `feat-${feature.id}`;
95
- nodes.push({
96
- id: featureNodeId,
97
- type: 'featureNode',
98
- position: { x: 0, y: 0 },
99
- data: nodeData,
100
- });
101
- // Child features connect via parent→child dependency edge, not directly to repo
102
- if (!feature.parentId) {
103
- edges.push({
104
- id: `edge-${repoNodeId}-${featureNodeId}`,
105
- source: repoNodeId,
106
- target: featureNodeId,
107
- style: { strokeDasharray: '5 5' },
108
- });
109
- }
110
- });
111
- }
112
- // Add parent→child dependency edges
113
- for (const { feature } of featuresWithRuns) {
114
- if (feature.parentId) {
115
- const parentNodeId = `feat-${feature.parentId}`;
116
- const childNodeId = `feat-${feature.id}`;
117
- // Only add edge if both nodes exist on the canvas
118
- if (nodes.some((n) => n.id === parentNodeId) && nodes.some((n) => n.id === childNodeId)) {
119
- edges.push({
120
- id: `dep-${parentNodeId}-${childNodeId}`,
121
- source: parentNodeId,
122
- target: childNodeId,
123
- type: 'dependencyEdge',
124
- });
125
- }
126
- }
127
- }
17
+ const { nodes, edges } = buildGraphNodes(repositories, featuresWithRuns);
128
18
  // Use dagre LR layout for compact, automatic positioning
129
19
  const laid = layoutWithDagre(nodes, edges, {
130
20
  direction: 'LR',
@@ -1,4 +1,5 @@
1
1
  import { type VariantProps } from 'class-variance-authority';
2
+ import { type DeployActionInput } from '../../../hooks/use-deploy-action.js';
2
3
  declare const drawerVariants: (props?: ({
3
4
  size?: "md" | "sm" | null | undefined;
4
5
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
@@ -11,7 +12,8 @@ export interface BaseDrawerProps extends VariantProps<typeof drawerVariants> {
11
12
  footer?: React.ReactNode;
12
13
  className?: string;
13
14
  'data-testid'?: string;
15
+ deployTarget?: DeployActionInput;
14
16
  }
15
- export declare function BaseDrawer({ open, onClose, modal, size, header, children, footer, className, 'data-testid': testId, }: BaseDrawerProps): import("react/jsx-runtime").JSX.Element;
17
+ export declare function BaseDrawer({ open, onClose, modal, size, header, children, footer, className, 'data-testid': testId, deployTarget, }: BaseDrawerProps): import("react/jsx-runtime").JSX.Element;
16
18
  export {};
17
19
  //# sourceMappingURL=base-drawer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/base-drawer/base-drawer.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAUlE,QAAA,MAAM,cAAc;;8EAUlB,CAAC;AAEH,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,OAAO,cAAc,CAAC;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,KAAa,EACb,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,aAAa,EAAE,MAAM,GACtB,EAAE,eAAe,2CA2CjB"}
1
+ {"version":3,"file":"base-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/base-drawer/base-drawer.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAYlE,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAGpF,QAAA,MAAM,cAAc;;8EAUlB,CAAC;AAEH,MAAM,WAAW,eAAgB,SAAQ,YAAY,CAAC,OAAO,cAAc,CAAC;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAClC;AAED,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,KAAa,EACb,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,aAAa,EAAE,MAAM,EACrB,YAAY,GACb,EAAE,eAAe,2CA8CjB"}