@shepai/cli 1.108.0 → 1.108.1

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 (143) hide show
  1. package/dist/packages/core/src/infrastructure/di/container.d.ts.map +1 -1
  2. package/dist/packages/core/src/infrastructure/di/container.js +8 -4
  3. package/dist/packages/core/src/infrastructure/platform.d.ts +7 -0
  4. package/dist/packages/core/src/infrastructure/platform.d.ts.map +1 -0
  5. package/dist/packages/core/src/infrastructure/platform.js +6 -0
  6. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.d.ts.map +1 -1
  7. package/dist/packages/core/src/infrastructure/services/agents/common/executors/claude-code-executor.service.js +2 -1
  8. package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.d.ts.map +1 -1
  9. package/dist/packages/core/src/infrastructure/services/agents/common/executors/cursor-executor.service.js +7 -0
  10. package/dist/packages/core/src/infrastructure/services/git/worktree.service.d.ts.map +1 -1
  11. package/dist/packages/core/src/infrastructure/services/git/worktree.service.js +2 -1
  12. package/dist/packages/core/src/infrastructure/services/web-server.service.d.ts.map +1 -1
  13. package/dist/packages/core/src/infrastructure/services/web-server.service.js +15 -0
  14. package/dist/src/presentation/web/app/api/tools/[id]/launch/route.js +1 -1
  15. package/dist/src/presentation/web/lib/skills.js +1 -1
  16. package/dist/tsconfig.build.tsbuildinfo +1 -1
  17. package/package.json +1 -1
  18. package/web/.next/BUILD_ID +1 -1
  19. package/web/.next/build-manifest.json +2 -2
  20. package/web/.next/fallback-build-manifest.json +2 -2
  21. package/web/.next/prerender-manifest.json +3 -3
  22. package/web/.next/required-server-files.js +2 -2
  23. package/web/.next/required-server-files.json +2 -2
  24. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +20 -20
  25. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  26. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page/server-reference-manifest.json +26 -26
  28. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  29. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  30. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +26 -26
  31. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  32. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  33. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  34. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  35. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  36. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +20 -20
  37. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  38. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  39. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page/server-reference-manifest.json +26 -26
  40. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page.js.nft.json +1 -1
  41. package/web/.next/server/app/(dashboard)/feature/[featureId]/[tab]/page_client-reference-manifest.js +1 -1
  42. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +26 -26
  43. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  44. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  45. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +18 -18
  46. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  47. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  48. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +18 -18
  49. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  50. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  51. package/web/.next/server/app/_global-error.html +2 -2
  52. package/web/.next/server/app/_global-error.rsc +1 -1
  53. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  54. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  55. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  56. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  57. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  58. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  59. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  60. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  61. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  62. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  63. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  64. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  65. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  66. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  67. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  68. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  69. package/web/.next/server/chunks/[root-of-the-server]__a402b567._.js +1 -1
  70. package/web/.next/server/chunks/[root-of-the-server]__b4102cc7._.js +1 -1
  71. package/web/.next/server/chunks/[root-of-the-server]__b4102cc7._.js.map +1 -1
  72. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  73. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  74. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js +1 -1
  75. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_a1104008.js.map +1 -1
  76. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js +1 -1
  77. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_92642200.js.map +1 -1
  78. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js +1 -1
  79. package/web/.next/server/chunks/ssr/[root-of-the-server]__039967e3._.js.map +1 -1
  80. package/web/.next/server/chunks/ssr/[root-of-the-server]__07a39ff2._.js +1 -1
  81. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  82. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  83. package/web/.next/server/chunks/ssr/[root-of-the-server]__24dd0927._.js +2 -2
  84. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js +1 -1
  85. package/web/.next/server/chunks/ssr/[root-of-the-server]__2773312c._.js.map +1 -1
  86. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  87. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js +1 -1
  88. package/web/.next/server/chunks/ssr/[root-of-the-server]__845a9d2a._.js.map +1 -1
  89. package/web/.next/server/chunks/ssr/[root-of-the-server]__89e8a5cc._.js +2 -2
  90. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +2 -2
  91. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  92. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js +1 -1
  93. package/web/.next/server/chunks/ssr/[root-of-the-server]__cbd8062c._.js.map +1 -1
  94. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js +1 -1
  95. package/web/.next/server/chunks/ssr/[root-of-the-server]__e70c5627._.js.map +1 -1
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  98. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  99. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  100. package/web/.next/server/chunks/ssr/_3a4c94e3._.js +1 -1
  101. package/web/.next/server/chunks/ssr/_3a4c94e3._.js.map +1 -1
  102. package/web/.next/server/chunks/ssr/{_a2f904c8._.js → _62046d95._.js} +2 -2
  103. package/web/.next/server/chunks/ssr/{_a2f904c8._.js.map → _62046d95._.js.map} +1 -1
  104. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  105. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  106. package/web/.next/server/chunks/ssr/{_091ab7f5._.js → _c70d9b33._.js} +2 -2
  107. package/web/.next/server/chunks/ssr/{_091ab7f5._.js.map → _c70d9b33._.js.map} +1 -1
  108. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  109. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/{_8affa5ab._.js → _d061afbe._.js} +2 -2
  111. package/web/.next/server/chunks/ssr/{_8affa5ab._.js.map → _d061afbe._.js.map} +1 -1
  112. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  113. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  114. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js +1 -1
  115. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_888633e1.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  117. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  119. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  120. package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js +2 -2
  121. package/web/.next/server/chunks/ssr/src_presentation_web_ce7cbc3c._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  123. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  124. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  125. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js +2 -2
  127. package/web/.next/server/chunks/ssr/src_presentation_web_e2604413._.js.map +1 -1
  128. package/web/.next/server/pages/500.html +2 -2
  129. package/web/.next/server/server-reference-manifest.js +1 -1
  130. package/web/.next/server/server-reference-manifest.json +31 -31
  131. package/web/.next/static/chunks/{fecdfab54bbebc7f.js → 0e0f97b1c5896c76.js} +2 -2
  132. package/web/.next/static/chunks/{089b3c720afef02f.js → 1b75e16363eda185.js} +2 -2
  133. package/web/.next/static/chunks/{b48405e5d661490f.js → 2cbea56328a51d40.js} +1 -1
  134. package/web/.next/static/chunks/{3fc0c2bdfd985563.js → 429244a234d321a0.js} +1 -1
  135. package/web/.next/static/chunks/{41ad7066036d3e01.js → 4903e892cb40b58f.js} +1 -1
  136. package/web/.next/static/chunks/{2946ec503df0563c.js → 6de088efae33ebe0.js} +1 -1
  137. package/web/.next/static/chunks/{1e5bd91d971ede3c.js → 75ee6e58a48c650a.js} +1 -1
  138. package/web/.next/static/chunks/{55e50bf848962a77.js → 93dfac33de99e86d.js} +1 -1
  139. package/web/.next/static/chunks/{3ac71f5bdd986ebf.js → f9a371d3a0d6cd37.js} +1 -1
  140. package/web/.next/static/chunks/{d7817aae0db61e25.js → fe25ae01bc30db68.js} +1 -1
  141. /package/web/.next/static/{9T2DFw6aFI0waogTIo2px → IF-6eFBS3sFqEI7cO3O8x}/_buildManifest.js +0 -0
  142. /package/web/.next/static/{9T2DFw6aFI0waogTIo2px → IF-6eFBS3sFqEI7cO3O8x}/_clientMiddlewareManifest.json +0 -0
  143. /package/web/.next/static/{9T2DFw6aFI0waogTIo2px → IF-6eFBS3sFqEI7cO3O8x}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAkHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA6TrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/di/container.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAmHrC;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,OAAO,SAAS,CAAC,CA+TrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAEhD;AAED;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,CAAC"}
@@ -18,6 +18,7 @@ import { SQLiteRepositoryRepository } from '../repositories/sqlite-repository.re
18
18
  import { AgentValidatorService } from '../services/agents/common/agent-validator.service.js';
19
19
  import { promisify } from 'node:util';
20
20
  import { execFile } from 'node:child_process';
21
+ import { IS_WINDOWS } from '../platform.js';
21
22
  import { VersionService } from '../services/version.service.js';
22
23
  import { WorktreeService } from '../services/git/worktree.service.js';
23
24
  import { ToolInstallerServiceImpl } from '../services/tool-installer/tool-installer.service.js';
@@ -129,7 +130,7 @@ export async function initializeContainer() {
129
130
  // On Windows, agent CLIs ship as .cmd/.ps1 scripts (e.g. cursor's `agent.cmd`).
130
131
  // execFile without shell: true cannot resolve .cmd extensions, causing ENOENT.
131
132
  const execFileAsync = promisify(execFile);
132
- const execFn = process.platform === 'win32'
133
+ const execFn = IS_WINDOWS
133
134
  ? (file, args, options) => execFileAsync(file, args, { ...options, shell: true, windowsHide: true })
134
135
  : execFileAsync;
135
136
  container.registerInstance('ExecFunction', execFn);
@@ -190,12 +191,15 @@ export async function initializeContainer() {
190
191
  container.register('IAgentExecutorFactory', {
191
192
  useFactory: () => {
192
193
  // Wrap spawn to ensure stdio is explicitly set to 'pipe'.
193
- // On Windows, .cmd scripts (e.g. cursor's `agent.cmd`) need shell: true.
194
+ // Do NOT force shell: true here each executor controls its own spawn
195
+ // options via buildSpawnOptions(). Forcing shell: true globally causes
196
+ // DEP0190 argument escaping issues on Windows that mangle long prompts.
197
+ // Executors that need shell: true (e.g. cursor for .cmd scripts) set it
198
+ // themselves; native executables (claude, gemini) must NOT use shell: true.
194
199
  const spawnWithPipe = (command, args, options) => {
195
200
  return spawn(command, args, {
196
- ...options,
197
201
  stdio: 'pipe',
198
- ...(process.platform === 'win32' ? { shell: true, windowsHide: true } : {}),
202
+ ...options,
199
203
  });
200
204
  };
201
205
  return new AgentExecutorFactory(spawnWithPipe);
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Platform detection constants.
3
+ *
4
+ * Evaluated once at module load — safe to use in hot paths.
5
+ */
6
+ export declare const IS_WINDOWS: boolean;
7
+ //# sourceMappingURL=platform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../../../../packages/core/src/infrastructure/platform.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,eAAO,MAAM,UAAU,SAA+B,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Platform detection constants.
3
+ *
4
+ * Evaluated once at module load — safe to use in hot paths.
5
+ */
6
+ export const IS_WINDOWS = process.platform === 'win32';
@@ -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;AAajD;;;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"}
@@ -9,6 +9,7 @@
9
9
  * to enable testability without mocking node:child_process directly.
10
10
  */
11
11
  import { getCurrentPhase, getLogPrefix } from '../../feature-agent/log-context.js';
12
+ import { IS_WINDOWS } from '../../../../platform.js';
12
13
  /** Features supported by Claude Code CLI */
13
14
  const SUPPORTED_FEATURES = new Set([
14
15
  'session-resume',
@@ -297,7 +298,7 @@ export class ClaudeCodeExecutorService {
297
298
  // Do NOT use shell=true — it causes DEP0190 argument escaping issues
298
299
  // and mangles prompts with special characters. The claude CLI is a
299
300
  // native .exe, so spawn() finds it on PATH without shell.
300
- if (process.platform === 'win32') {
301
+ if (IS_WINDOWS) {
301
302
  spawnOpts.windowsHide = true;
302
303
  }
303
304
  // Strip CLAUDECODE env var to prevent "nested session" error when shep
@@ -1 +1 @@
1
- {"version":3,"file":"cursor-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/cursor-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;AAsBjD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAM9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAyB;IAEtD,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA0GtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA8E3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,eAAe;CAgDxB"}
1
+ {"version":3,"file":"cursor-executor.service.d.ts","sourceRoot":"","sources":["../../../../../../../../../packages/core/src/infrastructure/services/agents/common/executors/cursor-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;AAuBjD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAM9C,OAAO,CAAC,QAAQ,CAAC,KAAK;IALlC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAyB;IAEtD,4EAA4E;IAC5E,OAAO,CAAC,MAAM,CAAS;gBAEM,KAAK,EAAE,aAAa;IAEjD,4EAA4E;IAC5E,OAAO,CAAC,GAAG;IAMX,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO;IAIzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IA0GtF,aAAa,CAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,qBAAqB,GAC9B,aAAa,CAAC,yBAAyB,CAAC;IA8E3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAkCtB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,eAAe;CAgDxB"}
@@ -9,6 +9,7 @@
9
9
  * to enable testability without mocking node:child_process directly.
10
10
  */
11
11
  import { getCurrentPhase, getLogPrefix } from '../../feature-agent/log-context.js';
12
+ import { IS_WINDOWS } from '../../../../platform.js';
12
13
  /**
13
14
  * Map canonical model IDs (used across shep) to Cursor CLI model names.
14
15
  * Cursor uses short names like "sonnet-4.6" instead of "claude-sonnet-4-6".
@@ -274,6 +275,12 @@ export class CursorExecutorService {
274
275
  const spawnOpts = {};
275
276
  if (options?.cwd)
276
277
  spawnOpts.cwd = options.cwd;
278
+ // On Windows, the cursor agent is a .cmd script which requires shell: true
279
+ // to resolve via PATH. Also hide the console window.
280
+ if (IS_WINDOWS) {
281
+ spawnOpts.shell = true;
282
+ spawnOpts.windowsHide = true;
283
+ }
277
284
  // Strip CLAUDECODE env var to prevent "nested session" error when shep
278
285
  // is invoked from within a Claude Code session.
279
286
  const { CLAUDECODE: _, ...cleanEnv } = process.env;
@@ -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;AAQlF;;;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"}
@@ -25,6 +25,7 @@ const GIT_AUTO_INIT_USER = 'shep-ai[bot]';
25
25
  const GIT_AUTO_INIT_EMAIL = 'bot@shep.bot';
26
26
  import { WorktreeError, WorktreeErrorCode, } from '../../../application/ports/output/services/worktree-service.interface.js';
27
27
  import { getShepHomeDir } from '../filesystem/shep-directory.service.js';
28
+ import { IS_WINDOWS } from '../../platform.js';
28
29
  let WorktreeService = class WorktreeService {
29
30
  execFile;
30
31
  constructor(execFile) {
@@ -181,7 +182,7 @@ let WorktreeService = class WorktreeService {
181
182
  normalizeWorktreePath(input) {
182
183
  // On Windows, git outputs forward slashes but path.normalize uses backslashes.
183
184
  // Normalize to forward slashes before comparing, case-insensitive.
184
- if (process.platform === 'win32') {
185
+ if (IS_WINDOWS) {
185
186
  let normalized = path.normalize(input).replace(/\\/g, '/').replace(/\/+$/, '');
186
187
  try {
187
188
  normalized = realpathSync(normalized).replace(/\\/g, '/');
@@ -1 +1 @@
1
- {"version":3,"file":"web-server.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/web-server.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yEAAyE,CAAC;AAIjH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,OAAO,IAAI,CAAC;IAC3B,gBAAgB,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC;CAC5C;AAOD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAsB7D;AAED,qBACa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;gBAEzB,IAAI,GAAE,OAAO,CAAC,aAAa,CAAM;IAI7C;;;;;OAKG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BjE;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB5B"}
1
+ {"version":3,"file":"web-server.service.d.ts","sourceRoot":"","sources":["../../../../../../packages/core/src/infrastructure/services/web-server.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yEAAyE,CAAC;AAKjH,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,OAAO,IAAI,CAAC;IAC3B,gBAAgB,EAAE,OAAO,IAAI,CAAC,YAAY,CAAC;CAC5C;AAOD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,OAAO,CAAA;CAAE,CAsB7D;AAED,qBACa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,GAAG,CAAwB;IACnC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAgB;gBAEzB,IAAI,GAAE,OAAO,CAAC,aAAa,CAAM;IAI7C;;;;;OAKG;IACG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CjE;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB5B"}
@@ -22,6 +22,7 @@ import next from 'next';
22
22
  import http from 'node:http';
23
23
  import path from 'node:path';
24
24
  import fs from 'node:fs';
25
+ import { IS_WINDOWS } from '../platform.js';
25
26
  const defaultDeps = {
26
27
  createNextApp: next,
27
28
  createHttpServer: http.createServer,
@@ -70,6 +71,20 @@ let WebServerService = class WebServerService {
70
71
  * @param dev - Whether to run in development mode (default: auto-detect)
71
72
  */
72
73
  async start(port, dir, dev = true) {
74
+ // On Windows, Next.js uses path.relative(CWD, dir) internally then
75
+ // reconstructs with path.join(CWD, relative). When CWD and dir are on
76
+ // different drives (e.g. D:\project vs C:\...\web), path.relative returns
77
+ // the absolute path (can't compute relative across drives), and path.join
78
+ // produces a mangled path like D:\project\C:\...\web\. Fix by ensuring
79
+ // CWD is on the same drive as dir.
80
+ if (IS_WINDOWS) {
81
+ const getDriveLetter = (p) => p.match(/^[a-zA-Z]:/)?.[0]?.toUpperCase();
82
+ const cwdDrive = getDriveLetter(process.cwd());
83
+ const dirDrive = getDriveLetter(dir);
84
+ if (cwdDrive && dirDrive && cwdDrive !== dirDrive) {
85
+ process.chdir(dir);
86
+ }
87
+ }
73
88
  const app = this.deps.createNextApp({
74
89
  dev,
75
90
  dir,
@@ -6,7 +6,7 @@ export async function POST(_request, { params }) {
6
6
  const useCase = resolve('LaunchToolUseCase');
7
7
  const result = await useCase.execute({
8
8
  toolId: id,
9
- directoryPath: process.cwd(),
9
+ directoryPath: process.env.NEXT_PUBLIC_SHEP_INSTANCE_PATH ?? process.cwd(),
10
10
  headless: true,
11
11
  });
12
12
  if (result.ok) {
@@ -122,7 +122,7 @@ async function getSkillsFromDirectory(dirPath, source) {
122
122
  return skills;
123
123
  }
124
124
  export async function getSkills(projectRoot, homeDir) {
125
- const root = projectRoot ?? process.cwd();
125
+ const root = projectRoot ?? process.env.NEXT_PUBLIC_SHEP_INSTANCE_PATH ?? process.cwd();
126
126
  const home = homeDir ?? homedir();
127
127
  const projectDir = join(root, '.claude', 'skills');
128
128
  const globalDir = join(home, '.claude', 'skills');