@prestyj/cli 5.8.0 → 5.10.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 (469) hide show
  1. package/README.md +1 -1
  2. package/assets/skills/evidence-led-ui/LICENSES.md +12 -0
  3. package/assets/skills/evidence-led-ui/SKILL.md +15 -7
  4. package/assets/skills/evidence-led-ui/references/anti-defaults.md +9 -1
  5. package/assets/skills/evidence-led-ui/references/craft-rulings.md +33 -0
  6. package/assets/skills/evidence-led-ui/references/production-contract.md +41 -21
  7. package/assets/skills/evidence-led-ui/references/provenance.md +7 -5
  8. package/assets/skills/evidence-led-ui/references/quality-rubric.md +10 -10
  9. package/dist/app-sidecar-sessions.d.ts +8 -0
  10. package/dist/app-sidecar-sessions.d.ts.map +1 -0
  11. package/dist/app-sidecar-sessions.js +31 -0
  12. package/dist/app-sidecar-sessions.js.map +1 -0
  13. package/dist/app-sidecar-sessions.test.d.ts +2 -0
  14. package/dist/app-sidecar-sessions.test.d.ts.map +1 -0
  15. package/dist/app-sidecar-sessions.test.js +83 -0
  16. package/dist/app-sidecar-sessions.test.js.map +1 -0
  17. package/dist/app-sidecar.js +623 -120
  18. package/dist/app-sidecar.js.map +1 -1
  19. package/dist/chat-agents/general.test.js +5 -3
  20. package/dist/chat-agents/general.test.js.map +1 -1
  21. package/dist/chat-agents/memory.d.ts.map +1 -1
  22. package/dist/chat-agents/memory.js +14 -5
  23. package/dist/chat-agents/memory.js.map +1 -1
  24. package/dist/chat-agents/memory.test.js +11 -1
  25. package/dist/chat-agents/memory.test.js.map +1 -1
  26. package/dist/chat-agents/shared.js +1 -1
  27. package/dist/chat-agents/shared.js.map +1 -1
  28. package/dist/chat-agents/specialists.test.js +3 -2
  29. package/dist/chat-agents/specialists.test.js.map +1 -1
  30. package/dist/cli.d.ts.map +1 -1
  31. package/dist/cli.js +59 -30
  32. package/dist/cli.js.map +1 -1
  33. package/dist/config.d.ts +18 -0
  34. package/dist/config.d.ts.map +1 -1
  35. package/dist/config.js +50 -2
  36. package/dist/config.js.map +1 -1
  37. package/dist/config.test.js +61 -1
  38. package/dist/config.test.js.map +1 -1
  39. package/dist/core/agent-mcp-passthrough.test.d.ts +2 -0
  40. package/dist/core/agent-mcp-passthrough.test.d.ts.map +1 -0
  41. package/dist/core/agent-mcp-passthrough.test.js +61 -0
  42. package/dist/core/agent-mcp-passthrough.test.js.map +1 -0
  43. package/dist/core/agent-session-add-dir.test.d.ts +2 -0
  44. package/dist/core/agent-session-add-dir.test.d.ts.map +1 -0
  45. package/dist/core/agent-session-add-dir.test.js +110 -0
  46. package/dist/core/agent-session-add-dir.test.js.map +1 -0
  47. package/dist/core/agent-session-compaction.test.js +23 -7
  48. package/dist/core/agent-session-compaction.test.js.map +1 -1
  49. package/dist/core/agent-session-marker-anchors.test.d.ts +2 -0
  50. package/dist/core/agent-session-marker-anchors.test.d.ts.map +1 -0
  51. package/dist/core/agent-session-marker-anchors.test.js +147 -0
  52. package/dist/core/agent-session-marker-anchors.test.js.map +1 -0
  53. package/dist/core/agent-session-memory-tail.test.js +4 -7
  54. package/dist/core/agent-session-memory-tail.test.js.map +1 -1
  55. package/dist/core/agent-session-queue.test.js +4 -7
  56. package/dist/core/agent-session-queue.test.js.map +1 -1
  57. package/dist/core/agent-session-subagent-policy.test.js +7 -3
  58. package/dist/core/agent-session-subagent-policy.test.js.map +1 -1
  59. package/dist/core/agent-session.d.ts +46 -0
  60. package/dist/core/agent-session.d.ts.map +1 -1
  61. package/dist/core/agent-session.js +177 -19
  62. package/dist/core/agent-session.js.map +1 -1
  63. package/dist/core/agent-tools-allowlist.test.js +5 -3
  64. package/dist/core/agent-tools-allowlist.test.js.map +1 -1
  65. package/dist/core/agents.d.ts +12 -1
  66. package/dist/core/agents.d.ts.map +1 -1
  67. package/dist/core/agents.js +25 -1
  68. package/dist/core/agents.js.map +1 -1
  69. package/dist/core/agents.test.d.ts +2 -0
  70. package/dist/core/agents.test.d.ts.map +1 -0
  71. package/dist/core/agents.test.js +67 -0
  72. package/dist/core/agents.test.js.map +1 -0
  73. package/dist/core/auth-providers.js +1 -1
  74. package/dist/core/auth-providers.js.map +1 -1
  75. package/dist/core/auth-storage.d.ts +1 -1
  76. package/dist/core/auth-storage.d.ts.map +1 -1
  77. package/dist/core/auth-storage.js +1 -1
  78. package/dist/core/auth-storage.js.map +1 -1
  79. package/dist/core/compaction/compactor.d.ts.map +1 -1
  80. package/dist/core/compaction/compactor.js +20 -11
  81. package/dist/core/compaction/compactor.js.map +1 -1
  82. package/dist/core/compaction/compactor.test.js +17 -4
  83. package/dist/core/compaction/compactor.test.js.map +1 -1
  84. package/dist/core/compaction/token-estimator.test.js +1 -1
  85. package/dist/core/compaction/token-estimator.test.js.map +1 -1
  86. package/dist/core/encode-cwd.d.ts +17 -0
  87. package/dist/core/encode-cwd.d.ts.map +1 -1
  88. package/dist/core/encode-cwd.js +20 -7
  89. package/dist/core/encode-cwd.js.map +1 -1
  90. package/dist/core/encode-cwd.test.js +20 -1
  91. package/dist/core/encode-cwd.test.js.map +1 -1
  92. package/dist/core/event-bus.d.ts +5 -0
  93. package/dist/core/event-bus.d.ts.map +1 -1
  94. package/dist/core/event-bus.js +6 -0
  95. package/dist/core/event-bus.js.map +1 -1
  96. package/dist/core/goal-controller.test.js +3 -3
  97. package/dist/core/goal-controller.test.js.map +1 -1
  98. package/dist/core/ideal-review.d.ts.map +1 -1
  99. package/dist/core/ideal-review.js +6 -1
  100. package/dist/core/ideal-review.js.map +1 -1
  101. package/dist/core/ideal-review.test.js +7 -2
  102. package/dist/core/ideal-review.test.js.map +1 -1
  103. package/dist/core/index.d.ts +2 -2
  104. package/dist/core/index.d.ts.map +1 -1
  105. package/dist/core/index.js +2 -2
  106. package/dist/core/index.js.map +1 -1
  107. package/dist/core/input-normalization.test.d.ts +2 -0
  108. package/dist/core/input-normalization.test.d.ts.map +1 -0
  109. package/dist/core/input-normalization.test.js +75 -0
  110. package/dist/core/input-normalization.test.js.map +1 -0
  111. package/dist/core/local-endpoint-store.d.ts +50 -0
  112. package/dist/core/local-endpoint-store.d.ts.map +1 -0
  113. package/dist/core/local-endpoint-store.js +201 -0
  114. package/dist/core/local-endpoint-store.js.map +1 -0
  115. package/dist/core/local-endpoint-store.test.d.ts +2 -0
  116. package/dist/core/local-endpoint-store.test.d.ts.map +1 -0
  117. package/dist/core/local-endpoint-store.test.js +131 -0
  118. package/dist/core/local-endpoint-store.test.js.map +1 -0
  119. package/dist/core/loop-breaker.d.ts +38 -1
  120. package/dist/core/loop-breaker.d.ts.map +1 -1
  121. package/dist/core/loop-breaker.js +84 -2
  122. package/dist/core/loop-breaker.js.map +1 -1
  123. package/dist/core/loop-breaker.test.js +108 -1
  124. package/dist/core/loop-breaker.test.js.map +1 -1
  125. package/dist/core/lsp/client.d.ts +50 -0
  126. package/dist/core/lsp/client.d.ts.map +1 -1
  127. package/dist/core/lsp/client.js +158 -13
  128. package/dist/core/lsp/client.js.map +1 -1
  129. package/dist/core/lsp/jsonrpc.d.ts +38 -1
  130. package/dist/core/lsp/jsonrpc.d.ts.map +1 -1
  131. package/dist/core/lsp/jsonrpc.js +13 -1
  132. package/dist/core/lsp/jsonrpc.js.map +1 -1
  133. package/dist/core/lsp/manager.d.ts.map +1 -1
  134. package/dist/core/lsp/manager.js +23 -2
  135. package/dist/core/lsp/manager.js.map +1 -1
  136. package/dist/core/lsp/manager.test.js +32 -1
  137. package/dist/core/lsp/manager.test.js.map +1 -1
  138. package/dist/core/lsp/test-support.d.ts +18 -0
  139. package/dist/core/lsp/test-support.d.ts.map +1 -0
  140. package/dist/core/lsp/test-support.js +27 -0
  141. package/dist/core/lsp/test-support.js.map +1 -0
  142. package/dist/core/lsp/uri.test.d.ts +2 -0
  143. package/dist/core/lsp/uri.test.d.ts.map +1 -0
  144. package/dist/core/lsp/uri.test.js +56 -0
  145. package/dist/core/lsp/uri.test.js.map +1 -0
  146. package/dist/core/lsp/windows.test.d.ts +2 -0
  147. package/dist/core/lsp/windows.test.d.ts.map +1 -0
  148. package/dist/core/lsp/windows.test.js +251 -0
  149. package/dist/core/lsp/windows.test.js.map +1 -0
  150. package/dist/core/mcp/resolve-stdio.d.ts +35 -0
  151. package/dist/core/mcp/resolve-stdio.d.ts.map +1 -1
  152. package/dist/core/mcp/resolve-stdio.js +80 -1
  153. package/dist/core/mcp/resolve-stdio.js.map +1 -1
  154. package/dist/core/mcp/resolve-stdio.test.js +99 -4
  155. package/dist/core/mcp/resolve-stdio.test.js.map +1 -1
  156. package/dist/core/message-images.d.ts +12 -0
  157. package/dist/core/message-images.d.ts.map +1 -0
  158. package/dist/core/message-images.js +52 -0
  159. package/dist/core/message-images.js.map +1 -0
  160. package/dist/core/message-images.test.d.ts +2 -0
  161. package/dist/core/message-images.test.d.ts.map +1 -0
  162. package/dist/core/message-images.test.js +62 -0
  163. package/dist/core/message-images.test.js.map +1 -0
  164. package/dist/core/network-guard.d.ts +47 -0
  165. package/dist/core/network-guard.d.ts.map +1 -0
  166. package/dist/core/network-guard.js +208 -0
  167. package/dist/core/network-guard.js.map +1 -0
  168. package/dist/core/network-guard.test.d.ts +2 -0
  169. package/dist/core/network-guard.test.d.ts.map +1 -0
  170. package/dist/core/network-guard.test.js +72 -0
  171. package/dist/core/network-guard.test.js.map +1 -0
  172. package/dist/core/persistent-shell.d.ts +3 -1
  173. package/dist/core/persistent-shell.d.ts.map +1 -1
  174. package/dist/core/persistent-shell.js +13 -3
  175. package/dist/core/persistent-shell.js.map +1 -1
  176. package/dist/core/process-manager-dev-server-repro.test.js +34 -12
  177. package/dist/core/process-manager-dev-server-repro.test.js.map +1 -1
  178. package/dist/core/process-manager.d.ts +1 -1
  179. package/dist/core/process-manager.d.ts.map +1 -1
  180. package/dist/core/process-manager.js +23 -13
  181. package/dist/core/process-manager.js.map +1 -1
  182. package/dist/core/project-discovery.d.ts +8 -1
  183. package/dist/core/project-discovery.d.ts.map +1 -1
  184. package/dist/core/project-discovery.js +145 -62
  185. package/dist/core/project-discovery.js.map +1 -1
  186. package/dist/core/project-discovery.test.js +131 -1
  187. package/dist/core/project-discovery.test.js.map +1 -1
  188. package/dist/core/prompt-commands.d.ts.map +1 -1
  189. package/dist/core/prompt-commands.js +89 -156
  190. package/dist/core/prompt-commands.js.map +1 -1
  191. package/dist/core/prompt-commands.test.js +4 -10
  192. package/dist/core/prompt-commands.test.js.map +1 -1
  193. package/dist/core/radio.test.js +4 -1
  194. package/dist/core/radio.test.js.map +1 -1
  195. package/dist/core/runtime-mode.d.ts +2 -0
  196. package/dist/core/runtime-mode.d.ts.map +1 -1
  197. package/dist/core/runtime-mode.js +4 -0
  198. package/dist/core/runtime-mode.js.map +1 -1
  199. package/dist/core/session-export.d.ts +98 -0
  200. package/dist/core/session-export.d.ts.map +1 -0
  201. package/dist/core/session-export.js +356 -0
  202. package/dist/core/session-export.js.map +1 -0
  203. package/dist/core/session-export.test.d.ts +2 -0
  204. package/dist/core/session-export.test.d.ts.map +1 -0
  205. package/dist/core/session-export.test.js +353 -0
  206. package/dist/core/session-export.test.js.map +1 -0
  207. package/dist/core/session-manager.d.ts +27 -7
  208. package/dist/core/session-manager.d.ts.map +1 -1
  209. package/dist/core/session-manager.js +257 -124
  210. package/dist/core/session-manager.js.map +1 -1
  211. package/dist/core/session-storage.d.ts +57 -0
  212. package/dist/core/session-storage.d.ts.map +1 -0
  213. package/dist/core/session-storage.js +592 -0
  214. package/dist/core/session-storage.js.map +1 -0
  215. package/dist/core/session-storage.test.d.ts +2 -0
  216. package/dist/core/session-storage.test.d.ts.map +1 -0
  217. package/dist/core/session-storage.test.js +272 -0
  218. package/dist/core/session-storage.test.js.map +1 -0
  219. package/dist/core/settings-manager.d.ts +7 -0
  220. package/dist/core/settings-manager.d.ts.map +1 -1
  221. package/dist/core/settings-manager.js +17 -0
  222. package/dist/core/settings-manager.js.map +1 -1
  223. package/dist/core/setup-history.d.ts +0 -6
  224. package/dist/core/setup-history.d.ts.map +1 -1
  225. package/dist/core/setup-history.js +2 -18
  226. package/dist/core/setup-history.js.map +1 -1
  227. package/dist/core/setup-history.test.js +11 -26
  228. package/dist/core/setup-history.test.js.map +1 -1
  229. package/dist/core/sidecar-error-reporter.d.ts +12 -0
  230. package/dist/core/sidecar-error-reporter.d.ts.map +1 -0
  231. package/dist/core/sidecar-error-reporter.js +57 -0
  232. package/dist/core/sidecar-error-reporter.js.map +1 -0
  233. package/dist/core/sidecar-error-reporter.test.d.ts +2 -0
  234. package/dist/core/sidecar-error-reporter.test.d.ts.map +1 -0
  235. package/dist/core/sidecar-error-reporter.test.js +61 -0
  236. package/dist/core/sidecar-error-reporter.test.js.map +1 -0
  237. package/dist/core/skills-routing.test.js +3 -1
  238. package/dist/core/skills-routing.test.js.map +1 -1
  239. package/dist/core/skills.d.ts +1 -1
  240. package/dist/core/skills.d.ts.map +1 -1
  241. package/dist/core/skills.js +4 -1
  242. package/dist/core/skills.js.map +1 -1
  243. package/dist/core/slash-commands.d.ts +18 -0
  244. package/dist/core/slash-commands.d.ts.map +1 -1
  245. package/dist/core/slash-commands.js +42 -10
  246. package/dist/core/slash-commands.js.map +1 -1
  247. package/dist/core/slash-commands.test.d.ts +2 -0
  248. package/dist/core/slash-commands.test.d.ts.map +1 -0
  249. package/dist/core/slash-commands.test.js +59 -0
  250. package/dist/core/slash-commands.test.js.map +1 -0
  251. package/dist/core/speed-benchmark.test.js +9 -3
  252. package/dist/core/speed-benchmark.test.js.map +1 -1
  253. package/dist/core/subagent-manager.d.ts +8 -1
  254. package/dist/core/subagent-manager.d.ts.map +1 -1
  255. package/dist/core/subagent-manager.js +35 -2
  256. package/dist/core/subagent-manager.js.map +1 -1
  257. package/dist/core/subagent-manager.test.js +34 -0
  258. package/dist/core/subagent-manager.test.js.map +1 -1
  259. package/dist/core/subagent-store.test.js +14 -2
  260. package/dist/core/subagent-store.test.js.map +1 -1
  261. package/dist/core/verify-commands.d.ts.map +1 -1
  262. package/dist/core/verify-commands.js +1 -6
  263. package/dist/core/verify-commands.js.map +1 -1
  264. package/dist/core/verify-commands.test.js +1 -5
  265. package/dist/core/verify-commands.test.js.map +1 -1
  266. package/dist/core/workspace-guard.d.ts +40 -0
  267. package/dist/core/workspace-guard.d.ts.map +1 -0
  268. package/dist/core/workspace-guard.js +115 -0
  269. package/dist/core/workspace-guard.js.map +1 -0
  270. package/dist/core/workspace-guard.test.d.ts +2 -0
  271. package/dist/core/workspace-guard.test.d.ts.map +1 -0
  272. package/dist/core/workspace-guard.test.js +107 -0
  273. package/dist/core/workspace-guard.test.js.map +1 -0
  274. package/dist/index.d.ts +1 -1
  275. package/dist/index.d.ts.map +1 -1
  276. package/dist/index.js +1 -1
  277. package/dist/index.js.map +1 -1
  278. package/dist/modes/json-mode.d.ts +7 -0
  279. package/dist/modes/json-mode.d.ts.map +1 -1
  280. package/dist/modes/json-mode.js +10 -0
  281. package/dist/modes/json-mode.js.map +1 -1
  282. package/dist/modes/subagent-worker-mode.d.ts +2 -0
  283. package/dist/modes/subagent-worker-mode.d.ts.map +1 -1
  284. package/dist/modes/subagent-worker-mode.js +11 -0
  285. package/dist/modes/subagent-worker-mode.js.map +1 -1
  286. package/dist/session.d.ts +4 -4
  287. package/dist/session.d.ts.map +1 -1
  288. package/dist/session.js +38 -101
  289. package/dist/session.js.map +1 -1
  290. package/dist/session.test.d.ts +2 -0
  291. package/dist/session.test.d.ts.map +1 -0
  292. package/dist/session.test.js +35 -0
  293. package/dist/session.test.js.map +1 -0
  294. package/dist/system-prompt.d.ts +23 -1
  295. package/dist/system-prompt.d.ts.map +1 -1
  296. package/dist/system-prompt.js +119 -31
  297. package/dist/system-prompt.js.map +1 -1
  298. package/dist/system-prompt.test.js +154 -14
  299. package/dist/system-prompt.test.js.map +1 -1
  300. package/dist/test-support/fake-home.d.ts +20 -0
  301. package/dist/test-support/fake-home.d.ts.map +1 -0
  302. package/dist/test-support/fake-home.js +37 -0
  303. package/dist/test-support/fake-home.js.map +1 -0
  304. package/dist/tools/bash.d.ts +4 -2
  305. package/dist/tools/bash.d.ts.map +1 -1
  306. package/dist/tools/bash.js +57 -9
  307. package/dist/tools/bash.js.map +1 -1
  308. package/dist/tools/bash.test.js +156 -8
  309. package/dist/tools/bash.test.js.map +1 -1
  310. package/dist/tools/edit-robustness.test.js +3 -1
  311. package/dist/tools/edit-robustness.test.js.map +1 -1
  312. package/dist/tools/edit.d.ts +2 -1
  313. package/dist/tools/edit.d.ts.map +1 -1
  314. package/dist/tools/edit.js +7 -1
  315. package/dist/tools/edit.js.map +1 -1
  316. package/dist/tools/edit.test.js +7 -0
  317. package/dist/tools/edit.test.js.map +1 -1
  318. package/dist/tools/exit-plan.d.ts.map +1 -1
  319. package/dist/tools/exit-plan.js +15 -4
  320. package/dist/tools/exit-plan.js.map +1 -1
  321. package/dist/tools/exit-plan.test.d.ts +2 -0
  322. package/dist/tools/exit-plan.test.d.ts.map +1 -0
  323. package/dist/tools/exit-plan.test.js +72 -0
  324. package/dist/tools/exit-plan.test.js.map +1 -0
  325. package/dist/tools/find.d.ts.map +1 -1
  326. package/dist/tools/find.js +4 -1
  327. package/dist/tools/find.js.map +1 -1
  328. package/dist/tools/grep.d.ts +3 -1
  329. package/dist/tools/grep.d.ts.map +1 -1
  330. package/dist/tools/grep.js +143 -14
  331. package/dist/tools/grep.js.map +1 -1
  332. package/dist/tools/grep.test.js +59 -0
  333. package/dist/tools/grep.test.js.map +1 -1
  334. package/dist/tools/index.d.ts +14 -0
  335. package/dist/tools/index.d.ts.map +1 -1
  336. package/dist/tools/index.js +6 -5
  337. package/dist/tools/index.js.map +1 -1
  338. package/dist/tools/overflow.test.js +4 -7
  339. package/dist/tools/overflow.test.js.map +1 -1
  340. package/dist/tools/path-utils.d.ts +15 -0
  341. package/dist/tools/path-utils.d.ts.map +1 -1
  342. package/dist/tools/path-utils.js +17 -0
  343. package/dist/tools/path-utils.js.map +1 -1
  344. package/dist/tools/path-utils.test.js +7 -2
  345. package/dist/tools/path-utils.test.js.map +1 -1
  346. package/dist/tools/prompt-hints.js +1 -1
  347. package/dist/tools/prompt-hints.js.map +1 -1
  348. package/dist/tools/screenshot.js +1 -1
  349. package/dist/tools/screenshot.js.map +1 -1
  350. package/dist/tools/search-code.d.ts.map +1 -1
  351. package/dist/tools/search-code.js +6 -4
  352. package/dist/tools/search-code.js.map +1 -1
  353. package/dist/tools/skill.d.ts.map +1 -1
  354. package/dist/tools/skill.js +4 -2
  355. package/dist/tools/skill.js.map +1 -1
  356. package/dist/tools/source-path.d.ts.map +1 -1
  357. package/dist/tools/source-path.js +9 -0
  358. package/dist/tools/source-path.js.map +1 -1
  359. package/dist/tools/subagent-shared.d.ts +1 -1
  360. package/dist/tools/subagent-shared.d.ts.map +1 -1
  361. package/dist/tools/subagent-shared.js +4 -1
  362. package/dist/tools/subagent-shared.js.map +1 -1
  363. package/dist/tools/subagent-shared.test.js +21 -1
  364. package/dist/tools/subagent-shared.test.js.map +1 -1
  365. package/dist/tools/subagent.d.ts +1 -1
  366. package/dist/tools/subagent.d.ts.map +1 -1
  367. package/dist/tools/subagent.js +8 -0
  368. package/dist/tools/subagent.js.map +1 -1
  369. package/dist/tools/web-fetch.d.ts +2 -1
  370. package/dist/tools/web-fetch.d.ts.map +1 -1
  371. package/dist/tools/web-fetch.js +17 -6
  372. package/dist/tools/web-fetch.js.map +1 -1
  373. package/dist/tools/web-fetch.test.js +34 -0
  374. package/dist/tools/web-fetch.test.js.map +1 -1
  375. package/dist/tools/web-search.d.ts +2 -1
  376. package/dist/tools/web-search.d.ts.map +1 -1
  377. package/dist/tools/web-search.js +34 -7
  378. package/dist/tools/web-search.js.map +1 -1
  379. package/dist/tools/write.d.ts +2 -1
  380. package/dist/tools/write.d.ts.map +1 -1
  381. package/dist/tools/write.js +7 -1
  382. package/dist/tools/write.js.map +1 -1
  383. package/dist/tools/write.test.js +12 -0
  384. package/dist/tools/write.test.js.map +1 -1
  385. package/dist/ui/App.d.ts.map +1 -1
  386. package/dist/ui/App.js +22 -85
  387. package/dist/ui/App.js.map +1 -1
  388. package/dist/ui/app-items.d.ts +11 -12
  389. package/dist/ui/app-items.d.ts.map +1 -1
  390. package/dist/ui/app-items.js +10 -0
  391. package/dist/ui/app-items.js.map +1 -1
  392. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  393. package/dist/ui/components/ActivityIndicator.js +1 -0
  394. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  395. package/dist/ui/components/Footer.d.ts +1 -1
  396. package/dist/ui/components/Footer.js +2 -2
  397. package/dist/ui/components/Footer.js.map +1 -1
  398. package/dist/ui/components/Footer.test.js +1 -1
  399. package/dist/ui/hooks/useAgentLoop.d.ts +5 -2
  400. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  401. package/dist/ui/hooks/useAgentLoop.js +49 -8
  402. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  403. package/dist/ui/hooks/usePixelFixFlow.d.ts +1 -2
  404. package/dist/ui/hooks/usePixelFixFlow.d.ts.map +1 -1
  405. package/dist/ui/hooks/usePixelFixFlow.js +2 -5
  406. package/dist/ui/hooks/usePixelFixFlow.js.map +1 -1
  407. package/dist/ui/hooks/useTranscriptHistory.d.ts +8 -5
  408. package/dist/ui/hooks/useTranscriptHistory.d.ts.map +1 -1
  409. package/dist/ui/hooks/useTranscriptHistory.js +2 -30
  410. package/dist/ui/hooks/useTranscriptHistory.js.map +1 -1
  411. package/dist/ui/login.js +1 -1
  412. package/dist/ui/login.js.map +1 -1
  413. package/dist/ui/terminal-history-status-renderers.d.ts +1 -2
  414. package/dist/ui/terminal-history-status-renderers.d.ts.map +1 -1
  415. package/dist/ui/terminal-history-status-renderers.js +2 -15
  416. package/dist/ui/terminal-history-status-renderers.js.map +1 -1
  417. package/dist/ui/terminal-history.d.ts.map +1 -1
  418. package/dist/ui/terminal-history.js +2 -4
  419. package/dist/ui/terminal-history.js.map +1 -1
  420. package/dist/ui/thinking-level-cycle.test.js +8 -8
  421. package/dist/ui/thinking-level-cycle.test.js.map +1 -1
  422. package/dist/ui/transcript/MiscRows.d.ts +1 -4
  423. package/dist/ui/transcript/MiscRows.d.ts.map +1 -1
  424. package/dist/ui/transcript/MiscRows.js +2 -7
  425. package/dist/ui/transcript/MiscRows.js.map +1 -1
  426. package/dist/ui/transcript/TranscriptRenderer.d.ts.map +1 -1
  427. package/dist/ui/transcript/TranscriptRenderer.js +1 -3
  428. package/dist/ui/transcript/TranscriptRenderer.js.map +1 -1
  429. package/dist/ui/transcript/presentation.d.ts +1 -9
  430. package/dist/ui/transcript/presentation.d.ts.map +1 -1
  431. package/dist/ui/transcript/presentation.js +0 -9
  432. package/dist/ui/transcript/presentation.js.map +1 -1
  433. package/dist/ui/transcript/spacing.d.ts +2 -2
  434. package/dist/ui/transcript/spacing.d.ts.map +1 -1
  435. package/dist/ui/transcript/spacing.js +0 -1
  436. package/dist/ui/transcript/spacing.js.map +1 -1
  437. package/dist/ui/transcript/spacing.test.js +1 -3
  438. package/dist/ui/transcript/spacing.test.js.map +1 -1
  439. package/dist/ui/tui-history-parity.test.js +2 -9
  440. package/dist/ui/tui-history-parity.test.js.map +1 -1
  441. package/dist/utils/github.d.ts +20 -0
  442. package/dist/utils/github.d.ts.map +1 -0
  443. package/dist/utils/github.js +65 -0
  444. package/dist/utils/github.js.map +1 -0
  445. package/dist/utils/github.test.d.ts +2 -0
  446. package/dist/utils/github.test.d.ts.map +1 -0
  447. package/dist/utils/github.test.js +23 -0
  448. package/dist/utils/github.test.js.map +1 -0
  449. package/dist/utils/http-body.d.ts +19 -0
  450. package/dist/utils/http-body.d.ts.map +1 -0
  451. package/dist/utils/http-body.js +58 -0
  452. package/dist/utils/http-body.js.map +1 -0
  453. package/dist/utils/http-body.test.d.ts +2 -0
  454. package/dist/utils/http-body.test.d.ts.map +1 -0
  455. package/dist/utils/http-body.test.js +68 -0
  456. package/dist/utils/http-body.test.js.map +1 -0
  457. package/dist/utils/process.d.ts +26 -3
  458. package/dist/utils/process.d.ts.map +1 -1
  459. package/dist/utils/process.js +68 -10
  460. package/dist/utils/process.js.map +1 -1
  461. package/dist/utils/process.test.d.ts +2 -0
  462. package/dist/utils/process.test.d.ts.map +1 -0
  463. package/dist/utils/process.test.js +42 -0
  464. package/dist/utils/process.test.js.map +1 -0
  465. package/dist/utils/text.d.ts +9 -0
  466. package/dist/utils/text.d.ts.map +1 -0
  467. package/dist/utils/text.js +11 -0
  468. package/dist/utils/text.js.map +1 -0
  469. package/package.json +4 -4
@@ -0,0 +1,251 @@
1
+ import { afterAll, beforeAll, describe, expect, it } from "vitest";
2
+ import fsSync from "node:fs";
3
+ import fs from "node:fs/promises";
4
+ import os from "node:os";
5
+ import path from "node:path";
6
+ import { pathToFileURL } from "node:url";
7
+ import { spawnSync } from "node:child_process";
8
+ import { closeLogger, openLog } from "@prestyj/core";
9
+ import { LspManager } from "./manager.js";
10
+ import { removeWhenReleased } from "./test-support.js";
11
+ import { normalizeUri } from "./client.js";
12
+ import { LSP_SERVER_CATALOG, findExecutable, serverForFile } from "./servers.js";
13
+ /**
14
+ * REAL Windows LSP diagnostics — runs only on an actual Windows host (the CI
15
+ * `windows-latest` matrix leg), skipped everywhere else.
16
+ *
17
+ * Unlike `integration.test.ts` (opt-in, npm-installs its own server), this uses
18
+ * the `typescript-language-server` + `typescript` that ship as ezcoder
19
+ * dependencies, so it runs unattended on CI with no network.
20
+ *
21
+ * Why a Windows-specific test: diagnostics are cached in a Map keyed by
22
+ * `file://` URI, so our string and the server's must match EXACTLY. Two Windows
23
+ * facts break that, and BOTH had to be fixed (see `normalizeUri` and
24
+ * `canonicalPath` in client.ts): the drive letter's case, and the fact that
25
+ * TypeScript realpaths every path it loads — which on Windows expands 8.3 short
26
+ * names, so `C:\Users\RUNNER~1\…` (exactly what CI's TEMP is) comes back as
27
+ * `C:\Users\runneradmin\…`. Neither is reproducible on a POSIX host.
28
+ *
29
+ * This is the regression guard for both. If it ever returns "" again, inline
30
+ * diagnostics have silently stopped working for every Windows user.
31
+ */
32
+ describe.skipIf(process.platform !== "win32")("LSP diagnostics on a real C:\\ path", () => {
33
+ let tmpDir;
34
+ let manager;
35
+ beforeAll(async () => {
36
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-lsp-win-"));
37
+ await fs.writeFile(path.join(tmpDir, "tsconfig.json"), JSON.stringify({
38
+ compilerOptions: {
39
+ strict: true,
40
+ module: "esnext",
41
+ moduleResolution: "bundler",
42
+ target: "es2022",
43
+ },
44
+ include: ["src"],
45
+ }));
46
+ await fs.mkdir(path.join(tmpDir, "src"), { recursive: true });
47
+ // First touch is slow (server boot + project load); budget generously so a
48
+ // cold CI runner reports a real result instead of a timeout.
49
+ manager = new LspManager(tmpDir, { firstBudgetMs: 60_000, warmBudgetMs: 20_000 });
50
+ });
51
+ afterAll(async () => {
52
+ manager?.shutdownAll();
53
+ // Windows won't rmdir while the server still holds handles; retry instead
54
+ // of failing the suite in teardown after every assertion has passed.
55
+ await removeWhenReleased(tmpDir);
56
+ });
57
+ it("resolves the language server AND spawns it successfully", () => {
58
+ // Resolving the file is not the same as being able to RUN it: on Windows
59
+ // `findExecutable` happily returns a `.cmd` shim that Node then refuses to
60
+ // spawn (EINVAL, post-CVE-2024-27980). So assert on the command we would
61
+ // actually execute, and prove it starts.
62
+ expect(tmpDir).toMatch(/^[A-Za-z]:\\/);
63
+ expect(findExecutable("typescript-language-server", tmpDir)).not.toBeNull();
64
+ const spec = serverForFile(path.join(tmpDir, "src", "main.ts"), LSP_SERVER_CATALOG);
65
+ expect(spec).not.toBeNull();
66
+ const resolved = spec.resolveCommand(tmpDir);
67
+ expect(resolved).not.toBeNull();
68
+ // A Node-based server must run via process.execPath + a real script, never
69
+ // a shim — that is the rule this repo already documents for LSP + MCP.
70
+ expect(resolved.command).toBe(process.execPath);
71
+ expect(resolved.args[0]).toMatch(/\.(m?js|cjs)$/);
72
+ expect(fsSync.existsSync(resolved.args[0])).toBe(true);
73
+ const probe = spawnSync(resolved.command, [...resolved.args, "--version"], {
74
+ encoding: "utf8",
75
+ windowsHide: true,
76
+ timeout: 60_000,
77
+ });
78
+ expect(probe.error).toBeUndefined();
79
+ }, 90_000);
80
+ it("reports a type error for a file on a drive-letter path, then clears it", async () => {
81
+ const filePath = path.join(tmpDir, "src", "main.ts");
82
+ const ours = pathToFileURL(filePath).href;
83
+ expect(ours).toMatch(/^file:\/\/\/[A-Za-z]:/);
84
+ expect(normalizeUri(ours)).toMatch(/^file:\/\/\/[a-z]:/);
85
+ const broken = 'export const n: number = "not a number";\n';
86
+ await fs.writeFile(filePath, broken);
87
+ // Use the DETAILED outcome, not the string wrapper. `diagnosticsAfterWrite`
88
+ // collapses timeout / unavailable / server_failed / clean all to "", which
89
+ // is exactly why this failure was uninformative: the assertion could only
90
+ // ever say 'expected "" to contain ...'. The outcome kind names the cause,
91
+ // so a CI log tells us WHICH of those it is instead of us guessing.
92
+ const outcome = await manager.diagnosticsAfterWriteDetailed(filePath, broken);
93
+ expect(outcome.kind).toBe("diagnostics");
94
+ expect(outcome.kind === "diagnostics" && outcome.formatted).toMatch(/not assignable to type 'number'/);
95
+ const fixed = "export const n: number = 42;\n";
96
+ await fs.writeFile(filePath, fixed);
97
+ expect(await manager.diagnosticsAfterWrite(filePath, fixed)).toBe("");
98
+ }, 120_000);
99
+ it("reports diagnostics for a path containing a space", async () => {
100
+ // `C:\Users\<name>\…` and `C:\Program Files\…` routinely contain spaces,
101
+ // which percent-encode in a file:// URI — another way the two sides can
102
+ // disagree about the same file.
103
+ const dir = path.join(tmpDir, "src", "with space");
104
+ await fs.mkdir(dir, { recursive: true });
105
+ const filePath = path.join(dir, "spaced.ts");
106
+ const broken = "export const s: string = 123;\n";
107
+ await fs.writeFile(filePath, broken);
108
+ const outcome = await manager.diagnosticsAfterWriteDetailed(filePath, broken);
109
+ expect(outcome.kind).toBe("diagnostics");
110
+ expect(outcome.kind === "diagnostics" && outcome.formatted).toMatch(/not assignable to type 'string'/);
111
+ }, 120_000);
112
+ });
113
+ /**
114
+ * Isolates WHY Windows diagnostics time out, by changing exactly one variable.
115
+ *
116
+ * The suite above uses a bare project with no local `typescript`, so
117
+ * `resolveCommand` takes the BUNDLED-tsserver fallback and passes ezcoder's own
118
+ * copy via `initializationOptions.tsserver.path`. On Windows that timed out
119
+ * (measured: the full 60s budget) even though the language server resolves to
120
+ * `process.execPath` + a real script and starts in ~100ms — so the failure is
121
+ * downstream of spawning, and `initialize` itself succeeded (a failure there
122
+ * would surface as `server_failed`, not `timeout`).
123
+ *
124
+ * The one remaining difference from a real user's project is that local
125
+ * `typescript`. Give the project its own copy — a junction, which needs no
126
+ * privileges on Windows — and the two outcomes are diagnostic:
127
+ *
128
+ * passes here + times out above → the bundled-tsserver fallback is the bug,
129
+ * and it hits real users whose project has no local typescript.
130
+ * times out here too → tsserver itself can't produce diagnostics
131
+ * in this environment, and the fallback is exonerated.
132
+ *
133
+ * Runs on POSIX too (symlink), where it must pass — that keeps the control arm
134
+ * honest instead of only ever observing the broken platform.
135
+ */
136
+ describe("LSP diagnostics with the project's OWN typescript (control arm)", () => {
137
+ let tmpDir;
138
+ let manager;
139
+ let linked = false;
140
+ let traceLog = "";
141
+ let traceOpen = false;
142
+ beforeAll(async () => {
143
+ tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "gg-lsp-own-ts-"));
144
+ // Turn on JSON-RPC wire tracing and give it somewhere to land. The tracer
145
+ // writes via the shared debug logger, which DISCARDS everything until a log
146
+ // file is open (`fd === null` → return), so without this the trace would
147
+ // silently produce nothing — the same class of silent-degradation that made
148
+ // this bug hard in the first place.
149
+ process.env.GG_LSP_TRACE = "1";
150
+ traceLog = path.join(tmpDir, "lsp-trace.log");
151
+ traceOpen = openLog(traceLog, "ezcoder-test");
152
+ await fs.writeFile(path.join(tmpDir, "tsconfig.json"), JSON.stringify({
153
+ compilerOptions: {
154
+ strict: true,
155
+ module: "esnext",
156
+ moduleResolution: "bundler",
157
+ target: "es2022",
158
+ },
159
+ include: ["src"],
160
+ }));
161
+ await fs.mkdir(path.join(tmpDir, "src"), { recursive: true });
162
+ // Link ezcoder's own typescript in as if the project installed it.
163
+ const ours = findUpNodeModulesDir("typescript");
164
+ if (ours) {
165
+ await fs.mkdir(path.join(tmpDir, "node_modules"), { recursive: true });
166
+ await fs.symlink(ours, path.join(tmpDir, "node_modules", "typescript"), "junction");
167
+ linked = true;
168
+ }
169
+ manager = new LspManager(tmpDir, { firstBudgetMs: 60_000, warmBudgetMs: 20_000 });
170
+ });
171
+ afterAll(async () => {
172
+ manager?.shutdownAll();
173
+ delete process.env.GG_LSP_TRACE;
174
+ if (traceOpen)
175
+ closeLogger();
176
+ await removeWhenReleased(tmpDir);
177
+ });
178
+ it("produces diagnostics when typescript is resolvable inside the project", async () => {
179
+ expect(linked).toBe(true);
180
+ // Prove we are NOT on the bundled-tsserver code path any more.
181
+ expect(fsSync.existsSync(path.join(tmpDir, "node_modules", "typescript", "lib", "tsserver.js"))).toBe(true);
182
+ const filePath = path.join(tmpDir, "src", "main.ts");
183
+ const broken = 'export const n: number = "not a number";\n';
184
+ await fs.writeFile(filePath, broken);
185
+ const started = Date.now();
186
+ const outcome = await manager.diagnosticsAfterWriteDetailed(filePath, broken);
187
+ // Everything the CI log needs to name the cause without another round-trip:
188
+ // the outcome kind, the server's own stderr (previously discarded), and the
189
+ // JSON-RPC wire — which is the only thing that distinguishes "our didOpen
190
+ // never went out" from "the server never answered" from "it answered about
191
+ // a URI we weren't watching".
192
+ console.log(`[control arm] outcome=${outcome.kind} in ${Date.now() - started}ms\n` +
193
+ `[control arm] server stderr: ${(await serverStderr(manager)) || "(none)"}\n` +
194
+ `[control arm] wire:\n${readTrace(traceLog, traceOpen)}`);
195
+ expect(outcome.kind).toBe("diagnostics");
196
+ expect(outcome.kind === "diagnostics" && outcome.formatted).toMatch(/not assignable to type 'number'/);
197
+ }, 120_000);
198
+ });
199
+ /**
200
+ * The JSON-RPC trace for this run, trimmed to the LSP lines and capped so a
201
+ * chatty server can't bury the CI log.
202
+ */
203
+ function readTrace(traceLog, traceOpen) {
204
+ if (!traceOpen)
205
+ return "(trace log unavailable — a logger was already open)";
206
+ let raw;
207
+ try {
208
+ raw = fsSync.readFileSync(traceLog, "utf8");
209
+ }
210
+ catch {
211
+ return "(trace log unreadable)";
212
+ }
213
+ const lines = raw.split(/\r?\n/).filter((line) => line.includes("[lsp]"));
214
+ if (lines.length === 0)
215
+ return "(no rpc lines — tracer never fired)";
216
+ const head = lines.slice(0, 40);
217
+ const tail = lines.length > 60 ? lines.slice(-20) : [];
218
+ return [...head, ...(tail.length ? [` … ${lines.length - 60} more …`] : []), ...tail].join("\n");
219
+ }
220
+ /**
221
+ * The pooled client's retained stderr, for the log line above. Reaches into the
222
+ * private pool deliberately: this is a diagnostic probe, and widening the public
223
+ * API just to print stderr in one test isn't worth the surface area.
224
+ */
225
+ async function serverStderr(manager) {
226
+ // The pool stores PROMISES of resolutions, so these must be awaited — reading
227
+ // `.client` off the promise itself silently yields nothing.
228
+ const clients = manager.clients;
229
+ for (const [, pending] of clients) {
230
+ const resolution = (await pending);
231
+ if (resolution?.client)
232
+ return resolution.client.stderrTail();
233
+ }
234
+ return "";
235
+ }
236
+ /** Nearest `node_modules/<name>` walking up from this test file. */
237
+ function findUpNodeModulesDir(name) {
238
+ let dir = path.dirname(new URL(import.meta.url).pathname);
239
+ if (process.platform === "win32" && /^\/[A-Za-z]:/.test(dir))
240
+ dir = dir.slice(1);
241
+ for (;;) {
242
+ const candidate = path.join(dir, "node_modules", name);
243
+ if (fsSync.existsSync(candidate))
244
+ return fsSync.realpathSync.native(candidate);
245
+ const parent = path.dirname(dir);
246
+ if (parent === dir)
247
+ return null;
248
+ dir = parent;
249
+ }
250
+ }
251
+ //# sourceMappingURL=windows.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windows.test.js","sourceRoot":"","sources":["../../../src/core/lsp/windows.test.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,41 @@
5
5
  * to the script, or null when the package or its bin can't be resolved.
6
6
  */
7
7
  export declare function findPackageBinScript(pkgName: string, binName: string, start?: string): string | null;
8
+ /**
9
+ * Resolve a bare `npx`/`npm` into something Windows can actually spawn.
10
+ *
11
+ * Two Windows facts collide here, and the MCP SDK spawns stdio servers with
12
+ * `shell: false`, so both apply:
13
+ *
14
+ * 1. `CreateProcess` does not apply `PATHEXT`, so a bare `npx` is ENOENT —
15
+ * the real file is `npx.cmd`.
16
+ * 2. Since the CVE-2024-27980 fix, Node REFUSES to spawn a `.cmd`/`.bat` at
17
+ * all without `shell: true`, failing with EINVAL.
18
+ *
19
+ * So resolving `npx` → `npx.cmd` is necessary but NOT sufficient; the batch
20
+ * shim is a dead end, and using `shell: true` to get around it would re-open
21
+ * the command-injection hole the CVE fix closed. Instead map the shim to the
22
+ * Node CLI script it wraps (`<dir>\node_modules\npm\bin\npx-cli.js`, the
23
+ * standard Windows Node layout) and run it with `process.execPath` — the same
24
+ * "never a shim, always the real script" pattern this module already uses for
25
+ * package bins.
26
+ *
27
+ * Returns null when nothing better than the original command can be found, so
28
+ * the caller passes through and fails exactly as it does today.
29
+ */
30
+ export declare function resolveWindowsLauncher(command: string, env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, exists?: (p: string) => boolean): {
31
+ command: string;
32
+ prefixArgs: string[];
33
+ } | null;
34
+ /**
35
+ * Resolve a bare command name to a real file on Windows by walking
36
+ * PATH × PATHEXT, which `CreateProcess` does not do for a shell-less spawn.
37
+ *
38
+ * No-op off Windows, for an already-extensioned name, or when nothing matches.
39
+ * The current directory is deliberately NOT searched — a stray `npx.cmd` in the
40
+ * project must not hijack the server.
41
+ */
42
+ export declare function resolveWindowsExecutable(command: string, env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, exists?: (p: string) => boolean): string;
8
43
  /**
9
44
  * Parse an `npx`/`npm exec` command + args into the target package spec, or null
10
45
  * when the command isn't an npx/npm-exec invocation. Skips npx flags (`-y`,
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-stdio.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/resolve-stdio.ts"],"names":[],"mappings":"AA2CA;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAAmB,GACzB,MAAM,GAAG,IAAI,CAcf;AAuBD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CA0BvF;AAiED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CA8Bf;AAOD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,SAAS,MAAM,EAAO,GAC3B,oBAAoB,CAoBtB"}
1
+ {"version":3,"file":"resolve-stdio.d.ts","sourceRoot":"","sources":["../../../src/core/mcp/resolve-stdio.ts"],"names":[],"mappings":"AA2CA;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,GAAE,MAAmB,GACzB,MAAM,GAAG,IAAI,CAcf;AAuBD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,MAAM,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAuB,GAC7C;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAelD;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,MAAM,EACf,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,MAAM,GAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAuB,GAC7C,MAAM,CAwBR;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,GAAG,IAAI,CA0BvF;AAiED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CA8Bf;AAOD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,SAAS,MAAM,EAAO,GAC3B,oBAAoB,CA0BtB"}
@@ -81,6 +81,79 @@ function selectBin(bin, binName) {
81
81
  return bin[keys[0]];
82
82
  return bin[binName];
83
83
  }
84
+ /**
85
+ * Resolve a bare `npx`/`npm` into something Windows can actually spawn.
86
+ *
87
+ * Two Windows facts collide here, and the MCP SDK spawns stdio servers with
88
+ * `shell: false`, so both apply:
89
+ *
90
+ * 1. `CreateProcess` does not apply `PATHEXT`, so a bare `npx` is ENOENT —
91
+ * the real file is `npx.cmd`.
92
+ * 2. Since the CVE-2024-27980 fix, Node REFUSES to spawn a `.cmd`/`.bat` at
93
+ * all without `shell: true`, failing with EINVAL.
94
+ *
95
+ * So resolving `npx` → `npx.cmd` is necessary but NOT sufficient; the batch
96
+ * shim is a dead end, and using `shell: true` to get around it would re-open
97
+ * the command-injection hole the CVE fix closed. Instead map the shim to the
98
+ * Node CLI script it wraps (`<dir>\node_modules\npm\bin\npx-cli.js`, the
99
+ * standard Windows Node layout) and run it with `process.execPath` — the same
100
+ * "never a shim, always the real script" pattern this module already uses for
101
+ * package bins.
102
+ *
103
+ * Returns null when nothing better than the original command can be found, so
104
+ * the caller passes through and fails exactly as it does today.
105
+ */
106
+ export function resolveWindowsLauncher(command, env = process.env, platform = process.platform, exists = fs.existsSync) {
107
+ if (platform !== "win32")
108
+ return null;
109
+ const base = path.win32.basename(command, path.win32.extname(command)).toLowerCase();
110
+ if (base !== "npx" && base !== "npm")
111
+ return null;
112
+ const shim = resolveWindowsExecutable(command, env, platform, exists);
113
+ // `npx.cmd` lives beside `node.exe`, with npm's CLI scripts under
114
+ // `node_modules\npm\bin` in the same directory.
115
+ const dir = path.win32.dirname(shim);
116
+ if (dir && dir !== ".") {
117
+ const cli = path.win32.join(dir, "node_modules", "npm", "bin", `${base}-cli.js`);
118
+ if (exists(cli))
119
+ return { command: process.execPath, prefixArgs: [cli] };
120
+ }
121
+ return null;
122
+ }
123
+ /**
124
+ * Resolve a bare command name to a real file on Windows by walking
125
+ * PATH × PATHEXT, which `CreateProcess` does not do for a shell-less spawn.
126
+ *
127
+ * No-op off Windows, for an already-extensioned name, or when nothing matches.
128
+ * The current directory is deliberately NOT searched — a stray `npx.cmd` in the
129
+ * project must not hijack the server.
130
+ */
131
+ export function resolveWindowsExecutable(command, env = process.env, platform = process.platform, exists = fs.existsSync) {
132
+ if (platform !== "win32")
133
+ return command;
134
+ if (path.win32.extname(command))
135
+ return command;
136
+ const exts = (env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD")
137
+ .split(";")
138
+ .map((e) => e.trim())
139
+ .filter(Boolean);
140
+ // An explicit path (relative or absolute) is resolved in place, not via PATH.
141
+ if (path.win32.dirname(command) !== ".") {
142
+ for (const ext of exts) {
143
+ if (exists(`${command}${ext}`))
144
+ return `${command}${ext}`;
145
+ }
146
+ return command;
147
+ }
148
+ for (const dir of (env.PATH ?? env.Path ?? "").split(";").filter(Boolean)) {
149
+ for (const ext of exts) {
150
+ const candidate = path.win32.join(dir, `${command}${ext}`);
151
+ if (exists(candidate))
152
+ return candidate;
153
+ }
154
+ }
155
+ return command;
156
+ }
84
157
  /**
85
158
  * Parse an `npx`/`npm exec` command + args into the target package spec, or null
86
159
  * when the command isn't an npx/npm-exec invocation. Skips npx flags (`-y`,
@@ -247,7 +320,13 @@ function binNameFor(pkgName) {
247
320
  * package isn't cached yet — the true first run, which npx then installs).
248
321
  */
249
322
  export function resolveStdioCommand(command, args = []) {
250
- const passthrough = { command, args: [...args] };
323
+ // Windows can't spawn a bare `npx` (no PATHEXT) or its `.cmd` shim (EINVAL
324
+ // since the CVE-2024-27980 fix) without a shell, so passthrough resolves to
325
+ // `node <npx-cli.js>`. No-op elsewhere.
326
+ const launcher = resolveWindowsLauncher(command);
327
+ const passthrough = launcher
328
+ ? { command: launcher.command, args: [...launcher.prefixArgs, ...args] }
329
+ : { command, args: [...args] };
251
330
  const pkgSpec = parseNpxPackage(command, args);
252
331
  if (!pkgSpec)
253
332
  return passthrough;
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-stdio.js","sourceRoot":"","sources":["../../../src/core/mcp/resolve-stdio.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve-stdio.js","sourceRoot":"","sources":["../../../src/core/mcp/resolve-stdio.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { afterEach, describe, it, expect } from "vitest";
2
+ import { spawnSync } from "node:child_process";
2
3
  import fs from "node:fs";
3
4
  import os from "node:os";
4
5
  import path from "node:path";
5
- import { parseNpxPackage, findPackageBinScript, resolveStdioCommand } from "./resolve-stdio.js";
6
+ import { parseNpxPackage, findPackageBinScript, resolveStdioCommand, resolveWindowsExecutable, resolveWindowsLauncher, } from "./resolve-stdio.js";
6
7
  /** Lay out a fake npx cache entry: `<cache>/_npx/<hash>/node_modules/<pkg>`
7
8
  * with a package.json + real bin file. Returns the cache root to point
8
9
  * `npm_config_cache` at. */
@@ -65,7 +66,9 @@ describe("resolveStdioCommand", () => {
65
66
  // [binScript, "--flag", "value"] — the `--` separator is dropped.
66
67
  expect(out.args.slice(1)).toEqual(["--flag", "value"]);
67
68
  });
68
- it("passes through an npx server that isn't locally resolvable", () => {
69
+ // Windows cannot spawn a bare `npx` shell-lessly, so "passthrough" there
70
+ // means `node <npx-cli.js>` with the original args preserved after it.
71
+ it.skipIf(process.platform === "win32")("passes through an npx server that isn't locally resolvable", () => {
69
72
  const out = resolveStdioCommand("npx", ["-y", "@vendor/not-installed-mcp"]);
70
73
  expect(out.command).toBe("npx");
71
74
  expect(out.args).toEqual(["-y", "@vendor/not-installed-mcp"]);
@@ -101,9 +104,11 @@ describe("resolveStdioCommand npx-cache fallback (covers user-added MCPs)", () =
101
104
  seedNpxCache(tmp, "hash1", "@vendor/cool-mcp", "1.0.0");
102
105
  process.env.npm_config_cache = tmp;
103
106
  // Requested @2.0.0, only 1.0.0 cached → do NOT rewrite to the wrong version.
107
+ // The npx invocation is preserved; only its launcher differs by OS.
104
108
  const out = resolveStdioCommand("npx", ["-y", "@vendor/cool-mcp@2.0.0"]);
105
- expect(out.command).toBe("npx");
106
- expect(out.args).toEqual(["-y", "@vendor/cool-mcp@2.0.0"]);
109
+ expect(out.args.slice(-2)).toEqual(["-y", "@vendor/cool-mcp@2.0.0"]);
110
+ if (process.platform !== "win32")
111
+ expect(out.command).toBe("npx");
107
112
  });
108
113
  it("uses a cached copy whose version matches the pin exactly", () => {
109
114
  tmp = fs.mkdtempSync(path.join(os.tmpdir(), "gg-npx-cache-"));
@@ -141,4 +146,94 @@ describe("resolveStdioCommand npx-cache fallback (covers user-added MCPs)", () =
141
146
  expect(out.args[0]).toMatch(/mcp-server[/\\]build[/\\]index\.js$/);
142
147
  });
143
148
  });
149
+ describe("resolveWindowsLauncher", () => {
150
+ const exists = (present) => (p) => present.includes(p);
151
+ const env = { PATH: "C:\\nodejs", PATHEXT: ".cmd" };
152
+ it("maps npx to node + npm's npx-cli.js (the .cmd shim is unspawnable)", () => {
153
+ const got = resolveWindowsLauncher("npx", env, "win32", exists(["C:\\nodejs\\npx.cmd", "C:\\nodejs\\node_modules\\npm\\bin\\npx-cli.js"]));
154
+ expect(got).toEqual({
155
+ command: process.execPath,
156
+ prefixArgs: ["C:\\nodejs\\node_modules\\npm\\bin\\npx-cli.js"],
157
+ });
158
+ });
159
+ it("maps npm to its own CLI script", () => {
160
+ const got = resolveWindowsLauncher("npm", env, "win32", exists(["C:\\nodejs\\npm.cmd", "C:\\nodejs\\node_modules\\npm\\bin\\npm-cli.js"]));
161
+ expect(got?.prefixArgs).toEqual(["C:\\nodejs\\node_modules\\npm\\bin\\npm-cli.js"]);
162
+ });
163
+ it("returns null off Windows, for other commands, and when the CLI is absent", () => {
164
+ expect(resolveWindowsLauncher("npx", env, "darwin", () => true)).toBeNull();
165
+ expect(resolveWindowsLauncher("some-server", env, "win32", () => true)).toBeNull();
166
+ expect(resolveWindowsLauncher("npx", env, "win32", exists(["C:\\nodejs\\npx.cmd"]))).toBeNull();
167
+ });
168
+ });
169
+ describe("resolveWindowsExecutable", () => {
170
+ const exists = (present) => (p) => present.includes(p);
171
+ it("resolves a bare npx to npx.cmd via PATH x PATHEXT", () => {
172
+ // The MCP SDK spawns with shell:false and CreateProcess ignores PATHEXT,
173
+ // so a bare "npx" is ENOENT on Windows even though npx.cmd is right there.
174
+ expect(resolveWindowsExecutable("npx", { PATH: "C:\\nodejs;C:\\other", PATHEXT: ".com;.exe;.cmd" }, "win32", exists(["C:\\nodejs\\npx.cmd"]))).toBe("C:\\nodejs\\npx.cmd");
175
+ });
176
+ it("honors Windows' lowercase Path spelling", () => {
177
+ expect(resolveWindowsExecutable("npx", { Path: "C:\\nodejs", PATHEXT: ".cmd" }, "win32", exists(["C:\\nodejs\\npx.cmd"]))).toBe("C:\\nodejs\\npx.cmd");
178
+ });
179
+ it("never searches the current directory (no hijack by a local npx.cmd)", () => {
180
+ expect(resolveWindowsExecutable("npx", { PATH: "C:\\nodejs", PATHEXT: ".cmd" }, "win32", exists(["npx.cmd"]))).toBe("npx");
181
+ });
182
+ it("extends an explicit path in place", () => {
183
+ expect(resolveWindowsExecutable("C:\\tools\\server", { PATHEXT: ".exe" }, "win32", exists(["C:\\tools\\server.exe"]))).toBe("C:\\tools\\server.exe");
184
+ });
185
+ it("passes through off Windows, when extensioned, and when unresolvable", () => {
186
+ expect(resolveWindowsExecutable("npx", { PATH: "/usr/bin" }, "darwin", () => true)).toBe("npx");
187
+ expect(resolveWindowsExecutable("npx.cmd", {}, "win32", () => true)).toBe("npx.cmd");
188
+ expect(resolveWindowsExecutable("npx", { PATH: "C:\\nodejs" }, "win32", () => false)).toBe("npx");
189
+ });
190
+ });
191
+ /**
192
+ * REAL Windows launcher resolution — runs only on an actual Windows host (the
193
+ * CI `windows-latest` matrix leg), skipped everywhere else.
194
+ *
195
+ * The unit tests above inject a fake PATH and a fake `exists`, so they only
196
+ * prove the algorithm. This proves the PREMISE, and it is the reason the fix
197
+ * is what it is: on a real Windows box a bare `npx` is ENOENT for a shell-less
198
+ * spawn, AND the `npx.cmd` it resolves to is ALSO unspawnable (EINVAL, since
199
+ * the CVE-2024-27980 hardening). Only `node <npx-cli.js>` actually runs — a
200
+ * fact no mocked test could have told us.
201
+ */
202
+ describe.skipIf(process.platform !== "win32")("npx launching on real Windows", () => {
203
+ const run = (command, args) => spawnSync(command, args, { shell: false, encoding: "utf8", windowsHide: true });
204
+ it("confirms neither bare npx nor its .cmd shim can be spawned shell-lessly", () => {
205
+ const bare = run("npx", ["--version"]);
206
+ expect(bare.error?.code).toBe("ENOENT");
207
+ // resolveWindowsExecutable does find the real file on PATH…
208
+ const shim = resolveWindowsExecutable("npx");
209
+ expect(shim).not.toBe("npx");
210
+ expect(fs.existsSync(shim)).toBe(true);
211
+ expect(path.extname(shim).toLowerCase()).toBe(".cmd");
212
+ // …but Node refuses to execute a .cmd without a shell, so resolving the
213
+ // shim alone would NOT have fixed anything.
214
+ expect(run(shim, ["--version"]).error?.code).toBe("EINVAL");
215
+ }, 60_000);
216
+ it("resolves npx to a node + CLI-script invocation that really runs", () => {
217
+ const launcher = resolveWindowsLauncher("npx");
218
+ if (!launcher)
219
+ throw new Error("expected a Windows npx launcher");
220
+ expect(launcher.command).toBe(process.execPath);
221
+ expect(launcher.prefixArgs[0]).toMatch(/npx-cli\.js$/);
222
+ expect(fs.existsSync(launcher.prefixArgs[0])).toBe(true);
223
+ const out = run(launcher.command, [...launcher.prefixArgs, "--version"]);
224
+ expect(out.error).toBeUndefined();
225
+ expect(out.status).toBe(0);
226
+ expect(out.stdout.trim()).toMatch(/^\d+\.\d+\.\d+/);
227
+ }, 60_000);
228
+ it("hands the MCP SDK a spawnable command for the ubiquitous npx config", () => {
229
+ // `{ "command": "npx", "args": ["-y", …] }` is the most common MCP config
230
+ // in existence. Even on the passthrough branch (package not resolvable),
231
+ // what we hand the SDK must be executable, or the server dies as an opaque
232
+ // "Connection closed".
233
+ const out = resolveStdioCommand("npx", ["-y", "definitely-not-a-real-package-xyz"]);
234
+ expect(out.command).toBe(process.execPath);
235
+ expect(fs.existsSync(out.args[0])).toBe(true);
236
+ expect(out.args.slice(-2)).toEqual(["-y", "definitely-not-a-real-package-xyz"]);
237
+ });
238
+ });
144
239
  //# sourceMappingURL=resolve-stdio.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-stdio.test.js","sourceRoot":"","sources":["../../../src/core/mcp/resolve-stdio.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolve-stdio.test.js","sourceRoot":"","sources":["../../../src/core/mcp/resolve-stdio.test.ts"],"names":[],"mappings":"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"}