@shepai/cli 1.104.1-pr299.a38e55b → 1.105.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 (200) hide show
  1. package/apis/json-schema/FeatureFlags.yaml +1 -1
  2. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.d.ts.map +1 -1
  3. package/dist/packages/core/src/application/use-cases/features/create/create-feature.use-case.js +2 -2
  4. package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.d.ts.map +1 -1
  5. package/dist/packages/core/src/application/use-cases/repositories/add-repository.use-case.js +2 -6
  6. package/dist/packages/core/src/domain/factories/settings-defaults.factory.js +1 -1
  7. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.d.ts.map +1 -1
  8. package/dist/packages/core/src/infrastructure/persistence/sqlite/migrations.js +6 -1
  9. package/dist/packages/core/src/infrastructure/repositories/sqlite-feature.repository.js +4 -4
  10. package/dist/packages/core/src/infrastructure/repositories/sqlite-repository.repository.js +4 -4
  11. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
  12. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +0 -9
  13. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.d.ts.map +1 -1
  14. package/dist/packages/core/src/infrastructure/services/agents/common/executors/dev-executor.service.js +3 -5
  15. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.d.ts.map +1 -1
  16. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/prompts/evidence-prompts.js +3 -4
  17. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.d.ts.map +1 -1
  18. package/dist/packages/core/src/infrastructure/services/agents/feature-agent/nodes/repair.node.js +1 -2
  19. package/dist/packages/core/src/infrastructure/services/agents/sessions/claude-code-session.repository.js +1 -1
  20. package/dist/packages/core/src/infrastructure/services/attachment-storage.service.js +3 -3
  21. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts +1 -1
  22. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.d.ts.map +1 -1
  23. package/dist/packages/core/src/infrastructure/services/deployment/deployment.service.js +7 -8
  24. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
  25. package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +4 -17
  26. package/dist/packages/core/src/infrastructure/services/ide-launchers/compute-worktree-path.js +1 -1
  27. package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.d.ts.map +1 -1
  28. package/dist/packages/core/src/infrastructure/services/ide-launchers/json-driven-ide-launcher.service.js +8 -6
  29. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.d.ts.map +1 -1
  30. package/dist/packages/core/src/infrastructure/services/tool-installer/tool-installer.service.js +27 -4
  31. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/alacritty.json +2 -3
  32. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/claude-code.json +2 -3
  33. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor-cli.json +2 -3
  34. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/cursor.json +1 -2
  35. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/gh.json +1 -2
  36. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/git.json +1 -2
  37. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/vscode.json +1 -2
  38. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/warp.json +2 -3
  39. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/windsurf.json +2 -3
  40. package/dist/packages/core/src/infrastructure/services/tool-installer/tools/zed.json +2 -3
  41. package/dist/src/presentation/cli/commands/daemon/start-daemon.d.ts.map +1 -1
  42. package/dist/src/presentation/cli/commands/daemon/start-daemon.js +0 -1
  43. package/dist/src/presentation/cli/commands/daemon/stop-daemon.d.ts.map +1 -1
  44. package/dist/src/presentation/cli/commands/daemon/stop-daemon.js +4 -5
  45. package/dist/src/presentation/cli/commands/upgrade.command.d.ts.map +1 -1
  46. package/dist/src/presentation/cli/commands/upgrade.command.js +0 -4
  47. package/dist/src/presentation/web/app/actions/deploy-repository.d.ts.map +1 -1
  48. package/dist/src/presentation/web/app/actions/deploy-repository.js +1 -2
  49. package/dist/src/presentation/web/app/actions/open-folder.d.ts.map +1 -1
  50. package/dist/src/presentation/web/app/actions/open-folder.js +2 -4
  51. package/dist/src/presentation/web/app/actions/open-ide.d.ts.map +1 -1
  52. package/dist/src/presentation/web/app/actions/open-ide.js +1 -2
  53. package/dist/src/presentation/web/app/actions/open-shell.d.ts.map +1 -1
  54. package/dist/src/presentation/web/app/actions/open-shell.js +2 -4
  55. package/dist/src/presentation/web/app/build-graph-nodes.d.ts.map +1 -1
  56. package/dist/src/presentation/web/app/build-graph-nodes.js +5 -8
  57. package/dist/src/presentation/web/components/common/merge-review/diff-view.js +1 -1
  58. package/dist/src/presentation/web/hooks/feature-flags-context.js +1 -1
  59. package/dist/src/presentation/web/lib/derive-graph.d.ts.map +1 -1
  60. package/dist/src/presentation/web/lib/derive-graph.js +2 -4
  61. package/dist/src/presentation/web/lib/feature-flags.d.ts.map +1 -1
  62. package/dist/src/presentation/web/lib/feature-flags.js +3 -1
  63. package/dist/tsconfig.build.tsbuildinfo +1 -1
  64. package/package.json +6 -10
  65. package/web/.next/BUILD_ID +1 -1
  66. package/web/.next/build-manifest.json +2 -2
  67. package/web/.next/fallback-build-manifest.json +2 -2
  68. package/web/.next/prerender-manifest.json +3 -3
  69. package/web/.next/required-server-files.js +2 -2
  70. package/web/.next/required-server-files.json +2 -2
  71. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
  72. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  73. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  74. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +25 -25
  75. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  76. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  77. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +25 -25
  78. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  79. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  81. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  82. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  83. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +20 -20
  84. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  85. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  86. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +25 -25
  87. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  88. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  89. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +25 -25
  90. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  91. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  92. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +18 -18
  93. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  94. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  95. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  96. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  97. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  98. package/web/.next/server/app/_global-error.html +2 -2
  99. package/web/.next/server/app/_global-error.rsc +1 -1
  100. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  101. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  102. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  103. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  104. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  105. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  106. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  107. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  108. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  109. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  110. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  111. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  112. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  113. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  114. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  115. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  116. package/web/.next/server/chunks/[root-of-the-server]__f47bb8a5._.js +1 -1
  117. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  118. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  119. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js +1 -1
  120. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_0a7546ed.js.map +1 -1
  121. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js +1 -1
  122. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_978cbb4c.js.map +1 -1
  123. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  124. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  125. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
  126. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js.map +1 -1
  127. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  128. package/web/.next/server/chunks/ssr/[root-of-the-server]__51fc98b0._.js +1 -1
  129. package/web/.next/server/chunks/ssr/[root-of-the-server]__51fc98b0._.js.map +1 -1
  130. package/web/.next/server/chunks/ssr/[root-of-the-server]__57f37786._.js +1 -1
  131. package/web/.next/server/chunks/ssr/[root-of-the-server]__57f37786._.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  133. package/web/.next/server/chunks/ssr/[root-of-the-server]__708dcad1._.js +1 -1
  134. package/web/.next/server/chunks/ssr/[root-of-the-server]__708dcad1._.js.map +1 -1
  135. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
  136. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
  137. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  138. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js.map +1 -1
  139. package/web/.next/server/chunks/ssr/[root-of-the-server]__8e002910._.js +1 -1
  140. package/web/.next/server/chunks/ssr/[root-of-the-server]__8e002910._.js.map +1 -1
  141. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  142. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  143. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  144. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  145. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  146. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  147. package/web/.next/server/chunks/ssr/{_7f7ccdd5._.js → _1d1282fd._.js} +2 -2
  148. package/web/.next/server/chunks/ssr/{_7f7ccdd5._.js.map → _1d1282fd._.js.map} +1 -1
  149. package/web/.next/server/chunks/ssr/{_cfc0ef91._.js → _4f3f82dc._.js} +2 -2
  150. package/web/.next/server/chunks/ssr/{_cfc0ef91._.js.map → _4f3f82dc._.js.map} +1 -1
  151. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  152. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  153. package/web/.next/server/chunks/ssr/_a37f5f18._.js +1 -1
  154. package/web/.next/server/chunks/ssr/_a37f5f18._.js.map +1 -1
  155. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  156. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  157. package/web/.next/server/chunks/ssr/_e6f2da4f._.js +1 -1
  158. package/web/.next/server/chunks/ssr/_e6f2da4f._.js.map +1 -1
  159. package/web/.next/server/chunks/ssr/{_7707524a._.js → _e9866672._.js} +2 -2
  160. package/web/.next/server/chunks/ssr/{_7707524a._.js.map → _e9866672._.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/{b6fb4d5449269dfc.js → 0bd392ccc367ada0.js} +1 -1
  183. package/web/.next/static/chunks/{828d913baac44b82.js → 0d6eb4a59f1eb888.js} +2 -2
  184. package/web/.next/static/chunks/{59298ebd0507163d.js → 710458e76c4c1e95.js} +2 -2
  185. package/web/.next/static/chunks/{eca0c53562427042.js → a464d76443ad806b.js} +2 -2
  186. package/web/.next/static/chunks/{c7bc9c4e43faa4e3.js → a60eb62ee95051af.js} +1 -1
  187. package/web/.next/static/chunks/{a7446b1b490fd8c0.js → c98681a218c0b41f.js} +1 -1
  188. package/web/.next/static/chunks/{8547d7d7b5f40283.js → ce6a78c88475c1a5.js} +1 -1
  189. package/web/.next/static/chunks/{71e88022be966501.js → da73ca1cdae68519.js} +1 -1
  190. package/web/.next/static/chunks/{e63c5ad81fd3f0cf.js → e934d107a2e4edb2.js} +1 -1
  191. package/web/.next/static/chunks/{a9fc1ee7282686f5.js → f2cba08b6c4ff590.js} +1 -1
  192. package/dist/packages/core/src/infrastructure/services/process/tree-kill.d.ts +0 -12
  193. package/dist/packages/core/src/infrastructure/services/process/tree-kill.d.ts.map +0 -1
  194. package/dist/packages/core/src/infrastructure/services/process/tree-kill.js +0 -11
  195. package/dist/packages/core/src/infrastructure/services/tool-installer/binary-exists.d.ts +0 -25
  196. package/dist/packages/core/src/infrastructure/services/tool-installer/binary-exists.d.ts.map +0 -1
  197. package/dist/packages/core/src/infrastructure/services/tool-installer/binary-exists.js +0 -32
  198. /package/web/.next/static/{ilo_SDPYkC4anXF5lwI9E → gbVzSaustoS6WazLhWXuK}/_buildManifest.js +0 -0
  199. /package/web/.next/static/{ilo_SDPYkC4anXF5lwI9E → gbVzSaustoS6WazLhWXuK}/_clientMiddlewareManifest.json +0 -0
  200. /package/web/.next/static/{ilo_SDPYkC4anXF5lwI9E → gbVzSaustoS6WazLhWXuK}/_ssgManifest.js +0 -0
@@ -8,7 +8,7 @@ properties:
8
8
  description: Enable Skills navigation and functionality in the web UI
9
9
  envDeploy:
10
10
  type: boolean
11
- default: false
11
+ default: true
12
12
  description: Enable environment deployment features in the web UI
13
13
  debug:
14
14
  type: boolean
@@ -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;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"}
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"}
@@ -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.replace(/\\/g, '/');
80
+ let effectiveRepoPath = input.repositoryPath;
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(/\\/g, '/').replace(/\/+$/, '') || effectiveRepoPath;
109
+ const normalizedPath = effectiveRepoPath.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;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"}
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"}
@@ -19,15 +19,11 @@ 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: 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.
22
+ * Normalizes a path by removing trailing slashes.
26
23
  */
27
24
  function normalizePath(p) {
28
- const forwardSlash = p.replace(/\\/g, '/');
29
25
  // Remove trailing slashes but keep root "/"
30
- return forwardSlash.length > 1 ? forwardSlash.replace(/\/+$/, '') : forwardSlash;
26
+ return p.length > 1 ? p.replace(/\/+$/, '') : p;
31
27
  }
32
28
  let AddRepositoryUseCase = class AddRepositoryUseCase {
33
29
  repositoryRepo;
@@ -112,7 +112,7 @@ export function createDefaultSettings() {
112
112
  };
113
113
  const featureFlags = {
114
114
  skills: false,
115
- envDeploy: false,
115
+ envDeploy: true,
116
116
  debug: false,
117
117
  };
118
118
  return {
@@ -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;AA2f3C;;;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;AAggB3C;;;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"}
@@ -401,7 +401,7 @@ WHERE repository_path NOT IN (SELECT path FROM repositories WHERE path IS NOT NU
401
401
  }
402
402
  };
403
403
  addNotNull('feature_flag_skills', '0');
404
- addNotNull('feature_flag_env_deploy', '0');
404
+ addNotNull('feature_flag_env_deploy', '1');
405
405
  addNotNull('feature_flag_debug', '0');
406
406
  addNullable('ci_max_fix_attempts');
407
407
  addNullable('ci_watch_timeout_ms');
@@ -494,6 +494,11 @@ WHERE repository_path NOT IN (SELECT path FROM repositories WHERE path IS NOT NU
494
494
  }
495
495
  },
496
496
  },
497
+ {
498
+ version: 32,
499
+ // Migration 032: Change envDeploy feature flag default to enabled (1).
500
+ sql: `UPDATE settings SET feature_flag_env_deploy = 1 WHERE feature_flag_env_deploy = 0;`,
501
+ },
497
502
  ];
498
503
  /**
499
504
  * The latest schema version (highest migration version number).
@@ -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 REPLACE(repository_path, '\\', '/') = ? AND deleted_at IS NULL");
75
- const row = stmt.get(slug, repositoryPath.replace(/\\/g, '/'));
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);
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("REPLACE(repository_path, '\\', '/') = ?");
89
- params.push(filters.repositoryPath.replace(/\\/g, '/'));
88
+ conditions.push('repository_path = ?');
89
+ params.push(filters.repositoryPath);
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 REPLACE(path, '\\', '/') = ? AND deleted_at IS NULL");
40
- const row = stmt.get(path.replace(/\\/g, '/'));
39
+ const stmt = this.db.prepare('SELECT * FROM repositories WHERE path = ? AND deleted_at IS NULL');
40
+ const row = stmt.get(path);
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 REPLACE(path, '\\', '/') = ?");
54
- const row = stmt.get(path.replace(/\\/g, '/'));
53
+ const stmt = this.db.prepare('SELECT * FROM repositories WHERE path = ?');
54
+ const row = stmt.get(path);
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;IAyBzB,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;IAczB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,eAAe;CAkExB"}
@@ -291,15 +291,6 @@ 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
- }
303
294
  // Strip CLAUDECODE env var to prevent "nested session" error when shep
304
295
  // is invoked from within a Claude Code session. The claude CLI checks for
305
296
  // 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;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"}
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"}
@@ -101,22 +101,20 @@ 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]+`;
106
104
  // Analyze ("Write your analysis to:"), requirements ("Update the file at:"),
107
105
  // research ("Write your research to:")
108
- const fileMatch = prompt.match(new RegExp(`(?:Write your \\w+ to|Update the file at):\\s+(${ABS_PATH})`));
106
+ const fileMatch = prompt.match(/(?:Write your \w+ to|Update the file at):\s+(\/[^\s\n]+)/);
109
107
  if (fileMatch)
110
108
  return path.dirname(fileMatch[1]);
111
109
  // Plan: "Write to BOTH /path/plan.yaml AND /path/tasks.yaml"
112
- const planMatch = prompt.match(new RegExp(`Write to BOTH\\s+(${ABS_PATH})[/\\\\]plan\\.yaml`));
110
+ const planMatch = prompt.match(/Write to BOTH\s+(\/[^\s\n]+)\/plan\.yaml/);
113
111
  if (planMatch)
114
112
  return planMatch[1];
115
113
  return null;
116
114
  }
117
115
  /** Validate extracted specDir: must be absolute, no ".." traversal. */
118
116
  function validateSpecDir(specDir) {
119
- if (!path.isAbsolute(specDir))
117
+ if (!specDir.startsWith('/'))
120
118
  throw new Error(`DevAgentExecutorService: invalid specDir (not absolute): ${specDir}`);
121
119
  if (specDir.includes('..'))
122
120
  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,CA8LR"}
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"}
@@ -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).replaceAll('\\', '/');
23
+ const shepEvidenceDir = join(repoHashDir, 'evidence', state.featureId);
24
24
  const specSection = specContent
25
25
  ? `## Feature Specification (spec.yaml)
26
26
 
@@ -41,10 +41,9 @@ ${tasksContent}
41
41
  `
42
42
  : '';
43
43
  // Relative spec dir path from worktree root (e.g., "specs/057-sidenav-feature-toggle")
44
- // Normalize to forward slashes so prompts always use POSIX paths (even on Windows)
45
- const relativeSpecDir = relative(cwd, state.specDir).replaceAll('\\', '/');
44
+ const relativeSpecDir = relative(cwd, state.specDir);
46
45
  const specEvidenceRelPath = `${relativeSpecDir}/evidence`;
47
- const specEvidenceAbsPath = join(state.specDir, 'evidence').replaceAll('\\', '/');
46
+ const specEvidenceAbsPath = join(state.specDir, 'evidence');
48
47
  const storageSection = options.commitEvidence
49
48
  ? `## Evidence Storage
50
49
 
@@ -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,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"}
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"}
@@ -13,8 +13,7 @@ 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
- // Normalize to forward slashes so prompts always use POSIX paths (even on Windows)
17
- const filePaths = filenames.map((f) => join(specDir, f).replaceAll('\\', '/'));
16
+ const filePaths = filenames.map((f) => join(specDir, f));
18
17
  return [
19
18
  '## YAML Repair Task',
20
19
  '',
@@ -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}${path.sep}`)) {
314
+ if (filePath.startsWith(`${home}/`)) {
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.replace(/\\/g, '/'),
36
+ path: filePath,
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.replace(/\\/g, '/'),
71
+ path: newPath,
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.replace(/\\/g, '/'),
87
+ path: filePath,
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 tree.
54
+ * Send SIGKILL to a process group.
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;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"}
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"}
@@ -8,7 +8,6 @@
8
8
  */
9
9
  import { spawn } from 'node:child_process';
10
10
  import { EventEmitter } from 'node:events';
11
- import treeKill from 'tree-kill';
12
11
  import { DeploymentState } from '../../../domain/generated/output.js';
13
12
  import { detectDevScript } from './detect-dev-script.js';
14
13
  import { createDeploymentLogger } from './deployment-logger.js';
@@ -20,7 +19,7 @@ const MAX_WAIT_MS = 5000;
20
19
  const defaultDeps = {
21
20
  spawn,
22
21
  detectDevScript,
23
- kill: (pid, signal) => treeKill(pid, signal),
22
+ kill: (pid, signal) => process.kill(pid, signal),
24
23
  isAlive: (pid) => {
25
24
  try {
26
25
  process.kill(pid, 0);
@@ -124,11 +123,11 @@ export class DeploymentService {
124
123
  log.info(`stop("${targetId}") — no deployment found, nothing to stop`);
125
124
  return;
126
125
  }
127
- log.info(`stop("${targetId}") — sending SIGTERM to process tree (pid=${entry.pid})`);
126
+ log.info(`stop("${targetId}") — sending SIGTERM to process group (pid=${entry.pid})`);
128
127
  entry.logs.clear();
129
- // Send SIGTERM to process tree (tree-kill handles child processes)
128
+ // Send SIGTERM to process group
130
129
  try {
131
- this.deps.kill(entry.pid, 'SIGTERM');
130
+ this.deps.kill(-entry.pid, 'SIGTERM');
132
131
  }
133
132
  catch {
134
133
  log.info(`stop("${targetId}") — process already dead on SIGTERM`);
@@ -141,7 +140,7 @@ export class DeploymentService {
141
140
  log.warn(`stop("${targetId}") — process did not exit after ${MAX_WAIT_MS}ms, escalating to SIGKILL`);
142
141
  // Escalate to SIGKILL
143
142
  try {
144
- this.deps.kill(entry.pid, 'SIGKILL');
143
+ this.deps.kill(-entry.pid, 'SIGKILL');
145
144
  }
146
145
  catch {
147
146
  // Process may have exited between check and kill
@@ -184,11 +183,11 @@ export class DeploymentService {
184
183
  this.emitter.off(event, handler);
185
184
  }
186
185
  /**
187
- * Send SIGKILL to a process tree.
186
+ * Send SIGKILL to a process group.
188
187
  */
189
188
  killProcess(entry) {
190
189
  try {
191
- this.deps.kill(entry.pid, 'SIGKILL');
190
+ this.deps.kill(-entry.pid, 'SIGKILL');
192
191
  }
193
192
  catch {
194
193
  // 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;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"}
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"}
@@ -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, realpathSync } from 'node:fs';
21
+ import { mkdirSync } 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,10 +40,9 @@ let WorktreeService = class WorktreeService {
40
40
  catch (error) {
41
41
  throw this.parseGitError(error);
42
42
  }
43
- // Get info about the created worktree — match by branch (reliable) then path
43
+ // Get info about the created worktree
44
44
  const worktrees = await this.list(repoPath);
45
- const created = worktrees.find((w) => w.branch === branch) ??
46
- worktrees.find((w) => this.arePathsEquivalent(w.path, worktreePath));
45
+ const created = worktrees.find((w) => this.arePathsEquivalent(w.path, worktreePath));
47
46
  if (!created) {
48
47
  throw new WorktreeError('Worktree created but not found in list', WorktreeErrorCode.GIT_ERROR);
49
48
  }
@@ -137,7 +136,7 @@ let WorktreeService = class WorktreeService {
137
136
  getWorktreePath(repoPath, branch) {
138
137
  const repoHash = createHash('sha256').update(repoPath).digest('hex').slice(0, 16);
139
138
  const slug = branch.replace(/\//g, '-');
140
- return path.join(getShepHomeDir(), 'repos', repoHash, 'wt', slug).replace(/\\/g, '/');
139
+ return path.join(getShepHomeDir(), 'repos', repoHash, 'wt', slug);
141
140
  }
142
141
  parseWorktreeOutput(output) {
143
142
  if (!output.trim())
@@ -179,18 +178,6 @@ let WorktreeService = class WorktreeService {
179
178
  return this.normalizeWorktreePath(a) === this.normalizeWorktreePath(b);
180
179
  }
181
180
  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
- }
194
181
  const normalized = path.normalize(input).replace(/\/+$/, '');
195
182
  // On macOS, git can report /private/var/... while callers use /var/...
196
183
  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).replace(/\\/g, '/');
22
+ return join(getShepHomeDir(), 'repos', repoHash, 'wt', slug);
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;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"}
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"}
@@ -16,9 +16,8 @@ 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 } from 'node:child_process';
19
+ import { spawn, execFile } from 'node:child_process';
20
20
  import { platform } from 'node:os';
21
- import { checkBinaryExists } from '../tool-installer/binary-exists.js';
22
21
  import { TOOL_METADATA } from '../tool-installer/tool-metadata.js';
23
22
  /**
24
23
  * Resolve a platform-specific value from a string or per-platform record.
@@ -102,13 +101,16 @@ let JsonDrivenIdeLauncherService = class JsonDrivenIdeLauncherService {
102
101
  };
103
102
  }
104
103
  }
105
- async checkAvailability(editorId) {
104
+ checkAvailability(editorId) {
106
105
  const entry = this.editors.get(editorId);
107
106
  if (!entry)
108
- return false;
107
+ return Promise.resolve(false);
109
108
  const binary = resolvePlatformValue(entry.binary);
110
- const result = await checkBinaryExists(binary);
111
- return result.found;
109
+ return new Promise((resolve) => {
110
+ execFile('which', [binary], (err) => {
111
+ resolve(!err);
112
+ });
113
+ });
112
114
  }
113
115
  };
114
116
  JsonDrivenIdeLauncherService = __decorate([
@@ -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;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"}
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"}
@@ -18,11 +18,10 @@ 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, spawn } from 'node:child_process';
21
+ import { exec, execFile, 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';
26
25
  /**
27
26
  * Resolve binary name for the current platform.
28
27
  * Supports both simple string binaries and per-platform maps.
@@ -32,6 +31,30 @@ function resolveBinary(metadata) {
32
31
  return metadata.binary;
33
32
  return metadata.binary[platform()] ?? Object.values(metadata.binary)[0];
34
33
  }
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
+ };
35
58
  /**
36
59
  * Run a shell command and resolve true when it exits 0, false otherwise.
37
60
  * Used as a fallback for GUI apps whose binary isn't in PATH (e.g. Warp, iTerm2).
@@ -107,8 +130,8 @@ let ToolInstallerServiceImpl = class ToolInstallerServiceImpl {
107
130
  }
108
131
  return new Promise((resolve) => {
109
132
  let output = '';
110
- const child = spawn(installCommand.command, [], {
111
- shell: true,
133
+ const child = spawn('sh', ['-c', installCommand.command], {
134
+ shell: false,
112
135
  stdio: ['pipe', 'pipe', 'pipe'],
113
136
  env: {
114
137
  ...process.env,
@@ -5,14 +5,13 @@
5
5
  "tags": ["terminal"],
6
6
  "author": "Alacritty Contributors",
7
7
  "website": "https://alacritty.org",
8
- "platforms": ["linux", "darwin", "win32"],
8
+ "platforms": ["linux", "darwin"],
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",
15
- "win32": "winget install --id Alacritty.Alacritty -e --source winget"
14
+ "linux": "sudo apt-get update && sudo apt-get install -y alacritty"
16
15
  },
17
16
  "timeout": 300000,
18
17
  "documentationUrl": "https://alacritty.org/",
@@ -5,14 +5,13 @@
5
5
  "tags": ["cli-agent"],
6
6
  "author": "Anthropic",
7
7
  "website": "https://claude.ai/code",
8
- "platforms": ["linux", "darwin", "win32"],
8
+ "platforms": ["linux", "darwin"],
9
9
  "iconUrl": "https://cdn.simpleicons.org/claude",
10
10
  "binary": "claude",
11
11
  "packageManager": "curl",
12
12
  "commands": {
13
13
  "linux": "curl -fsSL https://claude.ai/install.sh | bash",
14
- "darwin": "curl -fsSL https://claude.ai/install.sh | bash",
15
- "win32": "npm install -g @anthropic-ai/claude-code"
14
+ "darwin": "curl -fsSL https://claude.ai/install.sh | bash"
16
15
  },
17
16
  "timeout": 300000,
18
17
  "documentationUrl": "https://code.claude.com/docs/en/overview",
@@ -5,14 +5,13 @@
5
5
  "tags": ["cli-agent"],
6
6
  "author": "Anysphere",
7
7
  "website": "https://cursor.com",
8
- "platforms": ["linux", "darwin", "win32"],
8
+ "platforms": ["linux", "darwin"],
9
9
  "iconUrl": "https://cdn.simpleicons.org/cursor",
10
10
  "binary": "cursor-agent",
11
11
  "packageManager": "curl",
12
12
  "commands": {
13
13
  "linux": "curl https://cursor.com/install -fsS | bash",
14
- "darwin": "curl https://cursor.com/install -fsS | bash",
15
- "win32": "winget install --id Anysphere.Cursor -e --source winget"
14
+ "darwin": "curl https://cursor.com/install -fsS | bash"
16
15
  },
17
16
  "timeout": 300000,
18
17
  "documentationUrl": "https://www.codecademy.com/article/getting-started-with-cursor-cli",
@@ -11,8 +11,7 @@
11
11
  "packageManager": "manual",
12
12
  "commands": {
13
13
  "linux": "Download from https://cursor.com/download and install the AppImage manually",
14
- "darwin": "Download from https://cursor.com/download or use: brew install --cask cursor",
15
- "win32": "winget install --id Anysphere.Cursor -e --source winget"
14
+ "darwin": "Download from https://cursor.com/download or use: brew install --cask cursor"
16
15
  },
17
16
  "timeout": 600000,
18
17
  "documentationUrl": "https://cursor.com/download",