@shepai/cli 1.105.0 → 1.106.0-pr313.e9fa158

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 (194) hide show
  1. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  2. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +2 -2
  3. package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.d.ts.map +1 -1
  4. package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.js +6 -2
  5. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +4 -4
  6. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +4 -4
  7. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +9 -0
  9. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.d.ts.map +1 -1
  10. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.js +5 -3
  11. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.js +4 -3
  13. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/merge-prompts.js +3 -3
  14. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.d.ts.map +1 -1
  15. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.js +2 -1
  16. package/dist/packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.js +1 -1
  17. package/dist/packages/core/src/infrastructure/services/attachment-storage.service.js +3 -3
  18. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts +1 -1
  19. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -1
  20. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +8 -7
  21. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
  22. package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +17 -4
  23. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js +1 -1
  24. package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.d.ts.map +1 -1
  25. package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.js +6 -8
  26. package/dist/packages/core/src/infrastructure/services/process/tree-kill.d.ts +12 -0
  27. package/dist/packages/core/src/infrastructure/services/process/tree-kill.d.ts.map +1 -0
  28. package/dist/packages/core/src/infrastructure/services/process/tree-kill.js +11 -0
  29. package/dist/packages/core/src/infrastructure/services/tool-installer/binary-exists.d.ts +25 -0
  30. package/dist/packages/core/src/infrastructure/services/tool-installer/binary-exists.d.ts.map +1 -0
  31. package/dist/packages/core/src/infrastructure/services/tool-installer/binary-exists.js +32 -0
  32. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
  33. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +4 -27
  34. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/alacritty.json +3 -2
  35. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/claude-code.json +3 -2
  36. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor-cli.json +3 -2
  37. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor.json +2 -1
  38. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/gh.json +2 -1
  39. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/git.json +2 -1
  40. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/vscode.json +2 -1
  41. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/warp.json +3 -2
  42. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/windsurf.json +3 -2
  43. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/zed.json +3 -2
  44. package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts.map +1 -1
  45. package/dist/src/presentation/cli/commands/daemon/start-daemon.js +1 -0
  46. package/dist/src/presentation/cli/commands/daemon/stop-daemon.d.ts.map +1 -1
  47. package/dist/src/presentation/cli/commands/daemon/stop-daemon.js +5 -4
  48. package/dist/src/presentation/cli/commands/upgrade.command.d.ts.map +1 -1
  49. package/dist/src/presentation/cli/commands/upgrade.command.js +4 -0
  50. package/dist/src/presentation/web/app/actions/deploy-repository.d.ts.map +1 -1
  51. package/dist/src/presentation/web/app/actions/deploy-repository.js +2 -1
  52. package/dist/src/presentation/web/app/actions/open-folder.d.ts.map +1 -1
  53. package/dist/src/presentation/web/app/actions/open-folder.js +4 -2
  54. package/dist/src/presentation/web/app/actions/open-ide.d.ts.map +1 -1
  55. package/dist/src/presentation/web/app/actions/open-ide.js +2 -1
  56. package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -1
  57. package/dist/src/presentation/web/app/actions/open-shell.js +4 -2
  58. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  59. package/dist/src/presentation/web/app/build-graph-nodes.js +8 -5
  60. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.js +3 -2
  61. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts +4 -0
  62. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.d.ts.map +1 -1
  63. package/dist/src/presentation/web/components/common/feature-drawer-tabs/overview-tab.stories.js +30 -0
  64. package/dist/src/presentation/web/components/common/merge-review/diff-view.js +1 -1
  65. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
  66. package/dist/src/presentation/web/lib/derive-graph.js +4 -2
  67. package/dist/tsconfig.build.tsbuildinfo +1 -1
  68. package/package.json +10 -6
  69. package/web/.next/BUILD_ID +1 -1
  70. package/web/.next/build-manifest.json +2 -2
  71. package/web/.next/fallback-build-manifest.json +2 -2
  72. package/web/.next/prerender-manifest.json +3 -3
  73. package/web/.next/required-server-files.js +3 -3
  74. package/web/.next/required-server-files.json +3 -3
  75. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
  76. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  77. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  78. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +25 -25
  79. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  80. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  81. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +25 -25
  82. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  83. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  85. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  86. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  87. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +20 -20
  88. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  89. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  90. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +25 -25
  91. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  92. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  93. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +25 -25
  94. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  95. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  96. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +18 -18
  97. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  98. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  99. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  100. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  101. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  102. package/web/.next/server/app/_global-error.html +2 -2
  103. package/web/.next/server/app/_global-error.rsc +1 -1
  104. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  105. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  106. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  107. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  108. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  109. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  110. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  111. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  112. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  113. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  114. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  115. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  117. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  118. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  119. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  120. package/web/.next/server/chunks/[root-of-the-server]__f47bb8a5._.js +1 -1
  121. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  122. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js +1 -1
  124. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js +1 -1
  126. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  129. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +1 -1
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  132. package/web/.next/server/chunks/ssr/[root-of-the-server]__51fc98b0._.js +1 -1
  133. package/web/.next/server/chunks/ssr/[root-of-the-server]__51fc98b0._.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/[root-of-the-server]__57f37786._.js +1 -1
  135. package/web/.next/server/chunks/ssr/[root-of-the-server]__57f37786._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  137. package/web/.next/server/chunks/ssr/[root-of-the-server]__708dcad1._.js +1 -1
  138. package/web/.next/server/chunks/ssr/[root-of-the-server]__708dcad1._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
  140. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  142. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/[root-of-the-server]__8e002910._.js +1 -1
  144. package/web/.next/server/chunks/ssr/[root-of-the-server]__8e002910._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  146. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  148. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  149. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  150. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  151. package/web/.next/server/chunks/ssr/{_4f3f82dc._.js → _77f506b6._.js} +2 -2
  152. package/web/.next/server/chunks/ssr/{_4f3f82dc._.js.map → _77f506b6._.js.map} +1 -1
  153. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  154. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/{_1d1282fd._.js → _b1bbe3cd._.js} +2 -2
  156. package/web/.next/server/chunks/ssr/{_1d1282fd._.js.map → _b1bbe3cd._.js.map} +1 -1
  157. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  158. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/{_e9866672._.js → _d8c97e13._.js} +2 -2
  160. package/web/.next/server/chunks/ssr/{_e9866672._.js.map → _d8c97e13._.js.map} +1 -1
  161. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  162. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  163. package/web/.next/server/chunks/ssr/src_presentation_web_7275ce5d._.js +2 -2
  164. package/web/.next/server/chunks/ssr/src_presentation_web_7275ce5d._.js.map +1 -1
  165. package/web/.next/server/chunks/ssr/src_presentation_web_758dfa10._.js +2 -2
  166. package/web/.next/server/chunks/ssr/src_presentation_web_758dfa10._.js.map +1 -1
  167. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_84803221.js +1 -1
  168. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_84803221.js.map +1 -1
  169. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  170. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  171. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  172. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  173. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js +1 -1
  174. package/web/.next/server/chunks/ssr/src_presentation_web_app_(dashboard)_get-graph-data_ts_b018483e._.js.map +1 -1
  175. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  176. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  177. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  178. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  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 +30 -30
  182. package/web/.next/static/chunks/{c98681a218c0b41f.js → 1b7418778f5a6927.js} +1 -1
  183. package/web/.next/static/chunks/{da73ca1cdae68519.js → 1b865c5b424cba9e.js} +1 -1
  184. package/web/.next/static/chunks/{0bd392ccc367ada0.js → 310da8e04e750294.js} +1 -1
  185. package/web/.next/static/chunks/{710458e76c4c1e95.js → 52a7597f541defb8.js} +2 -2
  186. package/web/.next/static/chunks/{ce6a78c88475c1a5.js → 8117620ed55b5113.js} +1 -1
  187. package/web/.next/static/chunks/{a60eb62ee95051af.js → af561a5913def091.js} +1 -1
  188. package/web/.next/static/chunks/{a464d76443ad806b.js → be7ad52cd86e161e.js} +2 -2
  189. package/web/.next/static/chunks/{0d6eb4a59f1eb888.js → cf8e107354cc0159.js} +1 -1
  190. package/web/.next/static/chunks/{e934d107a2e4edb2.js → d7c39cd622a695c4.js} +1 -1
  191. package/web/.next/static/chunks/{f2cba08b6c4ff590.js → f8608b847c7a0136.js} +1 -1
  192. /package/web/.next/static/{gbVzSaustoS6WazLhWXuK → DhQ9HMzgdS2AYNz0twCIf}/_buildManifest.js +0 -0
  193. /package/web/.next/static/{gbVzSaustoS6WazLhWXuK → DhQ9HMzgdS2AYNz0twCIf}/_clientMiddlewareManifest.json +0 -0
  194. /package/web/.next/static/{gbVzSaustoS6WazLhWXuK → DhQ9HMzgdS2AYNz0twCIf}/_ssgManifest.js +0 -0
@@ -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;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAMtE,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,wBAAwB,EAAE,MAAM,mEAAmE,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9F,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;IAE7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAlBjB,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,EAE3B,iBAAiB,EAAE,wBAAwB;IAG9D;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMtE;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwH1E;;;OAGG;IACG,kBAAkB,CACtB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC;CAoG1D"}
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;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wCAAwC,CAAC;AAMtE,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,wBAAwB,EAAE,MAAM,mEAAmE,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE9F,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;IAE7B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;gBAlBjB,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,EAE3B,iBAAiB,EAAE,wBAAwB;IAG9D;;;OAGG;IACG,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAMtE;;;;OAIG;IACG,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyH1E;;;OAGG;IACG,kBAAkB,CACtB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,kBAAkB,EACzB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC;CAoG1D"}
@@ -77,7 +77,7 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
77
77
  ? SdlcLifecycle.Implementation
78
78
  : SdlcLifecycle.Requirements;
79
79
  let shouldSpawn = true;
80
- let effectiveRepoPath = input.repositoryPath;
80
+ let effectiveRepoPath = input.repositoryPath.replace(/\\/g, '/');
81
81
  if (input.parentId) {
82
82
  const parent = await this.featureRepo.findById(input.parentId);
83
83
  if (!parent) {
@@ -106,7 +106,7 @@ let CreateFeatureUseCase = class CreateFeatureUseCase {
106
106
  }
107
107
  }
108
108
  // Resolve or create repository entity for this path
109
- const normalizedPath = effectiveRepoPath.replace(/\/+$/, '') || effectiveRepoPath;
109
+ const normalizedPath = effectiveRepoPath.replace(/\\/g, '/').replace(/\/+$/, '') || effectiveRepoPath;
110
110
  let repository = await this.repositoryRepo.findByPath(normalizedPath);
111
111
  const now = new Date();
112
112
  if (!repository) {
@@ -1 +1 @@
1
- {"version":3,"file":"add-repository.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/repositories/add-repository.use-case.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oEAAoE,CAAC;AAEhH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAUD,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,qBAAqB;IAGlD,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC;CA8B9D"}
1
+ {"version":3,"file":"add-repository.use-case.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/application/use-cases/repositories/add-repository.use-case.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oEAAoE,CAAC;AAEhH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAcD,qBACa,oBAAoB;IAG7B,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,qBAAqB;IAGlD,OAAO,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC;CA8B9D"}
@@ -19,11 +19,15 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
19
19
  import { injectable, inject } from 'tsyringe';
20
20
  import { randomUUID } from 'node:crypto';
21
21
  /**
22
- * Normalizes a path by removing trailing slashes.
22
+ * Normalizes a path: backslashes forward slashes, trailing slashes removed.
23
+ * On Windows, the folder picker returns backslashes (C:\Users\...) while
24
+ * the CLI uses forward slashes (C:/Users/...). Normalize to forward slashes
25
+ * so the same directory is never stored under two different path strings.
23
26
  */
24
27
  function normalizePath(p) {
28
+ const forwardSlash = p.replace(/\\/g, '/');
25
29
  // Remove trailing slashes but keep root "/"
26
- return p.length > 1 ? p.replace(/\/+$/, '') : p;
30
+ return forwardSlash.length > 1 ? forwardSlash.replace(/\/+$/, '') : forwardSlash;
27
31
  }
28
32
  let AddRepositoryUseCase = class AddRepositoryUseCase {
29
33
  repositoryRepo;
@@ -71,8 +71,8 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
71
71
  return fromDatabase(rows[0]);
72
72
  }
73
73
  async findBySlug(slug, repositoryPath) {
74
- const stmt = this.db.prepare('SELECT * FROM features WHERE slug = ? AND repository_path = ? AND deleted_at IS NULL');
75
- const row = stmt.get(slug, repositoryPath);
74
+ const stmt = this.db.prepare("SELECT * FROM features WHERE slug = ? AND REPLACE(repository_path, '\\', '/') = ? AND deleted_at IS NULL");
75
+ const row = stmt.get(slug, repositoryPath.replace(/\\/g, '/'));
76
76
  if (!row) {
77
77
  return null;
78
78
  }
@@ -85,8 +85,8 @@ let SQLiteFeatureRepository = class SQLiteFeatureRepository {
85
85
  conditions.push('deleted_at IS NULL');
86
86
  }
87
87
  if (filters?.repositoryPath) {
88
- conditions.push('repository_path = ?');
89
- params.push(filters.repositoryPath);
88
+ conditions.push("REPLACE(repository_path, '\\', '/') = ?");
89
+ params.push(filters.repositoryPath.replace(/\\/g, '/'));
90
90
  }
91
91
  if (filters?.lifecycle) {
92
92
  conditions.push('lifecycle = ?');
@@ -36,8 +36,8 @@ let SQLiteRepositoryRepository = class SQLiteRepositoryRepository {
36
36
  return row ? fromDatabase(row) : null;
37
37
  }
38
38
  async findByPath(path) {
39
- const stmt = this.db.prepare('SELECT * FROM repositories WHERE path = ? AND deleted_at IS NULL');
40
- const row = stmt.get(path);
39
+ const stmt = this.db.prepare("SELECT * FROM repositories WHERE REPLACE(path, '\\', '/') = ? AND deleted_at IS NULL");
40
+ const row = stmt.get(path.replace(/\\/g, '/'));
41
41
  return row ? fromDatabase(row) : null;
42
42
  }
43
43
  async list() {
@@ -50,8 +50,8 @@ let SQLiteRepositoryRepository = class SQLiteRepositoryRepository {
50
50
  stmt.run(id);
51
51
  }
52
52
  async findByPathIncludingDeleted(path) {
53
- const stmt = this.db.prepare('SELECT * FROM repositories WHERE path = ?');
54
- const row = stmt.get(path);
53
+ const stmt = this.db.prepare("SELECT * FROM repositories WHERE REPLACE(path, '\\', '/') = ?");
54
+ const row = stmt.get(path.replace(/\\/g, '/'));
55
55
  return row ? fromDatabase(row) : null;
56
56
  }
57
57
  async softDelete(id) {
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAYjD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,cAAc;IAMlD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA8B;IAE3D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAML,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmHtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA+F3C;;;OAGG;IACH,OAAO,CAAC,cAAc;IAmCtB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI/C,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,eAAe;CAkExB"}
1
+ {"version":3,"file":"claude-code-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAYjD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,cAAc;IAMlD,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAA8B;IAE3D,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAML,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAmHtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA+F3C;;;OAGG;IACH,OAAO,CAAC,cAAc;IAmCtB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAI/C,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,eAAe;CAkExB"}
@@ -291,6 +291,15 @@ export class ClaudeCodeExecutorService {
291
291
  const spawnOpts = {};
292
292
  if (options?.cwd)
293
293
  spawnOpts.cwd = options.cwd;
294
+ // Explicitly pipe stdio so streams are available even when parent disconnects
295
+ spawnOpts.stdio = ['pipe', 'pipe', 'pipe'];
296
+ // On Windows: windowsHide=true to prevent blank console windows.
297
+ // Do NOT use shell=true — it causes DEP0190 argument escaping issues
298
+ // and mangles prompts with special characters. The claude CLI is a
299
+ // native .exe, so spawn() finds it on PATH without shell.
300
+ if (process.platform === 'win32') {
301
+ spawnOpts.windowsHide = true;
302
+ }
294
303
  // Strip CLAUDECODE env var to prevent "nested session" error when shep
295
304
  // is invoked from within a Claude Code session. The claude CLI checks for
296
305
  // this variable and refuses to start if it's set.
@@ -1 +1 @@
1
- {"version":3,"file":"dev-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AAmIpF,qBAAa,uBAAwB,YAAW,cAAc;IAC5D,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;;IAM3B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAOvF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAK3C,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;IAIhD,OAAO,CAAC,QAAQ;CAmEjB"}
1
+ {"version":3,"file":"dev-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzF,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,4EAA4E,CAAC;AAwIpF,qBAAa,uBAAwB,YAAW,cAAc;IAC5D,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;;IAM3B,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAOvF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IAK3C,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO;IAIhD,OAAO,CAAC,QAAQ;CAmEjB"}
@@ -101,20 +101,22 @@ const CI_FIX_RESULT = 'Fixed CI failure: corrected import path. All checks now p
101
101
  * plan.prompt.ts:199.
102
102
  */
103
103
  function extractSpecDir(prompt) {
104
+ // Match both Unix absolute paths (/...) and Windows absolute paths (C:\...)
105
+ const ABS_PATH = String.raw `(?:\/|[A-Za-z]:[/\\])[^\s\n]+`;
104
106
  // Analyze ("Write your analysis to:"), requirements ("Update the file at:"),
105
107
  // research ("Write your research to:")
106
- const fileMatch = prompt.match(/(?:Write your \w+ to|Update the file at):\s+(\/[^\s\n]+)/);
108
+ const fileMatch = prompt.match(new RegExp(`(?:Write your \\w+ to|Update the file at):\\s+(${ABS_PATH})`));
107
109
  if (fileMatch)
108
110
  return path.dirname(fileMatch[1]);
109
111
  // Plan: "Write to BOTH /path/plan.yaml AND /path/tasks.yaml"
110
- const planMatch = prompt.match(/Write to BOTH\s+(\/[^\s\n]+)\/plan\.yaml/);
112
+ const planMatch = prompt.match(new RegExp(`Write to BOTH\\s+(${ABS_PATH})[/\\\\]plan\\.yaml`));
111
113
  if (planMatch)
112
114
  return planMatch[1];
113
115
  return null;
114
116
  }
115
117
  /** Validate extracted specDir: must be absolute, no ".." traversal. */
116
118
  function validateSpecDir(specDir) {
117
- if (!specDir.startsWith('/'))
119
+ if (!path.isAbsolute(specDir))
118
120
  throw new Error(`DevAgentExecutorService: invalid specDir (not absolute): ${specDir}`);
119
121
  if (specDir.includes('..'))
120
122
  throw new Error(`DevAgentExecutorService: invalid specDir (contains ".."): ${specDir}`);
@@ -1 +1 @@
1
- {"version":3,"file":"evidence-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CA6LR"}
1
+ {"version":3,"file":"evidence-prompts.d.ts","sourceRoot":"","sources":["../../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,MAAM,WAAW,qBAAqB;IACpC,kEAAkE;IAClE,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,iBAAiB,EACxB,OAAO,GAAE,qBAAiD,GACzD,MAAM,CA8LR"}
@@ -20,7 +20,7 @@ export function buildEvidencePrompt(state, options = { commitEvidence: false })
20
20
  // Worktree path is: ~/.shep/repos/<hash>/wt/<slug>
21
21
  // Evidence path is: ~/.shep/repos/<hash>/evidence/<featureId>/
22
22
  const repoHashDir = dirname(dirname(cwd)); // go up from wt/<slug>
23
- const shepEvidenceDir = join(repoHashDir, 'evidence', state.featureId);
23
+ const shepEvidenceDir = join(repoHashDir, 'evidence', state.featureId).replaceAll('\\', '/');
24
24
  const specSection = specContent
25
25
  ? `## Feature Specification (spec.yaml)
26
26
 
@@ -41,9 +41,10 @@ ${tasksContent}
41
41
  `
42
42
  : '';
43
43
  // Relative spec dir path from worktree root (e.g., "specs/057-sidenav-feature-toggle")
44
- const relativeSpecDir = relative(cwd, state.specDir);
44
+ // Normalize to forward slashes so prompts always use POSIX paths (even on Windows)
45
+ const relativeSpecDir = relative(cwd, state.specDir).replaceAll('\\', '/');
45
46
  const specEvidenceRelPath = `${relativeSpecDir}/evidence`;
46
- const specEvidenceAbsPath = join(state.specDir, 'evidence');
47
+ const specEvidenceAbsPath = join(state.specDir, 'evidence').replaceAll('\\', '/');
47
48
  const storageSection = options.commitEvidence
48
49
  ? `## Evidence Storage
49
50
 
@@ -234,9 +234,9 @@ export function buildMergeSquashPrompt(state, branch, baseBranch, hasRemote = fa
234
234
 
235
235
  ## Instructions
236
236
 
237
- 1. Merge the PR using squash merge: \`gh pr merge ${state.prNumber} --squash --delete-branch\`
238
- 2. If merge conflicts are encountered, resolve them and retry
239
- 3. If the merge fails, report the error clearly
237
+ 1. Merge the PR using squash merge with auto-merge: \`gh pr merge ${state.prNumber} --squash --delete-branch --auto\`
238
+ - The --auto flag queues the merge to execute automatically once all branch protection requirements (CI checks, reviews, etc.) are satisfied
239
+ 2. If the merge command fails, report the error clearly
240
240
 
241
241
  ## Constraints
242
242
 
@@ -1 +1 @@
1
- {"version":3,"file":"repair.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAGpG;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CA0BR;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,QAAQ,EAAE,cAAc,GACvB,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAuCnE"}
1
+ {"version":3,"file":"repair.node.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+DAA+D,CAAC;AAGpG;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,EAAE,MAAM,GACd,MAAM,CA2BR;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,QAAQ,EAAE,cAAc,GACvB,CAAC,KAAK,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAuCnE"}
@@ -13,7 +13,8 @@ import { readSpecFile, createNodeLogger } from './node-helpers.js';
13
13
  */
14
14
  export function buildRepairPrompt(filename, content, errors, specDir) {
15
15
  const filenames = Array.isArray(filename) ? filename : [filename];
16
- const filePaths = filenames.map((f) => join(specDir, f));
16
+ // Normalize to forward slashes so prompts always use POSIX paths (even on Windows)
17
+ const filePaths = filenames.map((f) => join(specDir, f).replaceAll('\\', '/'));
17
18
  return [
18
19
  '## YAML Repair Task',
19
20
  '',
@@ -311,7 +311,7 @@ let ClaudeCodeSessionRepository = class ClaudeCodeSessionRepository {
311
311
  const home = os.homedir();
312
312
  if (filePath === home)
313
313
  return '~';
314
- if (filePath.startsWith(`${home}/`)) {
314
+ if (filePath.startsWith(`${home}${path.sep}`)) {
315
315
  return `~${filePath.slice(home.length)}`;
316
316
  }
317
317
  return filePath;
@@ -33,7 +33,7 @@ let AttachmentStorageService = class AttachmentStorageService {
33
33
  name: sanitized,
34
34
  size: BigInt(buffer.length),
35
35
  mimeType,
36
- path: filePath,
36
+ path: filePath.replace(/\\/g, '/'),
37
37
  createdAt: new Date(),
38
38
  sha256: hash,
39
39
  };
@@ -68,7 +68,7 @@ let AttachmentStorageService = class AttachmentStorageService {
68
68
  name: stored.name,
69
69
  size: stored.size,
70
70
  mimeType: stored.mimeType,
71
- path: newPath,
71
+ path: newPath.replace(/\\/g, '/'),
72
72
  createdAt: stored.createdAt,
73
73
  });
74
74
  }
@@ -84,7 +84,7 @@ let AttachmentStorageService = class AttachmentStorageService {
84
84
  name: file,
85
85
  size: BigInt(0),
86
86
  mimeType: 'application/octet-stream',
87
- path: filePath,
87
+ path: filePath.replace(/\\/g, '/'),
88
88
  createdAt: new Date(),
89
89
  });
90
90
  }
@@ -51,7 +51,7 @@ export declare class DeploymentService implements IDeploymentService {
51
51
  */
52
52
  off(event: 'log', handler: (entry: LogEntry) => void): void;
53
53
  /**
54
- * Send SIGKILL to a process group.
54
+ * Send SIGKILL to a process tree.
55
55
  */
56
56
  private killProcess;
57
57
  /**
@@ -1 +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;AAG9D,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACT,MAAM,qEAAqE,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAoBzD,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;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAElC,IAAI,GAAE,OAAO,CAAC,qBAAqB,CAAM;IAIrD;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IA+EjD;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAYpD;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyC3C;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,IAAI;IAM5C;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAI1D;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAI3D;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA+D5B;;OAEG;YACW,aAAa;IAW3B;;OAEG;IACH,OAAO,CAAC,WAAW;CASpB"}
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;AAI9D,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EACT,MAAM,qEAAqE,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAoBzD,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;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;gBAElC,IAAI,GAAE,OAAO,CAAC,qBAAqB,CAAM;IAIrD;;;OAGG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IA+EjD;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;IAYpD;;OAEG;IACG,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyC3C;;OAEG;IACH,OAAO,IAAI,IAAI;IAOf;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,IAAI;IAM5C;;OAEG;IACH,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAI1D;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,IAAI;IAI3D;;OAEG;IACH,OAAO,CAAC,WAAW;IAQnB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IA+D5B;;OAEG;YACW,aAAa;IAW3B;;OAEG;IACH,OAAO,CAAC,WAAW;CASpB"}
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { spawn } from 'node:child_process';
10
10
  import { EventEmitter } from 'node:events';
11
+ import treeKill from 'tree-kill';
11
12
  import { DeploymentState } from '../../../domain/generated/output.js';
12
13
  import { detectDevScript } from './detect-dev-script.js';
13
14
  import { createDeploymentLogger } from './deployment-logger.js';
@@ -19,7 +20,7 @@ const MAX_WAIT_MS = 5000;
19
20
  const defaultDeps = {
20
21
  spawn,
21
22
  detectDevScript,
22
- kill: (pid, signal) => process.kill(pid, signal),
23
+ kill: (pid, signal) => treeKill(pid, signal),
23
24
  isAlive: (pid) => {
24
25
  try {
25
26
  process.kill(pid, 0);
@@ -123,11 +124,11 @@ export class DeploymentService {
123
124
  log.info(`stop("${targetId}") — no deployment found, nothing to stop`);
124
125
  return;
125
126
  }
126
- log.info(`stop("${targetId}") — sending SIGTERM to process group (pid=${entry.pid})`);
127
+ log.info(`stop("${targetId}") — sending SIGTERM to process tree (pid=${entry.pid})`);
127
128
  entry.logs.clear();
128
- // Send SIGTERM to process group
129
+ // Send SIGTERM to process tree (tree-kill handles child processes)
129
130
  try {
130
- this.deps.kill(-entry.pid, 'SIGTERM');
131
+ this.deps.kill(entry.pid, 'SIGTERM');
131
132
  }
132
133
  catch {
133
134
  log.info(`stop("${targetId}") — process already dead on SIGTERM`);
@@ -140,7 +141,7 @@ export class DeploymentService {
140
141
  log.warn(`stop("${targetId}") — process did not exit after ${MAX_WAIT_MS}ms, escalating to SIGKILL`);
141
142
  // Escalate to SIGKILL
142
143
  try {
143
- this.deps.kill(-entry.pid, 'SIGKILL');
144
+ this.deps.kill(entry.pid, 'SIGKILL');
144
145
  }
145
146
  catch {
146
147
  // Process may have exited between check and kill
@@ -183,11 +184,11 @@ export class DeploymentService {
183
184
  this.emitter.off(event, handler);
184
185
  }
185
186
  /**
186
- * Send SIGKILL to a process group.
187
+ * Send SIGKILL to a process tree.
187
188
  */
188
189
  killProcess(entry) {
189
190
  try {
190
- this.deps.kill(-entry.pid, 'SIGKILL');
191
+ this.deps.kill(entry.pid, 'SIGKILL');
191
192
  }
192
193
  catch {
193
194
  // Process may already be dead
@@ -1 +1 @@
1
- {"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAOlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAqBlB,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5D,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAU9B"}
1
+ {"version":3,"file":"worktree.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/git/worktree.service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AASH,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACb,MAAM,0EAA0E,CAAC;AAOlF;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,MAAM,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEjD,qBACa,eAAgB,YAAW,gBAAgB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,YAAY;IAErE,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,CAAC;IAuBlB,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAW5D,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQtC,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAO/C,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK1D,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWhE,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWtE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqC1D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMzD,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,qBAAqB;CAsB9B"}
@@ -18,7 +18,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
18
18
  return function (target, key) { decorator(target, key, paramIndex); }
19
19
  };
20
20
  import { createHash } from 'node:crypto';
21
- import { mkdirSync } from 'node:fs';
21
+ import { mkdirSync, realpathSync } from 'node:fs';
22
22
  import path from 'node:path';
23
23
  import { injectable, inject } from 'tsyringe';
24
24
  const GIT_AUTO_INIT_USER = 'shep-ai[bot]';
@@ -40,9 +40,10 @@ let WorktreeService = class WorktreeService {
40
40
  catch (error) {
41
41
  throw this.parseGitError(error);
42
42
  }
43
- // Get info about the created worktree
43
+ // Get info about the created worktree — match by branch (reliable) then path
44
44
  const worktrees = await this.list(repoPath);
45
- const created = worktrees.find((w) => this.arePathsEquivalent(w.path, worktreePath));
45
+ const created = worktrees.find((w) => w.branch === branch) ??
46
+ worktrees.find((w) => this.arePathsEquivalent(w.path, worktreePath));
46
47
  if (!created) {
47
48
  throw new WorktreeError('Worktree created but not found in list', WorktreeErrorCode.GIT_ERROR);
48
49
  }
@@ -136,7 +137,7 @@ let WorktreeService = class WorktreeService {
136
137
  getWorktreePath(repoPath, branch) {
137
138
  const repoHash = createHash('sha256').update(repoPath).digest('hex').slice(0, 16);
138
139
  const slug = branch.replace(/\//g, '-');
139
- return path.join(getShepHomeDir(), 'repos', repoHash, 'wt', slug);
140
+ return path.join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\/g, '/');
140
141
  }
141
142
  parseWorktreeOutput(output) {
142
143
  if (!output.trim())
@@ -178,6 +179,18 @@ let WorktreeService = class WorktreeService {
178
179
  return this.normalizeWorktreePath(a) === this.normalizeWorktreePath(b);
179
180
  }
180
181
  normalizeWorktreePath(input) {
182
+ // On Windows, git outputs forward slashes but path.normalize uses backslashes.
183
+ // Normalize to forward slashes before comparing, case-insensitive.
184
+ if (process.platform === 'win32') {
185
+ let normalized = path.normalize(input).replace(/\\/g, '/').replace(/\/+$/, '');
186
+ try {
187
+ normalized = realpathSync(normalized).replace(/\\/g, '/');
188
+ }
189
+ catch {
190
+ // Path may not exist yet — use as-is
191
+ }
192
+ return normalized.toLowerCase();
193
+ }
181
194
  const normalized = path.normalize(input).replace(/\/+$/, '');
182
195
  // On macOS, git can report /private/var/... while callers use /var/...
183
196
  if (process.platform === 'darwin' && normalized.startsWith('/private/var/')) {
@@ -19,5 +19,5 @@ import { getShepHomeDir } from '../filesystem/shep-directory.service.js';
19
19
  export function computeWorktreePath(repoPath, branch) {
20
20
  const repoHash = createHash('sha256').update(repoPath).digest('hex').slice(0, 16);
21
21
  const slug = branch.replace(/\//g, '-');
22
- return join(getShepHomeDir(), 'repos', repoHash, 'wt', slug);
22
+ return join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\/g, '/');
23
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"json-driven-ide-launcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EAChB,MAAM,8EAA8E,CAAC;AAetF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAGnF;AAED,qBACa,4BAA6B,YAAW,mBAAmB;IACtE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;;IAiB1C,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,eAAe,CAAC;IA8D3B,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAWtD"}
1
+ {"version":3,"file":"json-driven-ide-launcher.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,OAAO,KAAK,EACV,mBAAmB,EACnB,eAAe,EAChB,MAAM,8EAA8E,CAAC;AAetF;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAGnF;AAED,qBACa,4BAA6B,YAAW,mBAAmB;IACtE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;;IAiB1C,MAAM,CACV,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAC/B,OAAO,CAAC,eAAe,CAAC;IA8DrB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQ5D"}
@@ -16,8 +16,9 @@ var __metadata = (this && this.__metadata) || function (k, v) {
16
16
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
17
17
  };
18
18
  import { injectable } from 'tsyringe';
19
- import { spawn, execFile } from 'node:child_process';
19
+ import { spawn } from 'node:child_process';
20
20
  import { platform } from 'node:os';
21
+ import { checkBinaryExists } from '../tool-installer/binary-exists.js';
21
22
  import { TOOL_METADATA } from '../tool-installer/tool-metadata.js';
22
23
  /**
23
24
  * Resolve a platform-specific value from a string or per-platform record.
@@ -101,16 +102,13 @@ let JsonDrivenIdeLauncherService = class JsonDrivenIdeLauncherService {
101
102
  };
102
103
  }
103
104
  }
104
- checkAvailability(editorId) {
105
+ async checkAvailability(editorId) {
105
106
  const entry = this.editors.get(editorId);
106
107
  if (!entry)
107
- return Promise.resolve(false);
108
+ return false;
108
109
  const binary = resolvePlatformValue(entry.binary);
109
- return new Promise((resolve) => {
110
- execFile('which', [binary], (err) => {
111
- resolve(!err);
112
- });
113
- });
110
+ const result = await checkBinaryExists(binary);
111
+ return result.found;
114
112
  }
115
113
  };
116
114
  JsonDrivenIdeLauncherService = __decorate([
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Cross-platform process tree termination.
3
+ *
4
+ * Re-exports the npm `tree-kill` package for use by the presentation layer,
5
+ * which cannot resolve packages installed in packages/core/node_modules
6
+ * directly (pnpm workspace isolation).
7
+ *
8
+ * Uses taskkill /T /F on Windows, kill/ps/pgrep on Unix.
9
+ */
10
+ import treeKill from 'tree-kill';
11
+ export { treeKill };
12
+ //# sourceMappingURL=tree-kill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-kill.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/process/tree-kill.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,QAAQ,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Cross-platform process tree termination.
3
+ *
4
+ * Re-exports the npm `tree-kill` package for use by the presentation layer,
5
+ * which cannot resolve packages installed in packages/core/node_modules
6
+ * directly (pnpm workspace isolation).
7
+ *
8
+ * Uses taskkill /T /F on Windows, kill/ps/pgrep on Unix.
9
+ */
10
+ import treeKill from 'tree-kill';
11
+ export { treeKill };
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Cross-platform binary existence check.
3
+ *
4
+ * Wraps the npm `which` package to provide a single cross-platform API
5
+ * for checking if a binary exists in the system PATH. Works on Unix
6
+ * (which) and Windows (where.exe + PATHEXT resolution) without platform
7
+ * branching.
8
+ */
9
+ /**
10
+ * Check if a binary exists in the system PATH.
11
+ *
12
+ * Uses the npm `which` package which handles Windows PATHEXT resolution
13
+ * internally (.exe, .cmd, .bat extensions).
14
+ *
15
+ * Returns:
16
+ * - `{ found: true }` when the binary is on PATH
17
+ * - `{ found: false, notInPath: true }` when the binary is not on PATH
18
+ * - `{ found: false, error }` for genuine errors (e.g. permission denied)
19
+ */
20
+ export declare const checkBinaryExists: (binary: string) => Promise<{
21
+ found: boolean;
22
+ notInPath?: boolean;
23
+ error?: Error;
24
+ }>;
25
+ //# sourceMappingURL=binary-exists.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binary-exists.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/binary-exists.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,iBAAiB,GAC5B,QAAQ,MAAM,KACb,OAAO,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAUhE,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Cross-platform binary existence check.
3
+ *
4
+ * Wraps the npm `which` package to provide a single cross-platform API
5
+ * for checking if a binary exists in the system PATH. Works on Unix
6
+ * (which) and Windows (where.exe + PATHEXT resolution) without platform
7
+ * branching.
8
+ */
9
+ import which from 'which';
10
+ /**
11
+ * Check if a binary exists in the system PATH.
12
+ *
13
+ * Uses the npm `which` package which handles Windows PATHEXT resolution
14
+ * internally (.exe, .cmd, .bat extensions).
15
+ *
16
+ * Returns:
17
+ * - `{ found: true }` when the binary is on PATH
18
+ * - `{ found: false, notInPath: true }` when the binary is not on PATH
19
+ * - `{ found: false, error }` for genuine errors (e.g. permission denied)
20
+ */
21
+ export const checkBinaryExists = async (binary) => {
22
+ try {
23
+ const result = await which(binary, { nothrow: true });
24
+ if (result !== null) {
25
+ return { found: true };
26
+ }
27
+ return { found: false, notInPath: true };
28
+ }
29
+ catch (error) {
30
+ return { found: false, error: error instanceof Error ? error : new Error(String(error)) };
31
+ }
32
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"tool-installer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-installer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sEAAsE,CAAC;AAClH,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,qCAAqC,CAAC;AAsD7C,qBACa,wBAAyB,YAAW,qBAAqB;IACpE;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoC1E;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAqB9D;;;OAGG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,sBAAsB,CAAC;IAgFlC;;OAEG;IACH,OAAO,CAAC,6BAA6B;CA4BtC"}
1
+ {"version":3,"file":"tool-installer.service.d.ts","sourceRoot":"","sources":["../../../../../../../packages/core/src/infrastructure/services/tool-installer/tool-installer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,sEAAsE,CAAC;AAClH,OAAO,KAAK,EACV,sBAAsB,EACtB,kBAAkB,EAEnB,MAAM,qCAAqC,CAAC;AA2B7C,qBACa,wBAAyB,YAAW,qBAAqB;IACpE;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAoC1E;;;OAGG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI;IAqB9D;;;OAGG;IACG,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAChC,OAAO,CAAC,sBAAsB,CAAC;IAgFlC;;OAEG;IACH,OAAO,CAAC,6BAA6B;CA4BtC"}
@@ -18,10 +18,11 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
18
18
  return c > 3 && r && Object.defineProperty(target, key, r), r;
19
19
  };
20
20
  import { injectable } from 'tsyringe';
21
- import { exec, execFile, spawn } from 'node:child_process';
21
+ import { exec, spawn } from 'node:child_process';
22
22
  import { platform } from 'node:os';
23
23
  import { createAvailableStatus, createMissingStatus, createErrorStatus, } from '../../../domain/value-objects/tool-installation-status.js';
24
24
  import { TOOL_METADATA } from './tool-metadata.js';
25
+ import { checkBinaryExists } from './binary-exists.js';
25
26
  /**
26
27
  * Resolve binary name for the current platform.
27
28
  * Supports both simple string binaries and per-platform maps.
@@ -31,30 +32,6 @@ function resolveBinary(metadata) {
31
32
  return metadata.binary;
32
33
  return metadata.binary[platform()] ?? Object.values(metadata.binary)[0];
33
34
  }
34
- /**
35
- * Check if a binary exists in the system PATH using 'which' command.
36
- *
37
- * `which` exits with code 1 when the binary is simply not in PATH.
38
- * Node's execFile wraps that as an Error, but it's a normal "not found"
39
- * result. Only truly unexpected failures (ENOENT for `which` itself,
40
- * EACCES, signals, etc.) are surfaced via the `error` field.
41
- */
42
- const checkBinaryExists = (binary) => {
43
- return new Promise((resolve) => {
44
- execFile('which', [binary], (err) => {
45
- if (!err)
46
- return resolve({ found: true });
47
- // execFile errors from a non-zero exit code have a numeric `code` property.
48
- // That's the normal "binary not found in PATH" case.
49
- const code = err.code;
50
- if (code === undefined || typeof code === 'number') {
51
- return resolve({ found: false, notInPath: true });
52
- }
53
- // Anything else (ENOENT for `which` itself, EACCES, etc.) is a real error.
54
- resolve({ found: false, error: err });
55
- });
56
- });
57
- };
58
35
  /**
59
36
  * Run a shell command and resolve true when it exits 0, false otherwise.
60
37
  * Used as a fallback for GUI apps whose binary isn't in PATH (e.g. Warp, iTerm2).
@@ -130,8 +107,8 @@ let ToolInstallerServiceImpl = class ToolInstallerServiceImpl {
130
107
  }
131
108
  return new Promise((resolve) => {
132
109
  let output = '';
133
- const child = spawn('sh', ['-c', installCommand.command], {
134
- shell: false,
110
+ const child = spawn(installCommand.command, [], {
111
+ shell: true,
135
112
  stdio: ['pipe', 'pipe', 'pipe'],
136
113
  env: {
137
114
  ...process.env,
@@ -5,13 +5,14 @@
5
5
  "tags": ["terminal"],
6
6
  "author": "Alacritty Contributors",
7
7
  "website": "https://alacritty.org",
8
- "platforms": ["linux", "darwin"],
8
+ "platforms": ["linux", "darwin", "win32"],
9
9
  "iconUrl": "https://cdn.simpleicons.org/alacritty",
10
10
  "binary": "alacritty",
11
11
  "packageManager": "brew",
12
12
  "commands": {
13
13
  "darwin": "brew install --cask alacritty",
14
- "linux": "sudo apt-get update && sudo apt-get install -y alacritty"
14
+ "linux": "sudo apt-get update && sudo apt-get install -y alacritty",
15
+ "win32": "winget install --id Alacritty.Alacritty -e --source winget"
15
16
  },
16
17
  "timeout": 300000,
17
18
  "documentationUrl": "https://alacritty.org/",