@shepai/cli 1.65.0 → 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 (330) 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/application/use-cases/features/resume-feature.use-case.d.ts.map +1 -1
  11. package/dist/packages/core/src/application/use-cases/features/resume-feature.use-case.js +5 -2
  12. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/di/container.js +3 -0
  14. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +25 -0
  16. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts +1 -1
  17. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +5 -2
  19. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.js +6 -2
  21. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +11 -7
  23. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.d.ts.map +1 -1
  24. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.js +11 -7
  25. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.d.ts.map +1 -1
  26. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.js +11 -7
  27. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts +57 -0
  28. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -0
  29. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +192 -0
  30. package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.d.ts +26 -0
  31. package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.d.ts.map +1 -0
  32. package/dist/packages/core/src/infrastructure/services/deployment/detect-dev-script.js +59 -0
  33. package/dist/packages/core/src/infrastructure/services/deployment/parse-port.d.ts +15 -0
  34. package/dist/packages/core/src/infrastructure/services/deployment/parse-port.d.ts.map +1 -0
  35. package/dist/packages/core/src/infrastructure/services/deployment/parse-port.js +52 -0
  36. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.d.ts.map +1 -1
  37. package/dist/packages/core/src/infrastructure/services/git/git-pr.service.js +13 -3
  38. package/dist/src/presentation/cli/commands/_serve.command.d.ts.map +1 -1
  39. package/dist/src/presentation/cli/commands/_serve.command.js +2 -0
  40. package/dist/src/presentation/web/app/actions/deploy-feature.d.ts +7 -0
  41. package/dist/src/presentation/web/app/actions/deploy-feature.d.ts.map +1 -0
  42. package/dist/src/presentation/web/app/actions/deploy-feature.js +28 -0
  43. package/dist/src/presentation/web/app/actions/deploy-repository.d.ts +7 -0
  44. package/dist/src/presentation/web/app/actions/deploy-repository.d.ts.map +1 -0
  45. package/dist/src/presentation/web/app/actions/deploy-repository.js +21 -0
  46. package/dist/src/presentation/web/app/actions/get-deployment-status.d.ts +3 -0
  47. package/dist/src/presentation/web/app/actions/get-deployment-status.d.ts.map +1 -0
  48. package/dist/src/presentation/web/app/actions/get-deployment-status.js +9 -0
  49. package/dist/src/presentation/web/app/actions/stop-deployment.d.ts +5 -0
  50. package/dist/src/presentation/web/app/actions/stop-deployment.d.ts.map +1 -0
  51. package/dist/src/presentation/web/app/actions/stop-deployment.js +16 -0
  52. package/dist/src/presentation/web/app/build-graph-nodes.d.ts +20 -0
  53. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -0
  54. package/dist/src/presentation/web/app/build-graph-nodes.js +142 -0
  55. package/dist/src/presentation/web/app/page.d.ts.map +1 -1
  56. package/dist/src/presentation/web/app/page.js +2 -112
  57. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts +3 -1
  58. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.d.ts.map +1 -1
  59. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.js +13 -3
  60. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts +2 -0
  61. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.d.ts.map +1 -1
  62. package/dist/src/presentation/web/components/common/base-drawer/base-drawer.stories.js +9 -0
  63. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.d.ts +7 -0
  64. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.d.ts.map +1 -0
  65. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.js +14 -0
  66. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.d.ts +14 -0
  67. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.d.ts.map +1 -0
  68. package/dist/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.js +27 -0
  69. package/dist/src/presentation/web/components/common/deployment-status-badge/index.d.ts +2 -0
  70. package/dist/src/presentation/web/components/common/deployment-status-badge/index.d.ts.map +1 -0
  71. package/dist/src/presentation/web/components/common/deployment-status-badge/index.js +1 -0
  72. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.d.ts.map +1 -1
  73. package/dist/src/presentation/web/components/common/feature-drawer/feature-drawer.js +8 -1
  74. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.d.ts.map +1 -1
  75. package/dist/src/presentation/web/components/common/repository-node/repository-drawer.js +7 -1
  76. package/dist/src/presentation/web/components/common/repository-node/repository-node.d.ts.map +1 -1
  77. package/dist/src/presentation/web/components/common/repository-node/repository-node.js +13 -2
  78. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.d.ts.map +1 -1
  79. package/dist/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.js +12 -2
  80. package/dist/src/presentation/web/hooks/use-deploy-action.d.ts +18 -0
  81. package/dist/src/presentation/web/hooks/use-deploy-action.d.ts.map +1 -0
  82. package/dist/src/presentation/web/hooks/use-deploy-action.js +130 -0
  83. package/dist/src/presentation/web/lib/feature-flags.d.ts +1 -0
  84. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  85. package/dist/src/presentation/web/lib/feature-flags.js +1 -0
  86. package/dist/tsconfig.build.tsbuildinfo +1 -1
  87. package/package.json +1 -1
  88. package/web/.next/BUILD_ID +1 -1
  89. package/web/.next/build-manifest.json +7 -6
  90. package/web/.next/cache/.previewinfo +1 -1
  91. package/web/.next/cache/.rscinfo +1 -1
  92. package/web/.next/cache/.tsbuildinfo +1 -1
  93. package/web/.next/cache/config.json +3 -3
  94. package/web/.next/fallback-build-manifest.json +2 -2
  95. package/web/.next/prerender-manifest.json +3 -3
  96. package/web/.next/required-server-files.js +1 -1
  97. package/web/.next/required-server-files.json +1 -1
  98. package/web/.next/server/app/_global-error/page/build-manifest.json +5 -4
  99. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  100. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  101. package/web/.next/server/app/_global-error.html +2 -2
  102. package/web/.next/server/app/_global-error.rsc +1 -1
  103. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  104. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  105. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  106. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  107. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  108. package/web/.next/server/app/_not-found/page/build-manifest.json +5 -4
  109. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  110. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  111. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
  113. package/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
  114. package/web/.next/server/app/page/build-manifest.json +5 -4
  115. package/web/.next/server/app/page/server-reference-manifest.json +88 -28
  116. package/web/.next/server/app/page.js +2 -2
  117. package/web/.next/server/app/page.js.nft.json +1 -1
  118. package/web/.next/server/app/page_client-reference-manifest.js +1 -1
  119. package/web/.next/server/app/skills/page/build-manifest.json +5 -4
  120. package/web/.next/server/app/skills/page/server-reference-manifest.json +62 -2
  121. package/web/.next/server/app/skills/page.js +2 -2
  122. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  123. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  124. package/web/.next/server/app/tools/page/build-manifest.json +5 -4
  125. package/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  126. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  127. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  128. package/web/.next/server/app/version/page/build-manifest.json +5 -4
  129. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  130. package/web/.next/server/app/version/page.js +1 -1
  131. package/web/.next/server/app/version/page.js.nft.json +1 -1
  132. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  133. package/web/.next/server/chunks/{[root-of-the-server]__e926de65._.js → [root-of-the-server]__09413611._.js} +2 -2
  134. package/web/.next/server/chunks/{[root-of-the-server]__e926de65._.js.map → [root-of-the-server]__09413611._.js.map} +1 -1
  135. package/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js +3 -0
  136. package/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js.map +1 -0
  137. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  138. package/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js → [root-of-the-server]__248ee887._.js} +2 -2
  140. package/web/.next/server/chunks/ssr/{[root-of-the-server]__685eaa45._.js.map → [root-of-the-server]__248ee887._.js.map} +1 -1
  141. 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
  142. package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +4 -0
  143. package/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js.map +1 -0
  144. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  145. package/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js.map +1 -1
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js +3 -0
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js.map +1 -0
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  149. package/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js.map +1 -1
  150. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  151. package/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js.map +1 -1
  152. package/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js +3 -0
  153. package/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js.map +1 -0
  154. 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
  155. package/web/.next/server/chunks/ssr/[root-of-the-server]__f5830fa9._.js.map +1 -0
  156. package/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js +9 -0
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js.map +1 -0
  158. package/web/.next/server/chunks/ssr/_28993370._.js +3 -0
  159. package/web/.next/server/chunks/ssr/_28993370._.js.map +1 -0
  160. package/web/.next/server/chunks/ssr/_380c6567._.js +1 -1
  161. package/web/.next/server/chunks/ssr/_380c6567._.js.map +1 -1
  162. package/web/.next/server/chunks/ssr/_45715073._.js +3 -0
  163. package/web/.next/server/chunks/ssr/{_d81184e2._.js.map → _45715073._.js.map} +1 -1
  164. package/web/.next/server/chunks/ssr/_6978d868._.js +3 -0
  165. package/web/.next/server/chunks/ssr/_6978d868._.js.map +1 -0
  166. package/web/.next/server/chunks/ssr/_85965278._.js +6 -0
  167. package/web/.next/server/chunks/ssr/_85965278._.js.map +1 -0
  168. package/web/.next/server/chunks/ssr/_c52cace8._.js +3 -0
  169. package/web/.next/server/chunks/ssr/_c52cace8._.js.map +1 -0
  170. package/web/.next/server/chunks/ssr/_ed9132c9._.js +3 -0
  171. package/web/.next/server/chunks/ssr/_ed9132c9._.js.map +1 -0
  172. package/web/.next/server/chunks/ssr/{node_modules__pnpm_87f920e7._.js → node_modules__pnpm_febcbea6._.js} +2 -2
  173. package/web/.next/server/chunks/ssr/node_modules__pnpm_febcbea6._.js.map +1 -0
  174. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  175. package/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js.map +1 -1
  176. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  177. package/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js.map +1 -1
  178. package/web/.next/server/middleware-build-manifest.js +5 -4
  179. package/web/.next/server/pages/500.html +2 -2
  180. package/web/.next/server/server-reference-manifest.js +1 -1
  181. package/web/.next/server/server-reference-manifest.json +118 -30
  182. package/web/.next/standalone/src/presentation/web/.next/BUILD_ID +1 -1
  183. package/web/.next/standalone/src/presentation/web/.next/build-manifest.json +7 -6
  184. package/web/.next/standalone/src/presentation/web/.next/prerender-manifest.json +3 -3
  185. package/web/.next/standalone/src/presentation/web/.next/required-server-files.json +1 -1
  186. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page/build-manifest.json +5 -4
  187. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  188. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  189. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.html +2 -2
  190. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.rsc +1 -1
  191. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  192. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  193. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  194. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  195. package/web/.next/standalone/src/presentation/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  196. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/build-manifest.json +5 -4
  197. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  198. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  199. package/web/.next/standalone/src/presentation/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  200. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js +1 -1
  201. package/web/.next/standalone/src/presentation/web/.next/server/app/api/tools/[id]/install/route.js.nft.json +1 -1
  202. package/web/.next/standalone/src/presentation/web/.next/server/app/page/build-manifest.json +5 -4
  203. package/web/.next/standalone/src/presentation/web/.next/server/app/page/server-reference-manifest.json +88 -28
  204. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js +2 -2
  205. package/web/.next/standalone/src/presentation/web/.next/server/app/page.js.nft.json +1 -1
  206. package/web/.next/standalone/src/presentation/web/.next/server/app/page_client-reference-manifest.js +1 -1
  207. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/build-manifest.json +5 -4
  208. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page/server-reference-manifest.json +62 -2
  209. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js +2 -2
  210. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page.js.nft.json +1 -1
  211. package/web/.next/standalone/src/presentation/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  212. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/build-manifest.json +5 -4
  213. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page/server-reference-manifest.json +1 -1
  214. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page.js.nft.json +1 -1
  215. package/web/.next/standalone/src/presentation/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  216. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/build-manifest.json +5 -4
  217. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  218. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js +1 -1
  219. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page.js.nft.json +1 -1
  220. package/web/.next/standalone/src/presentation/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  221. package/web/.next/standalone/src/presentation/web/.next/server/chunks/{[root-of-the-server]__e926de65._.js → [root-of-the-server]__09413611._.js} +2 -2
  222. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/403f9_next_dist_623b646a._.js +3 -0
  223. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__08ba9bd3._.js +1 -1
  224. 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
  225. 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
  226. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__551fb7e1._.js +4 -0
  227. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6b17a22d._.js +1 -1
  228. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__6bb51fac._.js +3 -0
  229. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__804c006d._.js +1 -1
  230. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__9add7c3a._.js +4 -4
  231. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__c1f0f2a8._.js +3 -0
  232. 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
  233. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__f648005b._.js +9 -0
  234. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_28993370._.js +3 -0
  235. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_380c6567._.js +1 -1
  236. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_45715073._.js +3 -0
  237. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_6978d868._.js +3 -0
  238. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_85965278._.js +6 -0
  239. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_c52cace8._.js +3 -0
  240. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_ed9132c9._.js +3 -0
  241. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/{node_modules__pnpm_87f920e7._.js → node_modules__pnpm_febcbea6._.js} +2 -2
  242. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_e599bb8c._.js +1 -1
  243. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_ed0934e5._.js +1 -1
  244. package/web/.next/standalone/src/presentation/web/.next/server/middleware-build-manifest.js +5 -4
  245. package/web/.next/standalone/src/presentation/web/.next/server/pages/500.html +2 -2
  246. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.js +1 -1
  247. package/web/.next/standalone/src/presentation/web/.next/server/server-reference-manifest.json +118 -30
  248. package/web/.next/standalone/src/presentation/web/app/actions/deploy-feature.ts +39 -0
  249. package/web/.next/standalone/src/presentation/web/app/actions/deploy-repository.ts +28 -0
  250. package/web/.next/standalone/src/presentation/web/app/actions/get-deployment-status.ts +16 -0
  251. package/web/.next/standalone/src/presentation/web/app/actions/stop-deployment.ts +22 -0
  252. package/web/.next/standalone/src/presentation/web/app/build-graph-nodes.ts +180 -0
  253. package/web/.next/standalone/src/presentation/web/app/page.tsx +2 -129
  254. package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.stories.tsx +26 -0
  255. package/web/.next/standalone/src/presentation/web/components/common/base-drawer/base-drawer.tsx +45 -1
  256. package/web/.next/standalone/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.stories.tsx +35 -0
  257. package/web/.next/standalone/src/presentation/web/components/common/deployment-status-badge/deployment-status-badge.tsx +42 -0
  258. package/web/.next/standalone/src/presentation/web/components/common/deployment-status-badge/index.ts +1 -0
  259. package/web/.next/standalone/src/presentation/web/components/common/feature-drawer/feature-drawer.tsx +10 -0
  260. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-drawer.tsx +9 -0
  261. package/web/.next/standalone/src/presentation/web/components/common/repository-node/repository-node.tsx +43 -2
  262. package/web/.next/standalone/src/presentation/web/components/common/review-drawer-shell/review-drawer-shell.tsx +79 -44
  263. package/web/.next/standalone/src/presentation/web/hooks/use-deploy-action.ts +161 -0
  264. package/web/.next/standalone/src/presentation/web/lib/feature-flags.ts +1 -0
  265. package/web/.next/standalone/src/presentation/web/server.js +1 -1
  266. package/web/.next/static/chunks/0b99eb9664d47ca7.js +1 -0
  267. package/web/.next/static/chunks/177f1dcbe83c136a.js +1 -0
  268. package/web/.next/static/chunks/41a2adc09edfffaf.js +1 -0
  269. package/web/.next/static/chunks/5054c72b1c8f5912.js +1 -0
  270. package/web/.next/static/chunks/71d2618e41d7da6d.js +1 -0
  271. package/web/.next/static/chunks/7ad36bef63f15bc6.js +1 -0
  272. package/web/.next/static/chunks/{3b941e59ac013e12.js → 87421ab1062a39b7.js} +2 -2
  273. package/web/.next/static/chunks/{21541b346dd4dd28.js → 8c60d1bd87239066.js} +1 -1
  274. package/web/.next/static/chunks/96f49affaceab206.css +2 -0
  275. package/web/.next/static/chunks/a6d1d774260fc927.js +2 -0
  276. package/web/.next/static/chunks/c7e793951b20a67f.js +1 -0
  277. package/web/.next/static/chunks/f54ff9c15fb7b383.js +1 -0
  278. package/web/.next/static/chunks/f5fb2f182ae9b015.js +1 -0
  279. package/web/.next/static/chunks/{fa8058049a43c698.js → f6766e799a69fb5d.js} +7 -7
  280. package/web/.next/static/chunks/turbopack-b6b5b4f015327a9a.js +4 -0
  281. package/web/.next/trace +1 -1
  282. package/web/.next/trace-build +1 -1
  283. package/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js +0 -3
  284. package/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js.map +0 -1
  285. package/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js +0 -3
  286. package/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js.map +0 -1
  287. package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +0 -9
  288. package/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js.map +0 -1
  289. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +0 -4
  290. package/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js.map +0 -1
  291. package/web/.next/server/chunks/ssr/[root-of-the-server]__dd5b62cb._.js.map +0 -1
  292. package/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js +0 -3
  293. package/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js.map +0 -1
  294. package/web/.next/server/chunks/ssr/_73d14b70._.js +0 -3
  295. package/web/.next/server/chunks/ssr/_73d14b70._.js.map +0 -1
  296. package/web/.next/server/chunks/ssr/_7f386377._.js +0 -3
  297. package/web/.next/server/chunks/ssr/_7f386377._.js.map +0 -1
  298. package/web/.next/server/chunks/ssr/_d3711354._.js +0 -6
  299. package/web/.next/server/chunks/ssr/_d3711354._.js.map +0 -1
  300. package/web/.next/server/chunks/ssr/_d81184e2._.js +0 -3
  301. package/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js +0 -3
  302. package/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js.map +0 -1
  303. package/web/.next/server/chunks/ssr/node_modules__pnpm_87f920e7._.js.map +0 -1
  304. package/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js +0 -3
  305. package/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js.map +0 -1
  306. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__5e0f14e9._.js +0 -3
  307. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__ae251147._.js +0 -3
  308. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__b6839c3f._.js +0 -9
  309. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__da0ade1f._.js +0 -4
  310. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/[root-of-the-server]__edca9510._.js +0 -3
  311. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_73d14b70._.js +0 -3
  312. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_7f386377._.js +0 -3
  313. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_d3711354._.js +0 -6
  314. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/_d81184e2._.js +0 -3
  315. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/node_modules__pnpm_0ce0b44d._.js +0 -3
  316. package/web/.next/standalone/src/presentation/web/.next/server/chunks/ssr/src_presentation_web_components_7a0b09da._.js +0 -3
  317. package/web/.next/static/chunks/0c6654ec27f11c7e.js +0 -1
  318. package/web/.next/static/chunks/12c70bfd5951cf9b.js +0 -1
  319. package/web/.next/static/chunks/1887af4ad3781531.js +0 -2
  320. package/web/.next/static/chunks/233fbb89beb137e8.js +0 -1
  321. package/web/.next/static/chunks/78919481e7c5ad4f.js +0 -1
  322. package/web/.next/static/chunks/a5b6a22de303e877.css +0 -2
  323. package/web/.next/static/chunks/acdb8af5a21f1ae9.js +0 -1
  324. package/web/.next/static/chunks/af7a5bcb7c49e46e.js +0 -1
  325. package/web/.next/static/chunks/be784143669bb992.js +0 -1
  326. package/web/.next/static/chunks/turbopack-eb24b869babb34b4.js +0 -4
  327. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__fbc89707._.js.map → [root-of-the-server]__249c74f6._.js.map} +0 -0
  328. /package/web/.next/static/{zuqVLdEhCDdtLqCuWgUm5 → 5RMUwLfTnzL0pvJOwfuxg}/_buildManifest.js +0 -0
  329. /package/web/.next/static/{zuqVLdEhCDdtLqCuWgUm5 → 5RMUwLfTnzL0pvJOwfuxg}/_clientMiddlewareManifest.json +0 -0
  330. /package/web/.next/static/{zuqVLdEhCDdtLqCuWgUm5 → 5RMUwLfTnzL0pvJOwfuxg}/_ssgManifest.js +0 -0
@@ -5,7 +5,7 @@
5
5
  */
6
6
  import type { Repository } from '../../../../domain/generated/output.js';
7
7
  export interface IRepositoryRepository {
8
- create(repository: Repository): Promise<void>;
8
+ create(repository: Repository): Promise<Repository>;
9
9
  findById(id: string): Promise<Repository | null>;
10
10
  findByPath(path: string): Promise<Repository | null>;
11
11
  /** Find by path including soft-deleted records (for re-activation). */
@@ -1 +1 @@
1
- {"version":3,"file":"repository-repository.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/repositories/repository-repository.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrD,uEAAuE;IACvE,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrE,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC"}
1
+ {"version":3,"file":"repository-repository.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/repositories/repository-repository.interface.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACpD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACjD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrD,uEAAuE;IACvE,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACrE,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC9B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Deployment Service Interface
3
+ *
4
+ * Output port for managing local dev server deployments.
5
+ * Infrastructure layer provides the concrete DeploymentService implementation
6
+ * backed by an in-memory process registry.
7
+ *
8
+ * Following Clean Architecture:
9
+ * - Application layer depends on this interface
10
+ * - Infrastructure layer provides concrete implementations
11
+ */
12
+ import type { DeploymentState } from '../../../../domain/generated/output.js';
13
+ /** Status snapshot returned by getStatus(). */
14
+ export interface DeploymentStatus {
15
+ /** Current lifecycle state of the deployment. */
16
+ state: DeploymentState;
17
+ /** Detected URL when the dev server is Ready, null while Booting. */
18
+ url: string | null;
19
+ }
20
+ /**
21
+ * Port interface for managing local dev server deployments.
22
+ *
23
+ * Implementations must:
24
+ * - Maintain an in-memory registry of active deployments keyed by targetId
25
+ * - Enforce one deployment per target (stop existing before starting new)
26
+ * - Detect the dev script from package.json and spawn via the correct package manager
27
+ * - Parse stdout/stderr for port/URL detection
28
+ * - Support graceful shutdown (SIGTERM → SIGKILL) for individual and bulk stops
29
+ */
30
+ export interface IDeploymentService {
31
+ /**
32
+ * Start a dev server deployment for the given target.
33
+ * If a deployment already exists for this targetId, it is stopped first.
34
+ *
35
+ * @param targetId - Unique identifier for the deployment target (featureId or repositoryId)
36
+ * @param targetPath - Absolute filesystem path to the directory to run the dev server in
37
+ * @returns The initial deployment state (always Booting on success)
38
+ * @throws Error if no dev script is found in package.json or the process fails to spawn
39
+ */
40
+ start(targetId: string, targetPath: string): void;
41
+ /**
42
+ * Stop a running deployment gracefully.
43
+ * Sends SIGTERM to the process group, then SIGKILL after a timeout.
44
+ * No-op if no deployment exists for this targetId.
45
+ *
46
+ * @param targetId - Unique identifier for the deployment target
47
+ */
48
+ stop(targetId: string): Promise<void>;
49
+ /**
50
+ * Get the current deployment status for a target.
51
+ *
52
+ * @param targetId - Unique identifier for the deployment target
53
+ * @returns Status snapshot with state and url, or null if no deployment exists
54
+ */
55
+ getStatus(targetId: string): DeploymentStatus | null;
56
+ /**
57
+ * Force-stop all tracked deployments immediately.
58
+ * Called during daemon shutdown to prevent orphaned dev server processes.
59
+ */
60
+ stopAll(): void;
61
+ }
62
+ //# sourceMappingURL=deployment-service.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment-service.interface.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/deployment-service.interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,+CAA+C;AAC/C,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,KAAK,EAAE,eAAe,CAAC;IACvB,qEAAqE;IACrE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;OAQG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAElD;;;;;;OAMG;IACH,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtC;;;;;OAKG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CAAC;IAErD;;;OAGG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Deployment Service Interface
3
+ *
4
+ * Output port for managing local dev server deployments.
5
+ * Infrastructure layer provides the concrete DeploymentService implementation
6
+ * backed by an in-memory process registry.
7
+ *
8
+ * Following Clean Architecture:
9
+ * - Application layer depends on this interface
10
+ * - Infrastructure layer provides concrete implementations
11
+ */
12
+ export {};
@@ -16,4 +16,5 @@ export type { IGitPrService, CiStatus, CiStatusResult, DiffSummary, MergeStrateg
16
16
  export { GitPrError, GitPrErrorCode } from './git-pr-service.interface.js';
17
17
  export type { IIdeLauncherService, LaunchIdeInput, LaunchIdeResult, LaunchIdeSuccess, LaunchIdeFailed, } from './ide-launcher-service.interface.js';
18
18
  export type { IDaemonService, DaemonState } from './daemon-service.interface.js';
19
+ export type { IDeploymentService, DeploymentStatus } from './deployment-service.interface.js';
19
20
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/ports/output/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EACL,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,YAAY,EACV,uBAAuB,EACvB,qBAAqB,GACtB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAChF,YAAY,EACV,aAAa,EACb,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,cAAc,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/create-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gEAAgE,CAAC;AAC1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uEAAuE,CAAC;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;AAGhG,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE1E,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAhBZ,WAAW,EAAE,kBAAkB,EAE/B,eAAe,EAAE,gBAAgB,EAEjC,YAAY,EAAE,2BAA2B,EAEzC,aAAa,EAAE,mBAAmB,EAElC,eAAe,EAAE,uBAAuB,EAExC,iBAAiB,EAAE,iBAAiB,EAEpC,YAAY,EAAE,YAAY,EAE1B,cAAc,EAAE,qBAAqB,EAErC,YAAY,EAAE,aAAa;IAGxC,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAyJvE"}
1
+ {"version":3,"file":"create-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../../packages/core/src/application/use-cases/features/create/create-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oEAAoE,CAAC;AAC7G,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AACrG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,iEAAiE,CAAC;AACnH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gEAAgE,CAAC;AAC1G,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,8DAA8D,CAAC;AAC5G,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uEAAuE,CAAC;AACnH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4DAA4D,CAAC;AAGhG,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAE1E,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAE9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAElC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAhBZ,WAAW,EAAE,kBAAkB,EAE/B,eAAe,EAAE,gBAAgB,EAEjC,YAAY,EAAE,2BAA2B,EAEzC,aAAa,EAAE,mBAAmB,EAElC,eAAe,EAAE,uBAAuB,EAExC,iBAAiB,EAAE,iBAAiB,EAEpC,YAAY,EAAE,YAAY,EAE1B,cAAc,EAAE,qBAAqB,EAErC,YAAY,EAAE,aAAa;IAGxC,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CA8JvE"}
@@ -127,7 +127,10 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
127
127
  createdAt: now,
128
128
  updatedAt: now,
129
129
  };
130
- await this.repositoryRepo.create(repository);
130
+ repository = await this.repositoryRepo.create(repository);
131
+ if (!repository) {
132
+ throw new Error(`Failed to create or retrieve repository record for path: ${normalizedPath}`);
133
+ }
131
134
  }
132
135
  const feature = {
133
136
  id: randomUUID(),
@@ -1 +1 @@
1
- {"version":3,"file":"resume-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/resume-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAE7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAQlG,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,eAAe;gBANf,WAAW,EAAE,kBAAkB,EAE/B,OAAO,EAAE,mBAAmB,EAE5B,cAAc,EAAE,2BAA2B,EAE3C,eAAe,EAAE,gBAAgB;IAG9C,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CA6F/D"}
1
+ {"version":3,"file":"resume-feature.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/features/resume-feature.use-case.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,qCAAqC,CAAC;AAE7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iEAAiE,CAAC;AAC1G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6DAA6D,CAAC;AACvG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,8DAA8D,CAAC;AAChH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2DAA2D,CAAC;AAQlG,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAE5B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAExB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,eAAe;gBANf,WAAW,EAAE,kBAAkB,EAE/B,OAAO,EAAE,mBAAmB,EAE5B,cAAc,EAAE,2BAA2B,EAE3C,eAAe,EAAE,gBAAgB;IAG9C,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAgG/D"}
@@ -94,9 +94,12 @@ let ResumeFeatureUseCase = class ResumeFeatureUseCase {
94
94
  agentRunId: newRunId,
95
95
  updatedAt: now,
96
96
  });
97
- // Derive worktree path and spawn resume worker
97
+ // Derive worktree path and spec dir for resume worker
98
98
  const worktreePath = this.worktreeService.getWorktreePath(feature.repositoryPath, feature.branch);
99
- this.processService.spawn(feature.id, newRunId, feature.repositoryPath, worktreePath, worktreePath, {
99
+ if (!feature.specPath) {
100
+ throw new Error(`Feature "${feature.name}" is missing specPath — cannot resume`);
101
+ }
102
+ this.processService.spawn(feature.id, newRunId, feature.repositoryPath, feature.specPath, worktreePath, {
100
103
  resume: true,
101
104
  approvalGates: lastRun.approvalGates,
102
105
  threadId: lastRun.threadId,
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AA+GrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAkQrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAiHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CAoQrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -25,6 +25,7 @@ import { ToolInstallerServiceImpl } from '../services/tool-installer/tool-instal
25
25
  import { GitPrService } from '../services/git/git-pr.service.js';
26
26
  import { JsonDrivenIdeLauncherService } from '../services/ide-launchers/json-driven-ide-launcher.service.js';
27
27
  import { DaemonPidService } from '../services/daemon/daemon-pid.service.js';
28
+ import { DeploymentService } from '../services/deployment/deployment.service.js';
28
29
  import { AgentExecutorFactory } from '../services/agents/common/agent-executor-factory.service.js';
29
30
  import { AgentExecutorProvider } from '../services/agents/common/agent-executor-provider.service.js';
30
31
  import { StructuredAgentCallerService } from '../services/agents/common/structured-agent-caller.service.js';
@@ -136,6 +137,8 @@ export async function initializeContainer() {
136
137
  container.registerSingleton('IGitPrService', GitPrService);
137
138
  container.registerSingleton('IIdeLauncherService', JsonDrivenIdeLauncherService);
138
139
  container.registerSingleton('IDaemonService', DaemonPidService);
140
+ const deploymentService = new DeploymentService();
141
+ container.registerInstance('IDeploymentService', deploymentService);
139
142
  // Register agent infrastructure
140
143
  container.register('IAgentRunRepository', {
141
144
  useFactory: (c) => {
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AA8W3C;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAA4C,CAAC;AAE/E;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B9E"}
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/persistence/sqlite/migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAuY3C;;;GAGG;AACH,eAAO,MAAM,qBAAqB,QAA4C,CAAC;AAE/E;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B9E"}
@@ -359,6 +359,31 @@ ALTER TABLE features ADD COLUMN ci_fix_history TEXT;
359
359
  add('notif_evt_pr_checks_failed');
360
360
  },
361
361
  },
362
+ {
363
+ version: 23,
364
+ sql: `
365
+ -- Migration 023: Back-fill repositories rows for orphaned features
366
+ -- Inserts a repository row for every distinct repository_path in the features table
367
+ -- that has no matching row in repositories. INSERT OR IGNORE ensures idempotency.
368
+ INSERT OR IGNORE INTO repositories (id, name, path, created_at, updated_at)
369
+ SELECT
370
+ lower(hex(randomblob(16))) AS id,
371
+ CASE
372
+ WHEN instr(repository_path, '/') > 0
373
+ THEN replace(repository_path, rtrim(repository_path, replace(repository_path, '/', '')), '')
374
+ ELSE repository_path
375
+ END AS name,
376
+ repository_path AS path,
377
+ strftime('%s', 'now') * 1000 AS created_at,
378
+ strftime('%s', 'now') * 1000 AS updated_at
379
+ FROM (
380
+ SELECT DISTINCT repository_path
381
+ FROM features
382
+ WHERE repository_path IS NOT NULL AND repository_path != ''
383
+ )
384
+ WHERE repository_path NOT IN (SELECT path FROM repositories WHERE path IS NOT NULL);
385
+ `,
386
+ },
362
387
  ];
363
388
  /**
364
389
  * The latest schema version (highest migration version number).
@@ -9,7 +9,7 @@ import type { Repository } from '../../domain/generated/output.js';
9
9
  export declare class SQLiteRepositoryRepository implements IRepositoryRepository {
10
10
  private readonly db;
11
11
  constructor(db: Database.Database);
12
- create(repository: Repository): Promise<void>;
12
+ create(repository: Repository): Promise<Repository>;
13
13
  findById(id: string): Promise<Repository | null>;
14
14
  findByPath(path: string): Promise<Repository | null>;
15
15
  list(): Promise<Repository[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"sqlite-repository.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-repository.repository.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gFAAgF,CAAC;AAC5H,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAOnE,qBACa,0BAA2B,YAAW,qBAAqB;IAC1D,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAS7C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAMhD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQpD,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAQ7B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAMpE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOzC"}
1
+ {"version":3,"file":"sqlite-repository.repository.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/repositories/sqlite-repository.repository.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gFAAgF,CAAC;AAC5H,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAOnE,qBACa,0BAA2B,YAAW,qBAAqB;IAC1D,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAE5C,MAAM,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAYnD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAMhD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAQpD,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAQ7B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKjC,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAMpE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAOzC"}
@@ -21,11 +21,14 @@ let SQLiteRepositoryRepository = class SQLiteRepositoryRepository {
21
21
  }
22
22
  async create(repository) {
23
23
  const row = toDatabase(repository);
24
- const stmt = this.db.prepare(`
24
+ const insertStmt = this.db.prepare(`
25
25
  INSERT OR IGNORE INTO repositories (id, name, path, created_at, updated_at)
26
26
  VALUES (@id, @name, @path, @created_at, @updated_at)
27
27
  `);
28
- stmt.run(row);
28
+ insertStmt.run(row);
29
+ const selectStmt = this.db.prepare('SELECT * FROM repositories WHERE path = ?');
30
+ const existing = selectStmt.get(row.path);
31
+ return fromDatabase(existing);
29
32
  }
30
33
  async findById(id) {
31
34
  const stmt = this.db.prepare('SELECT * FROM repositories WHERE id = ? AND deleted_at IS NULL');
@@ -1 +1 @@
1
- {"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACd,MAAM,iEAAiE,CAAC;AAsBzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IACnE;;;OAGG;IACH,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,YAAY,EAAE,aAAa,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CA6M7E"}
1
+ {"version":3,"file":"merge.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/merge/merge.node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yEAAyE,CAAC;AAClH,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACd,MAAM,iEAAiE,CAAC;AAsBzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,iBAAiB,EAAE,IAAI,CAAC,kBAAkB,EAAE,UAAU,GAAG,QAAQ,CAAC,CAAC;IACnE;;;OAGG;IACH,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1F,YAAY,EAAE,aAAa,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,aAAa,IAGnC,OAAO,iBAAiB,KAAG,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAiN7E"}
@@ -131,9 +131,13 @@ export function createMergeNode(deps) {
131
131
  log.info('Merge approved — skipping commit/push/PR, continuing to post-merge');
132
132
  messages.push(`[merge] Approved — continuing`);
133
133
  }
134
- // --- Agent Call 2: Merge (if enabled) ---
134
+ // --- Agent Call 2: Merge ---
135
+ // Merge when: allowMerge is true (auto-merge), OR user explicitly
136
+ // approved at the merge gate (isResumeAfterInterrupt means they
137
+ // clicked Approve). The approval IS permission to merge.
135
138
  let merged = false;
136
- if (state.approvalGates?.allowMerge) {
139
+ const userApprovedMerge = isResumeAfterInterrupt && state._approvalAction !== 'rejected';
140
+ if (state.approvalGates?.allowMerge || userApprovedMerge) {
137
141
  log.info('Agent call 2: merge/squash');
138
142
  const mergePrompt = buildMergeSquashPrompt({ ...state, prUrl, prNumber, commitHash }, branch, baseBranch, remoteAvailable);
139
143
  // Run merge in the ORIGINAL repo, not the worktree — the worktree IS
@@ -1 +1 @@
1
- {"version":3,"file":"merge-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAqCxD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,MAAM,CAyDR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,MAAM,CA0BR;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,UAAQ,GAChB,MAAM,CAkER"}
1
+ {"version":3,"file":"merge-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAwCxD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,MAAM,CAyDR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,MAAM,CA0BR;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,SAAS,UAAQ,GAChB,MAAM,CAkER"}
@@ -17,18 +17,22 @@ function getMergeRejectionFeedback(specContent) {
17
17
  if (rejectionFeedback && rejectionFeedback.length > 0) {
18
18
  const mergeRejections = rejectionFeedback.filter((e) => e.phase === 'merge');
19
19
  if (mergeRejections.length > 0) {
20
- const entries = mergeRejections
21
- .map((entry) => `- **Iteration ${entry.iteration}** (${entry.timestamp}): ${entry.message}`)
22
- .join('\n');
20
+ const latest = mergeRejections[mergeRejections.length - 1];
21
+ const older = mergeRejections.slice(0, -1);
22
+ const olderSection = older.length > 0
23
+ ? `\n### Earlier feedback (for context only)\n${older.map((e) => `- Iteration ${e.iteration}: ${e.message}`).join('\n')}\n`
24
+ : '';
23
25
  return `
24
- ## Previous Merge Rejection Feedback
26
+ ## ⚠️ CRITICAL — User Rejection Feedback (MUST ADDRESS)
25
27
 
26
- The user has previously rejected this merge with the following feedback. You MUST address these concerns in your revised output:
28
+ **YOUR PRIMARY TASK: The user rejected the previous result and gave this feedback. You MUST act on it:**
27
29
 
28
- ${entries}
30
+ > ${latest.message}
29
31
 
30
- Focus on the most recent feedback (highest iteration number) while ensuring earlier feedback is still addressed.
32
+ (Iteration ${latest.iteration}, ${latest.timestamp})
31
33
 
34
+ Do NOT just record this feedback — you must actually make the changes the user requested.
35
+ ${olderSection}
32
36
  `;
33
37
  }
34
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plan.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAkMhE"}
1
+ {"version":3,"file":"plan.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/plan.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAqMhE"}
@@ -20,18 +20,22 @@ export function buildPlanPrompt(state) {
20
20
  // Filter to plan-phase rejections only
21
21
  const planRejections = rejectionFeedback.filter((e) => e.phase === 'plan');
22
22
  if (planRejections.length > 0) {
23
- const entries = planRejections
24
- .map((entry) => `- **Iteration ${entry.iteration}** (${entry.timestamp}): ${entry.message}`)
25
- .join('\n');
23
+ const latest = planRejections[planRejections.length - 1];
24
+ const older = planRejections.slice(0, -1);
25
+ const olderSection = older.length > 0
26
+ ? `\n### Earlier feedback (for context only)\n${older.map((e) => `- Iteration ${e.iteration}: ${e.message}`).join('\n')}\n`
27
+ : '';
26
28
  rejectionFeedbackSection = `
27
- ## Previous Plan Rejection Feedback
29
+ ## ⚠️ CRITICAL — User Rejection Feedback (MUST ADDRESS)
28
30
 
29
- The user has previously rejected this plan with the following feedback. You MUST address these concerns in your revised output:
31
+ **YOUR PRIMARY TASK: The user rejected the previous result and gave this feedback. You MUST act on it:**
30
32
 
31
- ${entries}
33
+ > ${latest.message}
32
34
 
33
- Focus on the most recent feedback (highest iteration number) while ensuring earlier feedback is still addressed.
35
+ (Iteration ${latest.iteration}, ${latest.timestamp})
34
36
 
37
+ Do NOT just record this feedback — you must actually make the changes the user requested.
38
+ ${olderSection}
35
39
  `;
36
40
  }
37
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"requirements.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CAyKxE"}
1
+ {"version":3,"file":"requirements.prompt.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/requirements.prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,iBAAiB,GAAG,MAAM,CA4KxE"}
@@ -19,18 +19,22 @@ export function buildRequirementsPrompt(state) {
19
19
  // Filter to requirements-phase rejections (or legacy entries without phase)
20
20
  const reqRejections = rejectionFeedback.filter((e) => !e.phase || e.phase === 'requirements');
21
21
  if (reqRejections.length > 0) {
22
- const entries = reqRejections
23
- .map((entry) => `- **Iteration ${entry.iteration}** (${entry.timestamp}): ${entry.message}`)
24
- .join('\n');
22
+ const latest = reqRejections[reqRejections.length - 1];
23
+ const older = reqRejections.slice(0, -1);
24
+ const olderSection = older.length > 0
25
+ ? `\n### Earlier feedback (for context only)\n${older.map((e) => `- Iteration ${e.iteration}: ${e.message}`).join('\n')}\n`
26
+ : '';
25
27
  rejectionFeedbackSection = `
26
- ## Previous Rejection Feedback
28
+ ## ⚠️ CRITICAL — User Rejection Feedback (MUST ADDRESS)
27
29
 
28
- The user has previously rejected this PRD with the following feedback. You MUST address these concerns in your revised output:
30
+ **YOUR PRIMARY TASK: The user rejected the previous result and gave this feedback. You MUST act on it:**
29
31
 
30
- ${entries}
32
+ > ${latest.message}
31
33
 
32
- Focus on the most recent feedback (highest iteration number) while ensuring earlier feedback is still addressed.
34
+ (Iteration ${latest.iteration}, ${latest.timestamp})
33
35
 
36
+ Do NOT just record this feedback — you must actually make the changes the user requested.
37
+ ${olderSection}
34
38
  `;
35
39
  }
36
40
  }
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Deployment Service
3
+ *
4
+ * Infrastructure service that manages local dev server deployments.
5
+ * Holds an in-memory Map of active deployments keyed by targetId.
6
+ * Handles process spawning, stdout-based port detection, and graceful
7
+ * shutdown (SIGTERM → poll → SIGKILL).
8
+ */
9
+ import { spawn } from 'node:child_process';
10
+ import type { IDeploymentService, DeploymentStatus } from '../../../application/ports/output/services/deployment-service.interface.js';
11
+ import { detectDevScript } from './detect-dev-script.js';
12
+ export interface DeploymentServiceDeps {
13
+ spawn: typeof spawn;
14
+ detectDevScript: typeof detectDevScript;
15
+ kill: (pid: number, signal: NodeJS.Signals | string) => void;
16
+ isAlive: (pid: number) => boolean;
17
+ }
18
+ export declare class DeploymentService implements IDeploymentService {
19
+ private readonly deployments;
20
+ private readonly deps;
21
+ constructor(deps?: Partial<DeploymentServiceDeps>);
22
+ /**
23
+ * Start a deployment for the given target.
24
+ * If a deployment already exists for this target, it is stopped first.
25
+ */
26
+ start(targetId: string, targetPath: string): void;
27
+ /**
28
+ * Get the current deployment status for a target.
29
+ * Returns null if no deployment exists for this target.
30
+ */
31
+ getStatus(targetId: string): DeploymentStatus | null;
32
+ /**
33
+ * Stop a deployment gracefully: SIGTERM → poll → SIGKILL.
34
+ */
35
+ stop(targetId: string): Promise<void>;
36
+ /**
37
+ * Force-stop all tracked deployments immediately (for daemon shutdown).
38
+ */
39
+ stopAll(): void;
40
+ /**
41
+ * Send SIGKILL to a process group.
42
+ */
43
+ private killProcess;
44
+ /**
45
+ * Attach a line-buffered listener on stdout or stderr that calls parsePort.
46
+ */
47
+ private attachOutputListener;
48
+ /**
49
+ * Poll until a process is dead or timeout expires.
50
+ */
51
+ private pollUntilDead;
52
+ /**
53
+ * Wait for a child process to emit 'exit', with a short timeout.
54
+ */
55
+ private waitForExit;
56
+ }
57
+ //# sourceMappingURL=deployment.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/deployment/deployment.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,qEAAqE,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAgBzD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,KAAK,CAAC;IACpB,eAAe,EAAE,OAAO,eAAe,CAAC;IACxC,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7D,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;CACnC;AAgBD,qBAAa,iBAAkB,YAAW,kBAAkB;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;gBAEjC,IAAI,GAAE,OAAO,CAAC,qBAAqB,CAAM;IAIrD;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAmDjD;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAMpD;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B3C;;OAEG;IACH,OAAO,IAAI,IAAI;IAMf;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;OAEG;YACW,aAAa;IAW3B;;OAEG;IACH,OAAO,CAAC,WAAW;CASpB"}