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,42 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $, shell, enableVirtualCommands } from '../src/$.mjs';
4
+
5
+ enableVirtualCommands();
6
+ shell.verbose(false);
7
+
8
+ console.log('Testing cd command behavior:\n');
9
+
10
+ // Test 1: Basic cd should persist within chain
11
+ console.log('Test 1: cd should persist within chain');
12
+ const originalCwd = process.cwd();
13
+ console.log('Original cwd:', originalCwd);
14
+
15
+ const result1 = await $`cd /tmp && pwd`;
16
+ console.log('After "cd /tmp && pwd":', result1.stdout.trim());
17
+
18
+ const result2 = await $`pwd`;
19
+ console.log('Next pwd (should be back to original):', result2.stdout.trim());
20
+
21
+ console.log('\nTest 2: Multiple cd in chain');
22
+ const result3 = await $`cd /tmp && pwd && cd /usr && pwd`;
23
+ console.log('Result of "cd /tmp && pwd && cd /usr && pwd":');
24
+ console.log(result3.stdout);
25
+
26
+ console.log('\nTest 3: cd in subshell should not affect parent');
27
+ await $`(cd /tmp && pwd)`;
28
+ const result4 = await $`pwd`;
29
+ console.log('pwd after subshell cd:', result4.stdout.trim());
30
+
31
+ console.log('\nTest 4: Separate cd commands');
32
+ await $`cd /tmp`;
33
+ const result5 = await $`pwd`;
34
+ console.log('After separate "cd /tmp":', result5.stdout.trim());
35
+
36
+ await $`cd /usr`;
37
+ const result6 = await $`pwd`;
38
+ console.log('After separate "cd /usr":', result6.stdout.trim());
39
+
40
+ // Return to original
41
+ process.chdir(originalCwd);
42
+ console.log('\nFinal cwd:', process.cwd());
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Debug child process timing ===');
6
+
7
+ async function debugChildProcessTiming() {
8
+ const cmd = $`sleep 2`; // Use sleep to keep process alive
9
+
10
+ console.log('Initial state:');
11
+ console.log('- started:', cmd.started);
12
+ console.log('- finished:', cmd.finished);
13
+ console.log('- child:', !!cmd.child);
14
+
15
+ console.log('\\nAccessing streams.stdin to trigger auto-start...');
16
+ const stdin = cmd.streams.stdin;
17
+
18
+ console.log('After accessing streams.stdin:');
19
+ console.log('- stdin result:', !!stdin);
20
+ console.log('- started:', cmd.started);
21
+ console.log('- finished:', cmd.finished);
22
+ console.log('- child:', !!cmd.child);
23
+
24
+ if (cmd.child) {
25
+ console.log('- child.stdin:', !!cmd.child.stdin);
26
+ console.log('- child.stdout:', !!cmd.child.stdout);
27
+ console.log('- child.stderr:', !!cmd.child.stderr);
28
+ }
29
+
30
+ // Wait a bit to see if child appears
31
+ await new Promise((resolve) => setTimeout(resolve, 100));
32
+
33
+ console.log('\\nAfter 100ms wait:');
34
+ console.log('- started:', cmd.started);
35
+ console.log('- finished:', cmd.finished);
36
+ console.log('- child:', !!cmd.child);
37
+
38
+ if (cmd.child) {
39
+ console.log('- child.stdin:', !!cmd.child.stdin);
40
+ console.log('- child.pid:', cmd.child.pid);
41
+ }
42
+
43
+ // Try accessing again
44
+ const stdin2 = cmd.streams.stdin;
45
+ console.log('\\nSecond access to streams.stdin:');
46
+ console.log('- stdin result:', !!stdin2);
47
+
48
+ // Let the sleep finish
49
+ const result = await cmd;
50
+ console.log('\\nFinal result:', result.code);
51
+ }
52
+
53
+ debugChildProcessTiming().catch(console.error);
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawn } from 'child_process';
4
+
5
+ console.log('Testing child SIGINT handler');
6
+
7
+ const nodeCode = `
8
+ let cleanupDone = false;
9
+ process.on('SIGINT', () => {
10
+ console.log('CHILD_CLEANUP_START');
11
+ // Simulate cleanup work
12
+ setTimeout(() => {
13
+ cleanupDone = true;
14
+ console.log('CHILD_CLEANUP_DONE');
15
+ process.exit(0); // Exit cleanly after cleanup
16
+ }, 100);
17
+ });
18
+
19
+ console.log('CHILD_READY');
20
+
21
+ // Keep process alive
22
+ setTimeout(() => {
23
+ console.log('TIMEOUT_REACHED');
24
+ process.exit(1);
25
+ }, 5000);
26
+ `;
27
+
28
+ const child = spawn('node', ['-e', nodeCode], {
29
+ stdio: ['pipe', 'pipe', 'pipe'],
30
+ detached: true,
31
+ });
32
+
33
+ console.log('Child spawned with PID:', child.pid);
34
+
35
+ let stdout = '';
36
+ child.stdout.on('data', (data) => {
37
+ stdout += data.toString();
38
+ console.log('Stdout:', data.toString().trim());
39
+ });
40
+
41
+ child.stderr.on('data', (data) => {
42
+ console.log('Stderr:', data.toString().trim());
43
+ });
44
+
45
+ // Wait for child to be ready
46
+ setTimeout(() => {
47
+ console.log('Sending SIGINT to child...');
48
+ const result = child.kill('SIGINT');
49
+ console.log('Kill result:', result);
50
+ }, 500);
51
+
52
+ child.on('exit', (code, signal) => {
53
+ console.log('Child exited with code:', code, 'signal:', signal);
54
+ console.log('Total stdout:', stdout);
55
+ process.exit(0);
56
+ });
57
+
58
+ // Timeout safety
59
+ setTimeout(() => {
60
+ console.log('Timeout reached, force killing...');
61
+ child.kill('SIGKILL');
62
+ }, 4000);
@@ -0,0 +1,21 @@
1
+ import { $ } from '../src/$.mjs';
2
+
3
+ console.log('Testing stream cleanup...');
4
+
5
+ let count = 0;
6
+ for await (const chunk of $`yes x`.stream()) {
7
+ count++;
8
+ console.log(`Chunk ${count}`);
9
+ if (count >= 3) {
10
+ console.log('Breaking...');
11
+ break;
12
+ }
13
+ }
14
+
15
+ console.log('After break');
16
+
17
+ // Small delay to see if output continues
18
+ await new Promise((r) => setTimeout(r, 100));
19
+
20
+ console.log('Done');
21
+ process.exit(0);
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Tracing System Overview
5
+ *
6
+ * The command-stream library includes comprehensive tracing for CI debugging.
7
+ * Instead of one large test, each aspect is tested in separate focused examples:
8
+ *
9
+ * Individual Tracing Examples:
10
+ * - trace-simple-command.mjs - Basic command execution
11
+ * - trace-signal-handling.mjs - Process killing and SIGINT handling
12
+ * - trace-abort-controller.mjs - AbortController integration
13
+ * - trace-stderr-output.mjs - Stdout/stderr stream handling
14
+ * - trace-pipeline-command.mjs - Pipeline command execution
15
+ * - trace-error-handling.mjs - Error conditions and cleanup
16
+ *
17
+ * Usage for any example:
18
+ * COMMAND_STREAM_TRACE=ProcessRunner node js/examples/trace-[example-name].mjs
19
+ *
20
+ * For CI debugging, enable tracing in your test runs:
21
+ * COMMAND_STREAM_TRACE=ProcessRunner bun test
22
+ */
23
+
24
+ console.log('Tracing System Overview');
25
+ console.log('='.repeat(50));
26
+ console.log('');
27
+ console.log('The tracing system provides detailed logs for:');
28
+ console.log('• Process creation and spawning');
29
+ console.log('• Signal handling and process killing');
30
+ console.log('• Stdin/stdout/stderr handling');
31
+ console.log('• Virtual command execution');
32
+ console.log('• Cleanup operations');
33
+ console.log('• Error conditions');
34
+ console.log('• Platform-specific behavior differences');
35
+ console.log('');
36
+ console.log('Run individual examples to test specific areas:');
37
+ console.log('');
38
+ console.log(
39
+ 'COMMAND_STREAM_TRACE=ProcessRunner node js/examples/trace-simple-command.mjs'
40
+ );
41
+ console.log(
42
+ 'COMMAND_STREAM_TRACE=ProcessRunner node js/examples/trace-signal-handling.mjs'
43
+ );
44
+ console.log(
45
+ 'COMMAND_STREAM_TRACE=ProcessRunner node js/examples/trace-abort-controller.mjs'
46
+ );
47
+ console.log(
48
+ 'COMMAND_STREAM_TRACE=ProcessRunner node js/examples/trace-stderr-output.mjs'
49
+ );
50
+ console.log(
51
+ 'COMMAND_STREAM_TRACE=ProcessRunner node js/examples/trace-pipeline-command.mjs'
52
+ );
53
+ console.log(
54
+ 'COMMAND_STREAM_TRACE=ProcessRunner node js/examples/trace-error-handling.mjs'
55
+ );
56
+ console.log('');
57
+ console.log('💡 Use COMMAND_STREAM_TRACE=* to see all tracing categories');
58
+ console.log('💡 Add COMMAND_STREAM_VERBOSE=true for even more detail');
@@ -0,0 +1,46 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $, shell, enableVirtualCommands } from '../src/$.mjs';
4
+ import { mkdtempSync, rmSync, mkdirSync } from 'fs';
5
+ import { tmpdir } from 'os';
6
+ import { join } from 'path';
7
+
8
+ enableVirtualCommands();
9
+ shell.verbose(true);
10
+
11
+ console.log('=== Correct handling of paths with spaces ===\n');
12
+
13
+ const baseDir = mkdtempSync(join(tmpdir(), 'space-test-'));
14
+ const dirWithSpaces = join(baseDir, 'my test directory');
15
+ mkdirSync(dirWithSpaces);
16
+ const originalCwd = process.cwd();
17
+
18
+ console.log('Directory created:', dirWithSpaces);
19
+
20
+ try {
21
+ console.log('\nCorrect way: Let $ handle the quoting');
22
+ // This is the correct way - let the template literal handle quoting
23
+ const result1 = await $`cd ${dirWithSpaces}`;
24
+ console.log('Exit code:', result1.code);
25
+
26
+ const pwd1 = await $`pwd`;
27
+ console.log('Current dir:', pwd1.stdout.trim());
28
+ console.log('Expected:', dirWithSpaces);
29
+ console.log('Match:', pwd1.stdout.trim() === dirWithSpaces);
30
+
31
+ await $`cd ${originalCwd}`;
32
+
33
+ console.log('\nAlso works: cd with && chain');
34
+ const result2 = await $`cd ${dirWithSpaces} && pwd`;
35
+ console.log('Output:', result2.stdout.trim());
36
+ console.log('Expected:', dirWithSpaces);
37
+ console.log('Match:', result2.stdout.trim() === dirWithSpaces);
38
+ } catch (error) {
39
+ console.error('Error:', error.message);
40
+ console.error('Stack:', error.stack);
41
+ } finally {
42
+ process.chdir(originalCwd);
43
+ rmSync(baseDir, { recursive: true, force: true });
44
+ }
45
+
46
+ console.log('\n=== Test Complete ===');
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('Testing CTRL+C signal propagation');
6
+ console.log('Press CTRL+C to interrupt...');
7
+ console.log('---');
8
+
9
+ // Set up comprehensive signal handlers
10
+ let parentSigintCount = 0;
11
+ process.on('SIGINT', () => {
12
+ parentSigintCount++;
13
+ console.log(`\n[Parent] Received SIGINT (count: ${parentSigintCount})`);
14
+
15
+ // Don't exit on first SIGINT to see what happens
16
+ if (parentSigintCount >= 2) {
17
+ console.log('[Parent] Exiting after 2 SIGINTs');
18
+ process.exit(130);
19
+ }
20
+ });
21
+
22
+ process.on('SIGTERM', () => {
23
+ console.log('\n[Parent] Received SIGTERM');
24
+ });
25
+
26
+ process.on('exit', (code) => {
27
+ console.log(`[Parent] Exiting with code: ${code}`);
28
+ });
29
+
30
+ // Test the command
31
+ try {
32
+ console.log('Starting sleep 30...');
33
+ console.log('Process info:', {
34
+ pid: process.pid,
35
+ ppid: process.ppid,
36
+ });
37
+
38
+ const result = await $`sleep 30`;
39
+ console.log('Command completed normally');
40
+ } catch (error) {
41
+ console.log('\n[Parent] Command failed/interrupted');
42
+ console.log('Error message:', error.message);
43
+ console.log('Exit code:', error.code);
44
+ }
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('Testing CTRL+C with explicit stdio inherit');
6
+ console.log('Press CTRL+C to interrupt the ping command...');
7
+ console.log('---');
8
+
9
+ // Set up SIGINT handler to see if parent process receives it
10
+ process.on('SIGINT', () => {
11
+ console.log('\n[Parent process received SIGINT]');
12
+ process.exit(130); // Standard exit code for SIGINT
13
+ });
14
+
15
+ try {
16
+ // Test with different configurations
17
+ console.log(
18
+ 'Running with default settings (should inherit stdin/stdout/stderr)...'
19
+ );
20
+ const result = await $({
21
+ stdin: 'inherit',
22
+ capture: false,
23
+ mirror: true,
24
+ })`ping 8.8.8.8`;
25
+ console.log('Command completed normally:', result);
26
+ } catch (error) {
27
+ console.log('Command was interrupted or failed');
28
+ console.log('Error:', error.message);
29
+ console.log('Exit code:', error.code);
30
+ }
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('Testing CTRL+C with sleep command');
6
+ console.log('Press CTRL+C to interrupt the sleep...');
7
+ console.log('---');
8
+
9
+ // Set up SIGINT handler to see if parent process receives it
10
+ let signalReceived = false;
11
+ process.on('SIGINT', () => {
12
+ console.log('\n[Parent process received SIGINT]');
13
+ signalReceived = true;
14
+ });
15
+
16
+ try {
17
+ console.log('Starting 30 second sleep...');
18
+ const result = await $`sleep 30`;
19
+ console.log('Sleep completed normally:', result);
20
+ } catch (error) {
21
+ console.log('\nCommand was interrupted or failed');
22
+ console.log('Error:', error.message);
23
+ console.log('Exit code:', error.code);
24
+ console.log('Parent received SIGINT:', signalReceived);
25
+ }
26
+
27
+ // Give a moment for any pending signals
28
+ setTimeout(() => {
29
+ console.log('Final state - Parent received SIGINT:', signalReceived);
30
+ process.exit(signalReceived ? 130 : 0);
31
+ }, 100);
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('Testing CTRL+C handling with ping command');
6
+ console.log('Press CTRL+C to interrupt the ping command...');
7
+ console.log('---');
8
+
9
+ try {
10
+ // Test with ping command that runs indefinitely
11
+ const result = await $`ping 8.8.8.8`;
12
+ console.log('Command completed normally:', result);
13
+ } catch (error) {
14
+ console.log('Command was interrupted or failed');
15
+ console.log('Error:', error.message);
16
+ console.log('Exit code:', error.code);
17
+ }
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ async function debug() {
6
+ console.log('=== Debugging how new options work ===');
7
+
8
+ // First let's see what happens with await directly
9
+ console.log('\n1. Direct await $`echo test`:');
10
+ const result1 = await $`echo "direct await"`;
11
+ console.log('Result stdout:', JSON.stringify(result1.stdout));
12
+
13
+ // Now let's check the runner before starting
14
+ console.log('\n2. Inspecting runner before start:');
15
+ const runner = $`echo "before start"`;
16
+ console.log('Runner options before start:', runner.options);
17
+ console.log(
18
+ 'Runner outChunks before start:',
19
+ runner.outChunks ? 'array' : 'null'
20
+ );
21
+
22
+ // Now call start with capture: false
23
+ console.log('\n3. Calling start with capture: false:');
24
+ const result2 = await runner.start({ capture: false });
25
+ console.log('Runner options after start:', runner.options);
26
+ console.log('Result stdout:', JSON.stringify(result2.stdout));
27
+
28
+ // Test with .run() method
29
+ console.log('\n4. Testing .run() method:');
30
+ const result3 = await $`echo "run method test"`.run({
31
+ capture: false,
32
+ mirror: false,
33
+ });
34
+ console.log('Result stdout:', JSON.stringify(result3.stdout));
35
+ console.log('Result code:', result3.code);
36
+
37
+ // Test runner state inspection
38
+ console.log('\n5. Runner state inspection:');
39
+ const runner2 = $`echo "state test"`;
40
+ console.log('Initial state:');
41
+ console.log(' started:', runner2.started);
42
+ console.log(' options.capture:', runner2.options.capture);
43
+ console.log(' outChunks:', runner2.outChunks ? 'array' : 'null');
44
+
45
+ console.log('\nCalling start with capture: false...');
46
+ const result4 = await runner2.start({ capture: false });
47
+
48
+ console.log('\nAfter start:');
49
+ console.log(' started:', runner2.started);
50
+ console.log(' options.capture:', runner2.options.capture);
51
+ console.log(' outChunks:', runner2.outChunks);
52
+ console.log(' result.stdout:', JSON.stringify(result4.stdout));
53
+ }
54
+
55
+ debug().catch(console.error);
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ // Add debug logging
6
+ const original_runPipeline = $.prototype._runPipeline;
7
+ $.prototype._runPipeline = async function (commands) {
8
+ console.log(
9
+ 'Pipeline commands:',
10
+ commands.map((c) => c.cmd)
11
+ );
12
+ const result = await original_runPipeline.call(this, commands);
13
+ return result;
14
+ };
15
+
16
+ const original_runStreamingPipelineBun = $.prototype._runStreamingPipelineBun;
17
+ $.prototype._runStreamingPipelineBun = async function (commands) {
18
+ const hasJq = commands.some((c) => c.cmd === 'jq');
19
+ const hasVirtual = commands.some((c) => c.isVirtual);
20
+ console.log(
21
+ `Streaming pipeline: hasJq=${hasJq}, hasVirtual=${hasVirtual}, platform=${process.platform}`
22
+ );
23
+
24
+ const result = await original_runStreamingPipelineBun.call(this, commands);
25
+ return result;
26
+ };
27
+
28
+ console.log('Testing pipeline routing:\n');
29
+
30
+ // Test with actual file to avoid shell wrapper
31
+ console.log('Test 1: Using actual file command:');
32
+ const start = Date.now();
33
+ for await (const chunk of $`./js/examples/emulate-claude-stream.mjs | jq .`.stream()) {
34
+ if (chunk.type === 'stdout') {
35
+ const elapsed = Date.now() - start;
36
+ const lines = chunk.data.toString().trim().split('\n').slice(0, 2);
37
+ console.log(`[${elapsed}ms] First lines:`, lines);
38
+ }
39
+ }
40
+
41
+ console.log('\nTest 2: Using bun run:');
42
+ const start2 = Date.now();
43
+ for await (const chunk of $`bun run js/examples/emulate-claude-stream.mjs | jq .`.stream()) {
44
+ if (chunk.type === 'stdout') {
45
+ const elapsed = Date.now() - start2;
46
+ const lines = chunk.data.toString().trim().split('\n').slice(0, 2);
47
+ console.log(`[${elapsed}ms] First lines:`, lines);
48
+ }
49
+ }
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Debug Tee Streaming ===\n');
6
+
7
+ // Patch the emit function to trace calls
8
+ const cmd = $`bun run js/examples/emulate-claude-stream.mjs | cat | jq .`;
9
+ const originalEmit = cmd.emit.bind(cmd);
10
+ let emitCount = 0;
11
+
12
+ cmd.emit = function (event, data) {
13
+ if (event === 'stdout' || event === 'data') {
14
+ emitCount++;
15
+ const preview = data.toString
16
+ ? data.toString().substring(0, 40)
17
+ : JSON.stringify(data).substring(0, 40);
18
+ console.log(`EMIT #${emitCount} [${event}]: ${preview}...`);
19
+ }
20
+ return originalEmit(event, data);
21
+ };
22
+
23
+ console.log('Running command...\n');
24
+ const start = Date.now();
25
+
26
+ const result = await cmd;
27
+
28
+ console.log(`\nTotal emits: ${emitCount}`);
29
+ console.log(`Time taken: ${Date.now() - start}ms`);
30
+ console.log(`Result length: ${result.stdout.length} chars`);
31
+
32
+ if (emitCount >= 8) {
33
+ console.log('✅ Multiple emissions detected - streaming is working!');
34
+ } else if (emitCount === 2) {
35
+ console.log('⚠️ Only 2 emissions (stdout + data) - likely buffered');
36
+ } else {
37
+ console.log(`❌ Unexpected emit count: ${emitCount}`);
38
+ }
@@ -0,0 +1,25 @@
1
+ import { $ } from '../src/$.mjs';
2
+
3
+ console.log('Starting test...');
4
+
5
+ const cmd = $`yes x`;
6
+ let count = 0;
7
+
8
+ // Track when we start iterating
9
+ console.log('Starting iteration...');
10
+
11
+ for await (const chunk of cmd.stream()) {
12
+ count++;
13
+ console.log(`Got chunk ${count}`);
14
+
15
+ if (count >= 2) {
16
+ console.log('Breaking now...');
17
+ break;
18
+ }
19
+ }
20
+
21
+ console.log('After break');
22
+ console.log('Finished:', cmd.finished);
23
+ console.log('Cancelled:', cmd._cancelled);
24
+
25
+ process.exit(0);
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // Test spawning jq directly without sh -c
4
+
5
+ console.log('Test: Spawn processes directly and pipe them\n');
6
+
7
+ // First process: emulator
8
+ const proc1 = Bun.spawn(['./js/examples/emulate-claude-stream.mjs'], {
9
+ stdout: 'pipe',
10
+ stderr: 'pipe',
11
+ });
12
+
13
+ // Second process: jq with stdin from first process
14
+ const proc2 = Bun.spawn(['jq', '.'], {
15
+ stdin: proc1.stdout,
16
+ stdout: 'pipe',
17
+ stderr: 'pipe',
18
+ });
19
+
20
+ const start = Date.now();
21
+ let chunkCount = 0;
22
+
23
+ for await (const chunk of proc2.stdout) {
24
+ chunkCount++;
25
+ const elapsed = Date.now() - start;
26
+ const text = Buffer.from(chunk).toString();
27
+ const lines = text.split('\n').filter((l) => l.trim());
28
+
29
+ if (chunkCount === 1) {
30
+ console.log(
31
+ `[${elapsed}ms] First chunk arrived with ${lines.length} lines`
32
+ );
33
+ console.log('First few lines:', lines.slice(0, 3));
34
+ } else {
35
+ console.log(
36
+ `[${elapsed}ms] Chunk ${chunkCount} with ${lines.length} lines`
37
+ );
38
+ }
39
+ }
40
+
41
+ console.log(`\nTotal chunks received: ${chunkCount}`);
42
+ console.log(
43
+ 'If streaming worked, we should see multiple chunks at different times'
44
+ );
45
+
46
+ await proc1.exited;
47
+ await proc2.exited;