command-stream 0.8.2 → 0.9.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 (500) hide show
  1. package/js/examples/01-basic-streaming.mjs +14 -0
  2. package/js/examples/02-async-iterator.mjs +9 -0
  3. package/js/examples/03-file-and-console.mjs +16 -0
  4. package/js/examples/04-claude-jq-pipe.mjs +16 -0
  5. package/js/examples/CI-DEBUG-README.md +138 -0
  6. package/js/examples/README-examples.mjs +111 -0
  7. package/js/examples/README.md +345 -0
  8. package/js/examples/STREAMING_INTERFACES_SUMMARY.md +116 -0
  9. package/js/examples/add-test-timeouts.js +107 -0
  10. package/js/examples/ansi-default-preserved.mjs +11 -0
  11. package/js/examples/ansi-global-config.mjs +12 -0
  12. package/js/examples/ansi-reset-default.mjs +12 -0
  13. package/js/examples/ansi-strip-utils.mjs +12 -0
  14. package/js/examples/baseline-child-process.mjs +23 -0
  15. package/js/examples/baseline-claude-test.mjs +47 -0
  16. package/js/examples/baseline-working.mjs +34 -0
  17. package/js/examples/capture-mirror-comparison.mjs +23 -0
  18. package/js/examples/capture-mirror-default.mjs +11 -0
  19. package/js/examples/capture-mirror-performance.mjs +16 -0
  20. package/js/examples/capture-mirror-show-only.mjs +16 -0
  21. package/js/examples/capture-mirror-silent-processing.mjs +16 -0
  22. package/js/examples/ci-debug-baseline-vs-library.mjs +265 -0
  23. package/js/examples/ci-debug-es-module-loading.mjs +184 -0
  24. package/js/examples/ci-debug-signal-handling.mjs +225 -0
  25. package/js/examples/ci-debug-stdout-buffering.mjs +94 -0
  26. package/js/examples/ci-debug-test-timeouts.mjs +259 -0
  27. package/js/examples/claude-exact-file-output.mjs +20 -0
  28. package/js/examples/claude-exact-jq.mjs +13 -0
  29. package/js/examples/claude-exact-streaming.mjs +13 -0
  30. package/js/examples/claude-jq-pipeline.mjs +13 -0
  31. package/js/examples/claude-json-stream.mjs +39 -0
  32. package/js/examples/claude-streaming-basic.mjs +99 -0
  33. package/js/examples/claude-streaming-demo.mjs +126 -0
  34. package/js/examples/claude-streaming-final.mjs +20 -0
  35. package/js/examples/cleanup-verification-test.mjs +115 -0
  36. package/js/examples/colors-buffer-processing.mjs +14 -0
  37. package/js/examples/colors-default-preserved.mjs +15 -0
  38. package/js/examples/colors-per-command-config.mjs +15 -0
  39. package/js/examples/colors-strip-ansi.mjs +13 -0
  40. package/js/examples/commandstream-jq.mjs +29 -0
  41. package/js/examples/commandstream-working.mjs +23 -0
  42. package/js/examples/comprehensive-streams-demo.mjs +121 -0
  43. package/js/examples/ctrl-c-concurrent-processes.mjs +20 -0
  44. package/js/examples/ctrl-c-long-running-command.mjs +20 -0
  45. package/js/examples/ctrl-c-real-system-command.mjs +17 -0
  46. package/js/examples/ctrl-c-sleep-command.mjs +17 -0
  47. package/js/examples/ctrl-c-stdin-forwarding.mjs +20 -0
  48. package/js/examples/ctrl-c-virtual-command.mjs +17 -0
  49. package/js/examples/debug-already-started.mjs +20 -0
  50. package/js/examples/debug-ansi-processing.mjs +42 -0
  51. package/js/examples/debug-basic-streaming.mjs +44 -0
  52. package/js/examples/debug-buildshellcommand.mjs +82 -0
  53. package/js/examples/debug-child-process.mjs +43 -0
  54. package/js/examples/debug-child-state.mjs +55 -0
  55. package/js/examples/debug-chunking.mjs +38 -0
  56. package/js/examples/debug-command-parsing.mjs +61 -0
  57. package/js/examples/debug-complete-consolidation.mjs +97 -0
  58. package/js/examples/debug-echo-args.mjs +22 -0
  59. package/js/examples/debug-emit-timing.mjs +28 -0
  60. package/js/examples/debug-end-event.mjs +56 -0
  61. package/js/examples/debug-errexit.mjs +16 -0
  62. package/js/examples/debug-event-emission.mjs +40 -0
  63. package/js/examples/debug-event-timing.mjs +67 -0
  64. package/js/examples/debug-event-vs-result.mjs +30 -0
  65. package/js/examples/debug-exact-command.mjs +28 -0
  66. package/js/examples/debug-exact-test-scenario.mjs +44 -0
  67. package/js/examples/debug-execution-path.mjs +27 -0
  68. package/js/examples/debug-exit-command.mjs +38 -0
  69. package/js/examples/debug-exit-virtual.mjs +54 -0
  70. package/js/examples/debug-finish-consolidation.mjs +44 -0
  71. package/js/examples/debug-force-cleanup.mjs +47 -0
  72. package/js/examples/debug-getter-basic.mjs +13 -0
  73. package/js/examples/debug-getter-direct.mjs +23 -0
  74. package/js/examples/debug-getter-internals.mjs +61 -0
  75. package/js/examples/debug-handler-detection.mjs +65 -0
  76. package/js/examples/debug-idempotent-finish.mjs +54 -0
  77. package/js/examples/debug-idempotent-kill.mjs +58 -0
  78. package/js/examples/debug-interpolation-individual.mjs +88 -0
  79. package/js/examples/debug-interpolation-issue.mjs +101 -0
  80. package/js/examples/debug-jq-streaming.mjs +57 -0
  81. package/js/examples/debug-jq-tty-colors.mjs +168 -0
  82. package/js/examples/debug-kill-cleanup.mjs +56 -0
  83. package/js/examples/debug-kill-method.mjs +33 -0
  84. package/js/examples/debug-listener-interference.mjs +38 -0
  85. package/js/examples/debug-listener-lifecycle.mjs +50 -0
  86. package/js/examples/debug-listener-timing.mjs +62 -0
  87. package/js/examples/debug-listeners-property.mjs +34 -0
  88. package/js/examples/debug-map-methods.mjs +39 -0
  89. package/js/examples/debug-not-awaited-cleanup.mjs +106 -0
  90. package/js/examples/debug-off-method.mjs +28 -0
  91. package/js/examples/debug-option-merging.mjs +17 -0
  92. package/js/examples/debug-options.mjs +36 -0
  93. package/js/examples/debug-output.mjs +25 -0
  94. package/js/examples/debug-pattern-matching.mjs +69 -0
  95. package/js/examples/debug-pipeline-cat.mjs +28 -0
  96. package/js/examples/debug-pipeline-cleanup.mjs +71 -0
  97. package/js/examples/debug-pipeline-error-detailed.mjs +78 -0
  98. package/js/examples/debug-pipeline-error.mjs +65 -0
  99. package/js/examples/debug-pipeline-issue.mjs +26 -0
  100. package/js/examples/debug-pipeline-method.mjs +22 -0
  101. package/js/examples/debug-pipeline-stream.mjs +66 -0
  102. package/js/examples/debug-pipeline.mjs +14 -0
  103. package/js/examples/debug-process-exit-trace.mjs +41 -0
  104. package/js/examples/debug-process-path.mjs +38 -0
  105. package/js/examples/debug-property-check.mjs +29 -0
  106. package/js/examples/debug-resource-cleanup.mjs +83 -0
  107. package/js/examples/debug-shell-args.mjs +103 -0
  108. package/js/examples/debug-sigint-child-handler.mjs +44 -0
  109. package/js/examples/debug-sigint-forwarding.mjs +61 -0
  110. package/js/examples/debug-sigint-handler-install.mjs +79 -0
  111. package/js/examples/debug-sigint-handler-order.mjs +85 -0
  112. package/js/examples/debug-sigint-listeners.mjs +48 -0
  113. package/js/examples/debug-sigint-start-pattern.mjs +62 -0
  114. package/js/examples/debug-sigint-timer.mjs +40 -0
  115. package/js/examples/debug-simple-command.mjs +49 -0
  116. package/js/examples/debug-simple-getter.mjs +30 -0
  117. package/js/examples/debug-simple.mjs +39 -0
  118. package/js/examples/debug-simplified-finished.mjs +102 -0
  119. package/js/examples/debug-stack-overflow.mjs +25 -0
  120. package/js/examples/debug-stdin-simple.mjs +28 -0
  121. package/js/examples/debug-stdin.mjs +28 -0
  122. package/js/examples/debug-stream-emitter-isolated.mjs +45 -0
  123. package/js/examples/debug-stream-emitter.mjs +25 -0
  124. package/js/examples/debug-stream-events.mjs +70 -0
  125. package/js/examples/debug-stream-generator.mjs +23 -0
  126. package/js/examples/debug-stream-getter-issue.mjs +37 -0
  127. package/js/examples/debug-stream-getter.mjs +19 -0
  128. package/js/examples/debug-stream-internals.mjs +64 -0
  129. package/js/examples/debug-stream-method.mjs +46 -0
  130. package/js/examples/debug-stream-object.mjs +58 -0
  131. package/js/examples/debug-stream-properties.mjs +37 -0
  132. package/js/examples/debug-stream-timing.mjs +28 -0
  133. package/js/examples/debug-streaming.mjs +24 -0
  134. package/js/examples/debug-test-isolation.mjs +54 -0
  135. package/js/examples/debug-test-state.mjs +27 -0
  136. package/js/examples/debug-user-sigint.mjs +19 -0
  137. package/js/examples/debug-virtual-disable.mjs +21 -0
  138. package/js/examples/debug-virtual-vs-real.mjs +68 -0
  139. package/js/examples/debug-with-trace.mjs +23 -0
  140. package/js/examples/debug_parent_stream.mjs +22 -0
  141. package/js/examples/emulate-claude-stream.mjs +30 -0
  142. package/js/examples/emulated-streaming-direct.mjs +22 -0
  143. package/js/examples/emulated-streaming-jq-pipe.mjs +22 -0
  144. package/js/examples/emulated-streaming-sh-pipe.mjs +23 -0
  145. package/js/examples/events-build-process.mjs +73 -0
  146. package/js/examples/events-concurrent-streams.mjs +51 -0
  147. package/js/examples/events-error-handling.mjs +59 -0
  148. package/js/examples/events-file-monitoring.mjs +66 -0
  149. package/js/examples/events-interactive-simulation.mjs +69 -0
  150. package/js/examples/events-log-processing.mjs +72 -0
  151. package/js/examples/events-network-monitoring.mjs +68 -0
  152. package/js/examples/events-ping-basic.mjs +37 -0
  153. package/js/examples/events-progress-tracking.mjs +55 -0
  154. package/js/examples/events-stdin-input.mjs +34 -0
  155. package/js/examples/example-ansi-ls.mjs +39 -0
  156. package/js/examples/example-top.mjs +27 -0
  157. package/js/examples/final-ping-stdin-proof.mjs +88 -0
  158. package/js/examples/final-test-shell-operators.mjs +123 -0
  159. package/js/examples/final-working-examples.mjs +162 -0
  160. package/js/examples/gh-auth-test.mjs +103 -0
  161. package/js/examples/gh-delete-hang-test.mjs +79 -0
  162. package/js/examples/gh-gist-creation-test.mjs +276 -0
  163. package/js/examples/gh-gist-minimal-test.mjs +89 -0
  164. package/js/examples/gh-hang-exact-original.mjs +83 -0
  165. package/js/examples/gh-hang-reproduction.mjs +151 -0
  166. package/js/examples/gh-hang-test-with-redirect.mjs +45 -0
  167. package/js/examples/gh-hang-test-without-redirect.mjs +43 -0
  168. package/js/examples/gh-minimal-hang-check.mjs +33 -0
  169. package/js/examples/gh-operations-with-cd.mjs +187 -0
  170. package/js/examples/gh-output-test.mjs +102 -0
  171. package/js/examples/gh-reproduce-hang.mjs +41 -0
  172. package/js/examples/git-operations-with-cd.mjs +186 -0
  173. package/js/examples/interactive-math-calc.mjs +45 -0
  174. package/js/examples/interactive-top-fixed.mjs +25 -0
  175. package/js/examples/interactive-top-improved.mjs +72 -0
  176. package/js/examples/interactive-top-pty-logging.mjs +69 -0
  177. package/js/examples/interactive-top-pty.mjs +27 -0
  178. package/js/examples/interactive-top-with-logging.mjs +56 -0
  179. package/js/examples/interactive-top.mjs +29 -0
  180. package/js/examples/jq-color-demo.mjs +53 -0
  181. package/js/examples/jq-colors-streaming.mjs +42 -0
  182. package/js/examples/manual-ctrl-c-test.mjs +50 -0
  183. package/js/examples/methods-multiple-options.mjs +25 -0
  184. package/js/examples/methods-run-basic.mjs +10 -0
  185. package/js/examples/methods-start-basic.mjs +10 -0
  186. package/js/examples/node-compat-data-events.mjs +36 -0
  187. package/js/examples/node-compat-readable-event.mjs +29 -0
  188. package/js/examples/node-compat-small-buffer.mjs +33 -0
  189. package/js/examples/options-capture-false.mjs +12 -0
  190. package/js/examples/options-combined-settings.mjs +13 -0
  191. package/js/examples/options-custom-input.mjs +16 -0
  192. package/js/examples/options-default-behavior.mjs +10 -0
  193. package/js/examples/options-maximum-performance.mjs +15 -0
  194. package/js/examples/options-mirror-false.mjs +10 -0
  195. package/js/examples/options-performance-mode.mjs +13 -0
  196. package/js/examples/options-performance-optimization.mjs +14 -0
  197. package/js/examples/options-run-alias-demo.mjs +15 -0
  198. package/js/examples/options-run-alias.mjs +10 -0
  199. package/js/examples/options-silent-execution.mjs +14 -0
  200. package/js/examples/options-streaming-capture.mjs +24 -0
  201. package/js/examples/options-streaming-multiple.mjs +35 -0
  202. package/js/examples/options-streaming-silent.mjs +21 -0
  203. package/js/examples/options-streaming-stdin.mjs +21 -0
  204. package/js/examples/ping-streaming-filtered.mjs +22 -0
  205. package/js/examples/ping-streaming-interruptible.mjs +47 -0
  206. package/js/examples/ping-streaming-silent.mjs +24 -0
  207. package/js/examples/ping-streaming-simple.mjs +13 -0
  208. package/js/examples/ping-streaming-statistics.mjs +49 -0
  209. package/js/examples/ping-streaming-timestamps.mjs +22 -0
  210. package/js/examples/ping-streaming.mjs +48 -0
  211. package/js/examples/prove-ping-stdin-limitation.mjs +94 -0
  212. package/js/examples/readme-example.mjs +39 -0
  213. package/js/examples/realtime-json-stream.mjs +143 -0
  214. package/js/examples/reliable-stdin-commands.mjs +135 -0
  215. package/js/examples/reproduce-issue-135-v2.mjs +15 -0
  216. package/js/examples/reproduce-issue-135.mjs +17 -0
  217. package/js/examples/shell-cd-behavior.mjs +88 -0
  218. package/js/examples/sigint-forwarding-test.mjs +60 -0
  219. package/js/examples/sigint-handler-test.mjs +72 -0
  220. package/js/examples/simple-async-test.mjs +49 -0
  221. package/js/examples/simple-claude-test.mjs +17 -0
  222. package/js/examples/simple-event-test.mjs +33 -0
  223. package/js/examples/simple-jq-streaming.mjs +48 -0
  224. package/js/examples/simple-stream-demo.mjs +35 -0
  225. package/js/examples/simple-test-sleep.js +30 -0
  226. package/js/examples/simple-working-stdin.mjs +30 -0
  227. package/js/examples/streaming-behavior-test.mjs +116 -0
  228. package/js/examples/streaming-direct-command.mjs +21 -0
  229. package/js/examples/streaming-filtered-output.mjs +33 -0
  230. package/js/examples/streaming-grep-pipeline.mjs +21 -0
  231. package/js/examples/streaming-interactive-stdin.mjs +24 -0
  232. package/js/examples/streaming-jq-pipeline.mjs +23 -0
  233. package/js/examples/streaming-multistage-pipeline.mjs +23 -0
  234. package/js/examples/streaming-pipes-event-pattern.mjs +27 -0
  235. package/js/examples/streaming-pipes-multistage.mjs +22 -0
  236. package/js/examples/streaming-pipes-realtime-jq.mjs +23 -0
  237. package/js/examples/streaming-progress-tracking.mjs +34 -0
  238. package/js/examples/streaming-reusable-configs.mjs +52 -0
  239. package/js/examples/streaming-silent-capture.mjs +20 -0
  240. package/js/examples/streaming-test-simple.mjs +70 -0
  241. package/js/examples/streaming-virtual-pipeline.mjs +18 -0
  242. package/js/examples/syntax-basic-comparison.mjs +31 -0
  243. package/js/examples/syntax-basic-options.mjs +12 -0
  244. package/js/examples/syntax-combined-options.mjs +19 -0
  245. package/js/examples/syntax-command-chaining.mjs +12 -0
  246. package/js/examples/syntax-custom-directory.mjs +10 -0
  247. package/js/examples/syntax-custom-environment.mjs +13 -0
  248. package/js/examples/syntax-custom-stdin.mjs +10 -0
  249. package/js/examples/syntax-mixed-regular.mjs +11 -0
  250. package/js/examples/syntax-mixed-usage.mjs +15 -0
  251. package/js/examples/syntax-multiple-listeners.mjs +87 -0
  252. package/js/examples/syntax-piping-comparison.mjs +32 -0
  253. package/js/examples/syntax-reusable-config.mjs +16 -0
  254. package/js/examples/syntax-reusable-configs.mjs +21 -0
  255. package/js/examples/syntax-silent-operations.mjs +10 -0
  256. package/js/examples/syntax-stdin-option.mjs +12 -0
  257. package/js/examples/temp-sigint-test.mjs +21 -0
  258. package/js/examples/test-actual-buildshell.mjs +44 -0
  259. package/js/examples/test-async-streams-working.mjs +102 -0
  260. package/js/examples/test-async-streams.mjs +90 -0
  261. package/js/examples/test-auth-parse.mjs +74 -0
  262. package/js/examples/test-auto-quoting.mjs +57 -0
  263. package/js/examples/test-auto-start-fix.mjs +95 -0
  264. package/js/examples/test-baseline-sigint.mjs +38 -0
  265. package/js/examples/test-buffer-behavior.mjs +39 -0
  266. package/js/examples/test-buffers-simple.mjs +35 -0
  267. package/js/examples/test-bun-specific-issue.mjs +106 -0
  268. package/js/examples/test-bun-streaming.mjs +81 -0
  269. package/js/examples/test-cat-direct.mjs +41 -0
  270. package/js/examples/test-cat-pipe.mjs +34 -0
  271. package/js/examples/test-cd-behavior.mjs +42 -0
  272. package/js/examples/test-child-process-timing.mjs +53 -0
  273. package/js/examples/test-child-sigint-handler.mjs +62 -0
  274. package/js/examples/test-cleanup-simple.mjs +21 -0
  275. package/js/examples/test-comprehensive-tracing.mjs +58 -0
  276. package/js/examples/test-correct-space-handling.mjs +46 -0
  277. package/js/examples/test-ctrl-c-debug.mjs +44 -0
  278. package/js/examples/test-ctrl-c-inherit.mjs +30 -0
  279. package/js/examples/test-ctrl-c-sleep.mjs +31 -0
  280. package/js/examples/test-ctrl-c.mjs +17 -0
  281. package/js/examples/test-debug-new-options.mjs +55 -0
  282. package/js/examples/test-debug-pty.mjs +49 -0
  283. package/js/examples/test-debug-tee.mjs +38 -0
  284. package/js/examples/test-debug.mjs +25 -0
  285. package/js/examples/test-direct-jq.mjs +47 -0
  286. package/js/examples/test-direct-pipe-reading.mjs +119 -0
  287. package/js/examples/test-direct-pipe.sh +28 -0
  288. package/js/examples/test-double-quoting-prevention.mjs +138 -0
  289. package/js/examples/test-edge-cases-quoting.mjs +89 -0
  290. package/js/examples/test-events.mjs +37 -0
  291. package/js/examples/test-explicit-stdio.mjs +51 -0
  292. package/js/examples/test-final-streaming.mjs +71 -0
  293. package/js/examples/test-fix.mjs +71 -0
  294. package/js/examples/test-incremental-streaming.mjs +46 -0
  295. package/js/examples/test-individual-spawn.mjs +35 -0
  296. package/js/examples/test-inherit-stdout-not-stdin.mjs +133 -0
  297. package/js/examples/test-injection-protection.mjs +77 -0
  298. package/js/examples/test-interactive-streaming.mjs +140 -0
  299. package/js/examples/test-interactive-top.md +24 -0
  300. package/js/examples/test-interactive.mjs +17 -0
  301. package/js/examples/test-interpolation.mjs +14 -0
  302. package/js/examples/test-interrupt.mjs +40 -0
  303. package/js/examples/test-issue-135-comprehensive.mjs +41 -0
  304. package/js/examples/test-issue12-detailed.mjs +89 -0
  305. package/js/examples/test-issue12-exact.mjs +33 -0
  306. package/js/examples/test-jq-color.mjs +57 -0
  307. package/js/examples/test-jq-colors.mjs +41 -0
  308. package/js/examples/test-jq-compact.mjs +33 -0
  309. package/js/examples/test-jq-native.sh +10 -0
  310. package/js/examples/test-jq-pipeline-behavior.mjs +80 -0
  311. package/js/examples/test-jq-realtime.mjs +40 -0
  312. package/js/examples/test-manual-start.mjs +54 -0
  313. package/js/examples/test-mixed-quoting.mjs +88 -0
  314. package/js/examples/test-multi-stream.mjs +50 -0
  315. package/js/examples/test-multistage-debug.mjs +44 -0
  316. package/js/examples/test-native-spawn-vs-command-stream.mjs +154 -0
  317. package/js/examples/test-no-parse-pipeline.mjs +33 -0
  318. package/js/examples/test-non-virtual.mjs +52 -0
  319. package/js/examples/test-operators.mjs +53 -0
  320. package/js/examples/test-parent-continues.mjs +44 -0
  321. package/js/examples/test-path-interpolation.mjs +86 -0
  322. package/js/examples/test-ping-kill-and-stdin.mjs +98 -0
  323. package/js/examples/test-ping.mjs +12 -0
  324. package/js/examples/test-pty-spawn.mjs +101 -0
  325. package/js/examples/test-pty.mjs +38 -0
  326. package/js/examples/test-quote-behavior-summary.mjs +110 -0
  327. package/js/examples/test-quote-edge-cases.mjs +69 -0
  328. package/js/examples/test-quote-parsing.mjs +23 -0
  329. package/js/examples/test-raw-function.mjs +153 -0
  330. package/js/examples/test-raw-streaming.mjs +47 -0
  331. package/js/examples/test-readme-examples.mjs +142 -0
  332. package/js/examples/test-real-cat.mjs +28 -0
  333. package/js/examples/test-real-commands.mjs +21 -0
  334. package/js/examples/test-real-shell.mjs +31 -0
  335. package/js/examples/test-real-stdin-commands.mjs +160 -0
  336. package/js/examples/test-runner-batched.mjs +98 -0
  337. package/js/examples/test-runner-simple.mjs +80 -0
  338. package/js/examples/test-runner.mjs +67 -0
  339. package/js/examples/test-scope-parse.mjs +31 -0
  340. package/js/examples/test-sh-pipeline.mjs +24 -0
  341. package/js/examples/test-shell-detection.mjs +71 -0
  342. package/js/examples/test-shell-parser.mjs +37 -0
  343. package/js/examples/test-sigint-behavior.mjs +241 -0
  344. package/js/examples/test-sigint-handling.sh +14 -0
  345. package/js/examples/test-simple-pipe.mjs +12 -0
  346. package/js/examples/test-simple-streaming.mjs +32 -0
  347. package/js/examples/test-sleep-stdin.js +27 -0
  348. package/js/examples/test-sleep.mjs +56 -0
  349. package/js/examples/test-smart-quoting.mjs +180 -0
  350. package/js/examples/test-spaces-in-path.mjs +48 -0
  351. package/js/examples/test-special-chars-quoting.mjs +54 -0
  352. package/js/examples/test-stdin-after-start.mjs +39 -0
  353. package/js/examples/test-stdin-simple.mjs +67 -0
  354. package/js/examples/test-stdin-timing.mjs +74 -0
  355. package/js/examples/test-stdio-combinations.mjs +124 -0
  356. package/js/examples/test-stream-access.mjs +84 -0
  357. package/js/examples/test-stream-cleanup.mjs +27 -0
  358. package/js/examples/test-stream-readers.mjs +152 -0
  359. package/js/examples/test-streaming-final.mjs +57 -0
  360. package/js/examples/test-streaming-interfaces.mjs +141 -0
  361. package/js/examples/test-streaming-timing.mjs +27 -0
  362. package/js/examples/test-streaming.mjs +32 -0
  363. package/js/examples/test-streams-stdin-comprehensive.mjs +134 -0
  364. package/js/examples/test-streams-stdin-ctrl-c.mjs +96 -0
  365. package/js/examples/test-template-literal.mjs +26 -0
  366. package/js/examples/test-template-vs-interpolation.mjs +49 -0
  367. package/js/examples/test-timing.mjs +41 -0
  368. package/js/examples/test-top-inherit-stdout-stdin-control.mjs +123 -0
  369. package/js/examples/test-top-quit-stdin.mjs +118 -0
  370. package/js/examples/test-trace-option.mjs +21 -0
  371. package/js/examples/test-user-double-quotes.mjs +36 -0
  372. package/js/examples/test-user-single-quotes.mjs +36 -0
  373. package/js/examples/test-verbose.mjs +18 -0
  374. package/js/examples/test-verbose2.mjs +32 -0
  375. package/js/examples/test-virtual-streaming.mjs +125 -0
  376. package/js/examples/test-waiting-command.mjs +52 -0
  377. package/js/examples/test-waiting-commands.mjs +83 -0
  378. package/js/examples/test-watch-mode.mjs +104 -0
  379. package/js/examples/test-yes-cancellation.mjs +26 -0
  380. package/js/examples/test-yes-detailed.mjs +58 -0
  381. package/js/examples/test-yes-trace.mjs +28 -0
  382. package/js/examples/trace-abort-controller.mjs +30 -0
  383. package/js/examples/trace-error-handling.mjs +22 -0
  384. package/js/examples/trace-pipeline-command.mjs +22 -0
  385. package/js/examples/trace-signal-handling.mjs +35 -0
  386. package/js/examples/trace-simple-command.mjs +18 -0
  387. package/js/examples/trace-stderr-output.mjs +22 -0
  388. package/js/examples/verify-fix-both-runtimes.mjs +73 -0
  389. package/js/examples/verify-issue12-fixed.mjs +78 -0
  390. package/js/examples/which-command-common-commands.mjs +19 -0
  391. package/js/examples/which-command-gh-test.mjs +23 -0
  392. package/js/examples/which-command-nonexistent.mjs +20 -0
  393. package/js/examples/which-command-system-comparison.mjs +28 -0
  394. package/js/examples/working-example.mjs +13 -0
  395. package/js/examples/working-stdin-examples.mjs +138 -0
  396. package/js/examples/working-streaming-demo.mjs +49 -0
  397. package/{src → js/src}/$.mjs +20 -4
  398. package/{src → js/src}/$.utils.mjs +14 -2
  399. package/js/tests/$.features.test.mjs +283 -0
  400. package/js/tests/$.test.mjs +935 -0
  401. package/js/tests/builtin-commands.test.mjs +387 -0
  402. package/js/tests/bun-shell-path-fix.test.mjs +115 -0
  403. package/js/tests/bun.features.test.mjs +189 -0
  404. package/js/tests/cd-virtual-command.test.mjs +622 -0
  405. package/js/tests/cleanup-verification.test.mjs +127 -0
  406. package/js/tests/ctrl-c-baseline.test.mjs +207 -0
  407. package/js/tests/ctrl-c-basic.test.mjs +220 -0
  408. package/js/tests/ctrl-c-library.test.mjs +197 -0
  409. package/js/tests/ctrl-c-signal.test.mjs +915 -0
  410. package/js/tests/examples.test.mjs +252 -0
  411. package/js/tests/execa.features.test.mjs +198 -0
  412. package/js/tests/gh-commands.test.mjs +164 -0
  413. package/js/tests/gh-gist-operations.test.mjs +221 -0
  414. package/js/tests/git-gh-cd.test.mjs +466 -0
  415. package/js/tests/interactive-option.test.mjs +114 -0
  416. package/js/tests/interactive-streaming.test.mjs +307 -0
  417. package/js/tests/issue-135-final.test.mjs +58 -0
  418. package/js/tests/jq-color-behavior.test.mjs +140 -0
  419. package/js/tests/jq.test.mjs +318 -0
  420. package/js/tests/options-examples.test.mjs +106 -0
  421. package/js/tests/options-syntax.test.mjs +112 -0
  422. package/js/tests/path-interpolation.test.mjs +412 -0
  423. package/js/tests/pipe.test.mjs +291 -0
  424. package/js/tests/raw-function.test.mjs +266 -0
  425. package/js/tests/readme-examples.test.mjs +427 -0
  426. package/js/tests/resource-cleanup-internals.test.mjs +669 -0
  427. package/js/tests/shell-settings.test.mjs +279 -0
  428. package/js/tests/sigint-cleanup-isolated.test.mjs +151 -0
  429. package/js/tests/sigint-cleanup.test.mjs +118 -0
  430. package/js/tests/start-run-edge-cases.test.mjs +152 -0
  431. package/js/tests/start-run-options.test.mjs +181 -0
  432. package/js/tests/stderr-output-handling.test.mjs +279 -0
  433. package/js/tests/streaming-interfaces.test.mjs +194 -0
  434. package/js/tests/sync.test.mjs +297 -0
  435. package/js/tests/system-pipe.test.mjs +226 -0
  436. package/js/tests/test-cleanup.mjs +200 -0
  437. package/js/tests/test-helper-fixed.mjs +148 -0
  438. package/js/tests/test-helper-v2.mjs +118 -0
  439. package/js/tests/test-helper.mjs +171 -0
  440. package/js/tests/test-sigint-child.js +15 -0
  441. package/js/tests/text-method.test.mjs +225 -0
  442. package/js/tests/virtual.test.mjs +364 -0
  443. package/js/tests/yes-command-cleanup.test.mjs +208 -0
  444. package/js/tests/zx.features.test.mjs +233 -0
  445. package/package.json +13 -12
  446. package/rust/Cargo.lock +947 -0
  447. package/rust/Cargo.toml +47 -0
  448. package/rust/src/commands/basename.rs +69 -0
  449. package/rust/src/commands/cat.rs +123 -0
  450. package/rust/src/commands/cd.rs +67 -0
  451. package/rust/src/commands/cp.rs +187 -0
  452. package/rust/src/commands/dirname.rs +57 -0
  453. package/rust/src/commands/echo.rs +73 -0
  454. package/rust/src/commands/env.rs +33 -0
  455. package/rust/src/commands/exit.rs +36 -0
  456. package/rust/src/commands/false.rs +24 -0
  457. package/rust/src/commands/ls.rs +182 -0
  458. package/rust/src/commands/mkdir.rs +98 -0
  459. package/rust/src/commands/mod.rs +200 -0
  460. package/rust/src/commands/mv.rs +180 -0
  461. package/rust/src/commands/pwd.rs +28 -0
  462. package/rust/src/commands/rm.rs +150 -0
  463. package/rust/src/commands/seq.rs +179 -0
  464. package/rust/src/commands/sleep.rs +97 -0
  465. package/rust/src/commands/test.rs +204 -0
  466. package/rust/src/commands/touch.rs +99 -0
  467. package/rust/src/commands/true.rs +24 -0
  468. package/rust/src/commands/which.rs +87 -0
  469. package/rust/src/commands/yes.rs +99 -0
  470. package/rust/src/lib.rs +492 -0
  471. package/rust/src/main.rs +37 -0
  472. package/rust/src/shell_parser.rs +565 -0
  473. package/rust/src/utils.rs +335 -0
  474. package/rust/tests/builtin_commands.rs +549 -0
  475. package/rust/tests/process_runner.rs +286 -0
  476. package/rust/tests/shell_parser.rs +296 -0
  477. package/rust/tests/utils.rs +282 -0
  478. package/rust/tests/virtual_commands.rs +199 -0
  479. /package/{src → js/src}/commands/$.basename.mjs +0 -0
  480. /package/{src → js/src}/commands/$.cat.mjs +0 -0
  481. /package/{src → js/src}/commands/$.cd.mjs +0 -0
  482. /package/{src → js/src}/commands/$.cp.mjs +0 -0
  483. /package/{src → js/src}/commands/$.dirname.mjs +0 -0
  484. /package/{src → js/src}/commands/$.echo.mjs +0 -0
  485. /package/{src → js/src}/commands/$.env.mjs +0 -0
  486. /package/{src → js/src}/commands/$.exit.mjs +0 -0
  487. /package/{src → js/src}/commands/$.false.mjs +0 -0
  488. /package/{src → js/src}/commands/$.ls.mjs +0 -0
  489. /package/{src → js/src}/commands/$.mkdir.mjs +0 -0
  490. /package/{src → js/src}/commands/$.mv.mjs +0 -0
  491. /package/{src → js/src}/commands/$.pwd.mjs +0 -0
  492. /package/{src → js/src}/commands/$.rm.mjs +0 -0
  493. /package/{src → js/src}/commands/$.seq.mjs +0 -0
  494. /package/{src → js/src}/commands/$.sleep.mjs +0 -0
  495. /package/{src → js/src}/commands/$.test.mjs +0 -0
  496. /package/{src → js/src}/commands/$.touch.mjs +0 -0
  497. /package/{src → js/src}/commands/$.true.mjs +0 -0
  498. /package/{src → js/src}/commands/$.which.mjs +0 -0
  499. /package/{src → js/src}/commands/$.yes.mjs +0 -0
  500. /package/{src → js/src}/shell-parser.mjs +0 -0
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env bun
2
+ // Debug the exit command specifically
3
+
4
+ import { $ } from '../src/$.mjs';
5
+
6
+ // Enable verbose mode
7
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
8
+
9
+ async function testExitCommand() {
10
+ console.log('=== Exit Command Debug ===');
11
+
12
+ console.log('\n1. Testing exit 1 in isolation...');
13
+ try {
14
+ const result = await $`exit 1`;
15
+ console.log('Exit 1 succeeded (unexpected):', result);
16
+ } catch (e) {
17
+ console.log('Exit 1 failed (expected):');
18
+ console.log('- Message:', e.message);
19
+ console.log('- Code:', e.code);
20
+ console.log('- Type:', typeof e);
21
+ console.log('- Constructor:', e.constructor.name);
22
+ console.log('- Keys:', Object.keys(e));
23
+ console.log('- Full error:', e);
24
+ }
25
+
26
+ console.log('\n2. Testing echo then exit 1...');
27
+ try {
28
+ const result = await $`echo "test"; exit 1`;
29
+ console.log('Echo + exit 1 succeeded (unexpected):', result);
30
+ } catch (e) {
31
+ console.log('Echo + exit 1 failed (expected):');
32
+ console.log('- Message:', e.message);
33
+ console.log('- Code:', e.code);
34
+ console.log('- Full error:', e);
35
+ }
36
+ }
37
+
38
+ testExitCommand().catch(console.error);
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env bun
2
+ // Debug the virtual exit command directly
3
+
4
+ import { $ } from '../src/$.mjs';
5
+
6
+ // Enable verbose mode
7
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
8
+
9
+ // Test just the problematic pipeline
10
+ async function testProblematicPipeline() {
11
+ console.log('=== Problematic Pipeline Debug ===');
12
+
13
+ function getState() {
14
+ return {
15
+ sigintHandlers: process.listeners('SIGINT').length,
16
+ timestamp: new Date().toISOString(),
17
+ };
18
+ }
19
+
20
+ console.log('\n1. Initial state:', getState());
21
+
22
+ console.log('\n2. Creating runner...');
23
+ const runner = $`echo "test" | exit 1 | cat`;
24
+ console.log('After creation:', getState());
25
+ console.log('Runner details:', {
26
+ finished: runner.finished,
27
+ started: runner.started,
28
+ spec: runner.spec,
29
+ });
30
+
31
+ console.log('\n3. Executing pipeline...');
32
+ try {
33
+ const result = await runner;
34
+ console.log('Pipeline succeeded (unexpected):', result);
35
+ console.log('After success:', getState());
36
+ } catch (e) {
37
+ console.log('Pipeline failed (expected):', e.message);
38
+ console.log('Error details:', {
39
+ code: e.code,
40
+ hasResult: !!e.result,
41
+ keys: Object.keys(e),
42
+ });
43
+ console.log('After failure:', getState());
44
+ }
45
+
46
+ console.log('\n4. Runner final state:', {
47
+ finished: runner.finished,
48
+ started: runner.started,
49
+ });
50
+
51
+ console.log('\n5. Final state:', getState());
52
+ }
53
+
54
+ testProblematicPipeline().catch(console.error);
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Finish Method Consolidation Test ===');
6
+
7
+ // Test different scenarios that should all use the finish() method
8
+ const tests = [
9
+ async () => {
10
+ console.log('\n1. Testing normal completion...');
11
+ const result = await $`echo "test"`;
12
+ console.log('Result:', result.stdout);
13
+ },
14
+
15
+ async () => {
16
+ console.log('\n2. Testing sync mode...');
17
+ const result = $`echo "sync test"`.sync();
18
+ console.log('Result:', result.stdout);
19
+ },
20
+
21
+ async () => {
22
+ console.log('\n3. Testing error handling...');
23
+ try {
24
+ await $`exit 1`;
25
+ } catch (error) {
26
+ console.log('Expected error, code:', error.code);
27
+ }
28
+ },
29
+
30
+ async () => {
31
+ console.log('\n4. Testing pipeline...');
32
+ try {
33
+ await $`echo "test" | exit 1`;
34
+ } catch (error) {
35
+ console.log('Expected pipeline error, code:', error.code);
36
+ }
37
+ },
38
+ ];
39
+
40
+ for (const test of tests) {
41
+ await test();
42
+ }
43
+
44
+ console.log('\nAll tests completed successfully!');
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env bun
2
+ // Test the forceCleanupAll function
3
+
4
+ import { $, forceCleanupAll } from '../src/$.mjs';
5
+
6
+ // Enable verbose mode
7
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
8
+
9
+ async function testForceCleanup() {
10
+ console.log('=== Force Cleanup Test ===');
11
+
12
+ console.log('\n1. Initial state:');
13
+ console.log('SIGINT handlers:', process.listeners('SIGINT').length);
14
+
15
+ console.log('\n2. Create some runners to install handlers...');
16
+ const runner1 = $`sleep 0.1`;
17
+ const runner2 = $`echo "test"`;
18
+
19
+ console.log('After creating runners:', process.listeners('SIGINT').length);
20
+
21
+ console.log('\n3. Start them to activate handlers...');
22
+ const promise1 = runner1.start();
23
+ const promise2 = runner2.start();
24
+
25
+ console.log('After starting:', process.listeners('SIGINT').length);
26
+
27
+ console.log('\n4. Test forceCleanupAll...');
28
+ forceCleanupAll();
29
+ console.log('After forceCleanupAll:', process.listeners('SIGINT').length);
30
+
31
+ console.log('\n5. Try to create a new runner...');
32
+ const runner3 = $`echo "after cleanup"`;
33
+ console.log('After creating new runner:', process.listeners('SIGINT').length);
34
+
35
+ console.log('\n6. Cleanup again...');
36
+ forceCleanupAll();
37
+ console.log('Final state:', process.listeners('SIGINT').length);
38
+
39
+ // Clean exit
40
+ try {
41
+ await Promise.allSettled([promise1, promise2]);
42
+ } catch (e) {
43
+ // Ignore errors from killed processes
44
+ }
45
+ }
46
+
47
+ testForceCleanup().catch(console.error);
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Basic Getter Debug ===');
6
+
7
+ const cmd = $`echo "test"`;
8
+
9
+ console.log('Testing testGetter:');
10
+ console.log('cmd.testGetter:', cmd.testGetter);
11
+
12
+ console.log('Testing stdout getter:');
13
+ console.log('cmd.stdout:', cmd.stdout);
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Direct Getter Debug ===');
6
+
7
+ const cmd = $`echo "test"`;
8
+
9
+ console.log('Before calling stdout getter');
10
+ console.log('cmd.child:', cmd.child);
11
+
12
+ // Get the getter directly
13
+ const proto = Object.getPrototypeOf(cmd);
14
+ const descriptor = Object.getOwnPropertyDescriptor(proto, 'stdout');
15
+ console.log('Getter descriptor:', descriptor);
16
+
17
+ console.log('Calling getter directly:');
18
+ const result = descriptor.get.call(cmd);
19
+ console.log('Direct getter result:', result);
20
+
21
+ console.log('Calling via property access:');
22
+ const result2 = cmd.stdout;
23
+ console.log('Property access result:', result2);
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $, disableVirtualCommands } from '../src/$.mjs';
4
+
5
+ console.log('=== Getter Internals Debug ===');
6
+
7
+ // Test virtual command
8
+ disableVirtualCommands();
9
+ const virtualCmd = $`echo "virtual test"`;
10
+ virtualCmd.start();
11
+
12
+ await new Promise((resolve) => setTimeout(resolve, 50));
13
+
14
+ console.log('\n--- Virtual Command ---');
15
+ console.log('virtualCmd.child:', virtualCmd.child);
16
+ console.log('virtualCmd.child === null:', virtualCmd.child === null);
17
+
18
+ // Get the actual getter function
19
+ const proto = Object.getPrototypeOf(virtualCmd);
20
+ const stdoutDescriptor = Object.getOwnPropertyDescriptor(proto, 'stdout');
21
+ console.log('stdout descriptor exists:', !!stdoutDescriptor);
22
+ console.log('stdout descriptor.get:', stdoutDescriptor?.get);
23
+
24
+ // Try calling the getter function directly with explicit context
25
+ console.log('\n--- Direct getter call ---');
26
+ try {
27
+ const directResult = stdoutDescriptor.get.call(virtualCmd);
28
+ console.log('Direct call result:', directResult);
29
+ console.log('Direct call result === null:', directResult === null);
30
+ console.log('Direct call result === undefined:', directResult === undefined);
31
+ } catch (e) {
32
+ console.log('Error calling getter directly:', e);
33
+ }
34
+
35
+ // Check if there are any property descriptors on the instance
36
+ console.log('\n--- Instance properties ---');
37
+ console.log(
38
+ 'Own property descriptor on instance:',
39
+ Object.getOwnPropertyDescriptor(virtualCmd, 'stdout')
40
+ );
41
+
42
+ // Check the prototype chain
43
+ console.log('\n--- Prototype chain ---');
44
+ let currentProto = virtualCmd;
45
+ let level = 0;
46
+ while (currentProto && level < 5) {
47
+ console.log(`Level ${level}:`, currentProto.constructor.name);
48
+ const desc = Object.getOwnPropertyDescriptor(currentProto, 'stdout');
49
+ if (desc) {
50
+ console.log(` Found stdout descriptor at level ${level}:`, desc);
51
+ }
52
+ currentProto = Object.getPrototypeOf(currentProto);
53
+ level++;
54
+ }
55
+
56
+ // Property access
57
+ console.log('\n--- Property access ---');
58
+ console.log('virtualCmd.stdout:', virtualCmd.stdout);
59
+ console.log('virtualCmd["stdout"]:', virtualCmd['stdout']);
60
+
61
+ await virtualCmd;
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env bun
2
+ // Debug script to test the exact pattern matching used by the tests
3
+
4
+ import { $ } from '../src/$.mjs';
5
+
6
+ // Enable verbose mode
7
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
8
+
9
+ function getInternalState() {
10
+ const sigintListeners = process.listeners('SIGINT');
11
+ const commandStreamListeners = sigintListeners.filter((l) => {
12
+ const str = l.toString();
13
+ return (
14
+ str.includes('activeProcessRunners') ||
15
+ str.includes('ProcessRunner') ||
16
+ str.includes('activeChildren')
17
+ );
18
+ });
19
+
20
+ return {
21
+ sigintHandlerCount: commandStreamListeners.length,
22
+ totalSigintListeners: sigintListeners.length,
23
+ allListeners: sigintListeners.map((l) => ({
24
+ length: l.toString().length,
25
+ contains: {
26
+ activeProcessRunners: l.toString().includes('activeProcessRunners'),
27
+ ProcessRunner: l.toString().includes('ProcessRunner'),
28
+ activeChildren: l.toString().includes('activeChildren'),
29
+ },
30
+ })),
31
+ };
32
+ }
33
+
34
+ async function testHandlerDetection() {
35
+ console.log('=== Handler Detection Debug ===');
36
+
37
+ console.log('\n1. Initial state:');
38
+ console.log(JSON.stringify(getInternalState(), null, 2));
39
+
40
+ console.log('\n2. Creating runner...');
41
+ const runner = $`sleep 0.1`;
42
+ console.log(
43
+ 'After creating runner:',
44
+ JSON.stringify(getInternalState(), null, 2)
45
+ );
46
+
47
+ console.log('\n3. Starting runner...');
48
+ const promise = runner.start();
49
+ console.log(
50
+ 'Immediately after start():',
51
+ JSON.stringify(getInternalState(), null, 2)
52
+ );
53
+
54
+ // Small delay to let any async operations complete
55
+ await new Promise((resolve) => setTimeout(resolve, 10));
56
+ console.log('After 10ms delay:', JSON.stringify(getInternalState(), null, 2));
57
+
58
+ console.log('\n4. Waiting for completion...');
59
+ await promise;
60
+
61
+ console.log('\n5. Final state:');
62
+ console.log(JSON.stringify(getInternalState(), null, 2));
63
+ }
64
+
65
+ testHandlerDetection().catch(console.error);
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Idempotent Finish Method Test ===');
6
+
7
+ // Test that finish() is now idempotent (safe to call multiple times)
8
+ const runner = $`echo "test"`;
9
+
10
+ let eventCount = 0;
11
+ let endEventCount = 0;
12
+ let exitEventCount = 0;
13
+
14
+ runner.on('end', (result) => {
15
+ endEventCount++;
16
+ console.log(`End event #${endEventCount}, result: ${result.stdout.trim()}`);
17
+ });
18
+
19
+ runner.on('exit', (code) => {
20
+ exitEventCount++;
21
+ console.log(`Exit event #${exitEventCount}, code: ${code}`);
22
+ });
23
+
24
+ runner.on('data', () => {
25
+ eventCount++;
26
+ });
27
+
28
+ // Start and await the process
29
+ await runner;
30
+
31
+ console.log(`\nAfter normal completion:`);
32
+ console.log(`- finished: ${runner.finished}`);
33
+ console.log(`- result: ${runner.result.stdout.trim()}`);
34
+ console.log(`- end events: ${endEventCount}`);
35
+ console.log(`- exit events: ${exitEventCount}`);
36
+
37
+ // Now try to finish again (should be idempotent)
38
+ console.log(`\nTrying to finish again (should be safe now)...`);
39
+
40
+ const result2 = runner.finish({
41
+ code: 0,
42
+ stdout: 'different output',
43
+ stderr: '',
44
+ stdin: '',
45
+ });
46
+
47
+ console.log(`\nAfter second finish() call:`);
48
+ console.log(`- finished: ${runner.finished}`);
49
+ console.log(`- result: ${runner.result.stdout.trim()} (should be original)`);
50
+ console.log(`- returned result: ${result2.stdout.trim()} (should be original)`);
51
+ console.log(`- end events: ${endEventCount} (should still be 1)`);
52
+ console.log(`- exit events: ${exitEventCount} (should still be 1)`);
53
+
54
+ console.log('\nIdempotent finish test completed!');
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Idempotent Kill Test ===');
6
+
7
+ // Test that kill now works without conditional checks
8
+ const runner = $`sleep 1`;
9
+
10
+ let endEventCount = 0;
11
+ let exitEventCount = 0;
12
+
13
+ runner.on('end', (result) => {
14
+ endEventCount++;
15
+ console.log(
16
+ `End event #${endEventCount}, code: ${result.code}, stderr: ${result.stderr.trim()}`
17
+ );
18
+ });
19
+
20
+ runner.on('exit', (code) => {
21
+ exitEventCount++;
22
+ console.log(`Exit event #${exitEventCount}, code: ${code}`);
23
+ });
24
+
25
+ const promise = runner.start();
26
+
27
+ // Give it a moment to start
28
+ await new Promise((resolve) => setTimeout(resolve, 50));
29
+
30
+ console.log('Killing process...');
31
+ runner.kill('SIGTERM');
32
+
33
+ try {
34
+ await promise;
35
+ } catch (error) {
36
+ console.log(`Expected error: ${error.message}`);
37
+ }
38
+
39
+ console.log(`\nAfter kill:`);
40
+ console.log(`- finished: ${runner.finished}`);
41
+ console.log(`- result code: ${runner.result.code}`);
42
+ console.log(`- result stderr: ${runner.result.stderr.trim()}`);
43
+ console.log(`- end events: ${endEventCount}`);
44
+ console.log(`- exit events: ${exitEventCount}`);
45
+
46
+ // Try to kill again (should be safe due to idempotent finish)
47
+ console.log('\nTrying to kill again (should be safe)...');
48
+ runner.kill('SIGKILL');
49
+
50
+ console.log(`\nAfter second kill:`);
51
+ console.log(`- finished: ${runner.finished}`);
52
+ console.log(
53
+ `- result code: ${runner.result.code} (should still be 143 for SIGTERM)`
54
+ );
55
+ console.log(`- end events: ${endEventCount} (should still be 1)`);
56
+ console.log(`- exit events: ${exitEventCount} (should still be 1)`);
57
+
58
+ console.log('\nIdempotent kill test completed!');
@@ -0,0 +1,88 @@
1
+ import { $ } from '../src/$.mjs';
2
+
3
+ console.log('=== Individual Debugging for Quoting Issue ===\n');
4
+
5
+ // Let's trace exactly what happens in the command building process
6
+ async function debugIndividualSteps() {
7
+ const claudePath = '/Users/konard/.claude/local/claude';
8
+
9
+ console.log('1. Path value:', JSON.stringify(claudePath));
10
+
11
+ // Step-by-step debugging
12
+ console.log('\n2. Creating command with exact options from issue:');
13
+ const options = { stdin: 'hi\n', mirror: false };
14
+ console.log('Options:', JSON.stringify(options));
15
+
16
+ // Create the command but don't execute yet
17
+ const cmd = $({
18
+ ...options,
19
+ })`${claudePath} --output-format stream-json --verbose --model sonnet`;
20
+
21
+ console.log('\n3. Command object details:');
22
+ console.log('- Command spec:', JSON.stringify(cmd.spec, null, 2));
23
+ console.log('- Command string:', cmd.spec?.command);
24
+ console.log('- Options:', JSON.stringify(cmd.options, null, 2));
25
+
26
+ // Check if there are any differences in how the template is being processed
27
+ console.log('\n4. Manual template testing:');
28
+ const manualTemplate = `${claudePath} --output-format stream-json --verbose --model sonnet`;
29
+ console.log('Manual template result:', JSON.stringify(manualTemplate));
30
+
31
+ // Test what happens if we try to access internal command processing
32
+ console.log('\n5. Testing command processing internals:');
33
+ try {
34
+ // Let's see what the internal command string looks like
35
+ if (cmd._command) {
36
+ console.log('Internal _command:', cmd._command);
37
+ }
38
+ if (cmd.command) {
39
+ console.log('Internal command:', cmd.command);
40
+ }
41
+
42
+ // Try to start the command to see exactly what gets passed to spawn
43
+ console.log('\n6. Attempting command execution to see spawn details:');
44
+ await cmd;
45
+ } catch (error) {
46
+ console.log('Execution error:', error.message);
47
+ console.log('Error stack:', error.stack);
48
+
49
+ // Check for the specific posix_spawn pattern mentioned in the issue
50
+ const spawnMatch = error.message.match(/posix_spawn '([^']*)''/);
51
+ if (spawnMatch) {
52
+ console.log('šŸ” Found posix_spawn with double quotes!');
53
+ console.log('Captured path:', spawnMatch[1]);
54
+ }
55
+
56
+ // Also check for any double-quote patterns
57
+ const doubleQuoteMatch = error.message.match(/''/g);
58
+ if (doubleQuoteMatch) {
59
+ console.log(
60
+ 'šŸ” Found double-quote patterns:',
61
+ doubleQuoteMatch.length,
62
+ 'instances'
63
+ );
64
+ }
65
+ }
66
+
67
+ console.log('\n7. Testing different path formats:');
68
+ const testPaths = [
69
+ '/Users/konard/.claude/local/claude',
70
+ '"/Users/konard/.claude/local/claude"',
71
+ "'/Users/konard/.claude/local/claude'",
72
+ '/Users/user with spaces/.claude/local/claude',
73
+ '/nonexistent/path',
74
+ ];
75
+
76
+ for (const testPath of testPaths) {
77
+ console.log(`\nTesting path: ${JSON.stringify(testPath)}`);
78
+ try {
79
+ const testCmd = $({ mirror: false })`${testPath} --version`;
80
+ console.log('Generated command:', testCmd.spec?.command);
81
+ // Don't actually execute, just check the generated command
82
+ } catch (error) {
83
+ console.log('Command creation error:', error.message);
84
+ }
85
+ }
86
+ }
87
+
88
+ debugIndividualSteps().catch(console.error);
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env node
2
+
3
+ // EXACT reproduction of issue #12 from deep-assistant/hive-mind
4
+ // Original file: https://github.com/deep-assistant/hive-mind/blob/ff005fa5/claude-pipe/test-pipe.mjs
5
+ // Issue: https://github.com/link-foundation/command-stream/issues/12
6
+ // Error: ENOENT: no such file or directory, posix_spawn ''/Users/konard/.claude/local/claude''
7
+
8
+ import { $ } from '../src/$.mjs';
9
+
10
+ const claude = process.env.CLAUDE_PATH || '/Users/konard/.claude/local/claude';
11
+
12
+ console.log('=== Reproducing Issue #12: Path with quotes in posix_spawn ===\n');
13
+ console.log('Using path:', claude);
14
+ console.log();
15
+
16
+ async function reproduceOriginalIssue() {
17
+ console.log('1. EXACT CODE FROM ISSUE (test-pipe.mjs):');
18
+ console.log('------------------------------------------');
19
+
20
+ try {
21
+ // This is the EXACT line that was failing
22
+ const result =
23
+ await $`${claude} -p "hi" --output-format stream-json --model sonnet | jq .`;
24
+ console.log('Result:');
25
+ console.log(result.stdout);
26
+ } catch (error) {
27
+ console.error('āŒ Error reproduced:', error.message);
28
+
29
+ // Check if this is the exact error from the issue
30
+ if (error.message.includes("''") && error.message.includes('ENOENT')) {
31
+ console.log('\nāœ“ THIS IS THE EXACT ERROR FROM ISSUE #12!');
32
+ console.log(" The path has extra quotes: ''...''");
33
+ }
34
+ }
35
+ }
36
+
37
+ async function testSimplifiedCase() {
38
+ console.log('\n2. SIMPLIFIED TEST CASE:');
39
+ console.log('------------------------');
40
+
41
+ try {
42
+ // Simplify to just the command without pipe
43
+ console.log(`Trying: ${claude} --version`);
44
+ const result = await $`${claude} --version`;
45
+ console.log('Result:', result);
46
+ } catch (error) {
47
+ console.error('āŒ Error:', error.message);
48
+
49
+ if (error.message.includes("''")) {
50
+ console.log('āœ“ Double quotes still present in error!');
51
+ }
52
+ }
53
+ }
54
+
55
+ async function testQuotingPatterns() {
56
+ console.log('\n3. TESTING QUOTE PATTERNS:');
57
+ console.log('---------------------------');
58
+
59
+ // Test what happens with already-quoted paths
60
+ const patterns = [
61
+ { desc: 'Plain path', path: claude },
62
+ { desc: 'Single-quoted', path: `'${claude}'` },
63
+ { desc: 'Double-quoted', path: `"${claude}"` },
64
+ ];
65
+
66
+ for (const { desc, path } of patterns) {
67
+ console.log(`\n${desc}: ${path}`);
68
+ try {
69
+ // Use echo to avoid actual execution
70
+ const result = await $`echo "Would execute: ${path}"`;
71
+ console.log('Echo result:', String(result).trim());
72
+ } catch (error) {
73
+ console.error('Error:', error.message);
74
+ }
75
+ }
76
+ }
77
+
78
+ async function showWorkingPattern() {
79
+ console.log('\n4. CORRECT PATTERN (should work):');
80
+ console.log('----------------------------------');
81
+
82
+ try {
83
+ // Using a valid command to show proper interpolation
84
+ const testCmd = 'echo';
85
+ const args = `"Testing path: ${claude}"`;
86
+ console.log(`Command: ${testCmd} ${args}`);
87
+
88
+ const result = await $`${testCmd} ${args}`;
89
+ console.log('āœ“ Result:', String(result).trim());
90
+ } catch (error) {
91
+ console.error('Error:', error.message);
92
+ }
93
+ }
94
+
95
+ // Run all tests
96
+ (async () => {
97
+ await reproduceOriginalIssue();
98
+ await testSimplifiedCase();
99
+ await testQuotingPatterns();
100
+ await showWorkingPattern();
101
+ })().catch(console.error);