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,17 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Testing option merging
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Testing option merging:');
8
+ const runner = $`echo "option merge test"`;
9
+
10
+ console.log('Initial options:', runner.options);
11
+ const result = await runner.start({
12
+ capture: false,
13
+ mirror: false,
14
+ customOption: 'test',
15
+ });
16
+ console.log('Final options:', runner.options);
17
+ console.log('Result:', { stdout: result.stdout, code: result.code });
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ // Enable trace to see what's happening
6
+ process.env.COMMAND_STREAM_TRACE = 'ProcessRunner';
7
+
8
+ async function debugOptions() {
9
+ console.log('🐛 Debugging options and spawn');
10
+
11
+ const catCmd = $`cat`;
12
+ console.log('1. Created cat command');
13
+
14
+ // This should trigger auto-start with pipe stdio
15
+ const stdinPromise = catCmd.streams.stdin;
16
+ console.log('2. Accessed streams.stdin (auto-start triggered)');
17
+
18
+ // Wait for start to complete
19
+ await new Promise((resolve) => setTimeout(resolve, 200));
20
+
21
+ console.log('3. After wait:');
22
+ console.log(' started:', catCmd.started);
23
+ console.log(' child exists:', !!catCmd.child);
24
+
25
+ if (catCmd.child) {
26
+ console.log(' child.stdin exists:', !!catCmd.child.stdin);
27
+ console.log(' child.stdin type:', typeof catCmd.child.stdin);
28
+ }
29
+
30
+ const stdin = await stdinPromise;
31
+ console.log('4. Awaited stdin:', typeof stdin, stdin);
32
+
33
+ catCmd.kill();
34
+ }
35
+
36
+ debugOptions();
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $, shell, enableVirtualCommands } from '../src/$.mjs';
4
+
5
+ enableVirtualCommands();
6
+ shell.verbose(false);
7
+
8
+ console.log('=== Debug Output Test ===\n');
9
+
10
+ console.log('Test 1: Simple pwd');
11
+ const r1 = await $`pwd`;
12
+ console.log('Output:', JSON.stringify(r1.stdout));
13
+ console.log('Trimmed:', JSON.stringify(r1.stdout.trim()));
14
+
15
+ console.log('\nTest 2: cd /tmp ; pwd');
16
+ const r2 = await $`cd /tmp ; pwd`;
17
+ console.log('Output:', JSON.stringify(r2.stdout));
18
+ console.log('Trimmed:', JSON.stringify(r2.stdout.trim()));
19
+
20
+ console.log('\nTest 3: cd /tmp ; pwd ; cd /usr ; pwd');
21
+ const r3 = await $`cd /tmp ; pwd ; cd /usr ; pwd`;
22
+ console.log('Output:', JSON.stringify(r3.stdout));
23
+ console.log('Split:', r3.stdout.trim().split('\n'));
24
+
25
+ process.chdir('/workspace/command-stream');
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env bun
2
+ // Debug script to test pattern matching in signal handler detection
3
+
4
+ import { $ } from '../src/$.mjs';
5
+
6
+ // Enable verbose mode
7
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
8
+
9
+ function testPatternMatching() {
10
+ console.log('=== Pattern Matching Debug ===');
11
+
12
+ console.log('\n1. Initial state:');
13
+ const initialListeners = process.listeners('SIGINT');
14
+ console.log('Initial listeners:', initialListeners.length);
15
+
16
+ console.log('\n2. Creating a runner to install handler...');
17
+ const runner = $`sleep 0.01`;
18
+ const afterCreation = process.listeners('SIGINT');
19
+ console.log('After creation:', afterCreation.length);
20
+
21
+ if (afterCreation.length > 0) {
22
+ const handler = afterCreation[0];
23
+ const handlerStr = handler.toString();
24
+
25
+ console.log('\n3. Testing pattern matching on actual handler:');
26
+ console.log('Handler length:', handlerStr.length);
27
+ console.log(
28
+ 'Contains activeProcessRunners:',
29
+ handlerStr.includes('activeProcessRunners')
30
+ );
31
+ console.log(
32
+ 'Contains ProcessRunner:',
33
+ handlerStr.includes('ProcessRunner')
34
+ );
35
+ console.log(
36
+ 'Contains activeChildren:',
37
+ handlerStr.includes('activeChildren')
38
+ );
39
+
40
+ const matchesPattern =
41
+ handlerStr.includes('activeProcessRunners') &&
42
+ handlerStr.includes('ProcessRunner') &&
43
+ handlerStr.includes('activeChildren');
44
+ console.log('Matches full pattern:', matchesPattern);
45
+
46
+ console.log('\n4. Handler excerpt (first 200 chars):');
47
+ console.log(`${handlerStr.substring(0, 200)}...`);
48
+ }
49
+
50
+ console.log('\n5. Testing manual cleanup simulation:');
51
+ // Simulate what tests do - manually remove the listener
52
+ const listenersToRemove = process.listeners('SIGINT');
53
+ listenersToRemove.forEach((l) => {
54
+ process.removeListener('SIGINT', l);
55
+ });
56
+
57
+ console.log('After manual removal:', process.listeners('SIGINT').length);
58
+
59
+ console.log('\n6. Creating another runner - should detect and reset:');
60
+ const runner2 = $`sleep 0.01`;
61
+ const afterSecondCreation = process.listeners('SIGINT');
62
+ console.log('After second creation:', afterSecondCreation.length);
63
+
64
+ // Clean up
65
+ runner.kill();
66
+ runner2.kill();
67
+ }
68
+
69
+ testPatternMatching();
@@ -0,0 +1,28 @@
1
+ #!/usr/bin/env node
2
+ // Debug pipeline with cat
3
+
4
+ import { $ } from '../src/$.mjs';
5
+
6
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
7
+
8
+ console.log('=== Debug pipeline with cat ===');
9
+
10
+ console.log('1. Test simple echo:');
11
+ const r1 = await $`echo "test"`;
12
+ console.log('Simple echo result:', JSON.stringify(r1.stdout));
13
+
14
+ console.log('2. Test simple cat with stdin:');
15
+ const r2 = $`cat`;
16
+ r2.options.stdin = 'test';
17
+ await r2;
18
+ console.log('Cat with stdin result:', JSON.stringify(r2.result.stdout));
19
+
20
+ console.log('3. Test pipeline echo | cat:');
21
+ const r3 = await $`echo "test" | cat`;
22
+ console.log('Pipeline result:', JSON.stringify(r3.stdout));
23
+
24
+ console.log('4. Test pipeline echo | cat | cat:');
25
+ const r4 = await $`echo "test" | cat | cat`;
26
+ console.log('Double pipeline result:', JSON.stringify(r4.stdout));
27
+
28
+ console.log('=== Complete ===');
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env bun
2
+ // Debug script to test pipeline cleanup issues
3
+
4
+ import { $ } from '../src/$.mjs';
5
+
6
+ // Enable verbose mode
7
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
8
+
9
+ async function testPipelineCleanup() {
10
+ console.log('=== Pipeline Cleanup Debug ===');
11
+
12
+ console.log('\n1. Testing basic pipeline...');
13
+ try {
14
+ const result1 = await $`echo "test"`.pipe($`cat`);
15
+ console.log('Basic pipeline result:', result1.stdout);
16
+ } catch (error) {
17
+ console.log('Basic pipeline error:', error.message);
18
+ }
19
+
20
+ console.log('\n2. Testing pipeline with virtual commands...');
21
+ try {
22
+ const result2 = await $`ls`.pipe($`cat`);
23
+ console.log('Virtual pipeline result length:', result2.stdout.length);
24
+ } catch (error) {
25
+ console.log('Virtual pipeline error:', error.message);
26
+ }
27
+
28
+ console.log('\n3. Testing multi-stage pipeline...');
29
+ try {
30
+ const result3 = await $`echo "line1\\nline2\\nline3"`
31
+ .pipe($`grep "line"`)
32
+ .pipe($`wc -l`);
33
+ console.log('Multi-stage pipeline result:', result3.stdout.trim());
34
+ } catch (error) {
35
+ console.log('Multi-stage pipeline error:', error.message);
36
+ }
37
+
38
+ console.log('\n4. Testing pipeline with error...');
39
+ try {
40
+ const result4 = await $`echo "test"`.pipe($`nonexistent-command`);
41
+ console.log('Error pipeline result:', result4.stdout);
42
+ } catch (error) {
43
+ console.log('Expected error pipeline error:', error.message);
44
+ }
45
+
46
+ console.log('\n5. Testing pipeline interruption...');
47
+ const longPipeline = $`yes`.pipe($`head -1000`);
48
+ const pipelinePromise = longPipeline.start();
49
+
50
+ // Interrupt after a short delay
51
+ setTimeout(() => {
52
+ console.log('Interrupting pipeline...');
53
+ longPipeline.kill('SIGINT');
54
+ }, 50);
55
+
56
+ try {
57
+ const result5 = await pipelinePromise;
58
+ console.log('Interrupted pipeline result length:', result5.stdout.length);
59
+ } catch (error) {
60
+ console.log(
61
+ 'Interrupted pipeline error:',
62
+ error.message,
63
+ 'code:',
64
+ error.code
65
+ );
66
+ }
67
+
68
+ console.log('\nPipeline tests completed');
69
+ }
70
+
71
+ testPipelineCleanup().catch(console.error);
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env bun
2
+ // Detailed debug script for pipeline error cleanup
3
+
4
+ import { $ } from '../src/$.mjs';
5
+
6
+ // Enable verbose mode for tracing
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
+ };
24
+ }
25
+
26
+ async function testPipelineErrorDetailed() {
27
+ console.log('=== Pipeline Error Detailed Debug ===');
28
+
29
+ console.log('\n1. Initial state:', getInternalState());
30
+
31
+ console.log('\n2. Creating pipeline runner...');
32
+ const runner = $`echo "test" | exit 1 | cat`;
33
+ console.log('After creating runner:', getInternalState());
34
+
35
+ console.log('\n3. Starting pipeline...');
36
+ let result, error;
37
+ try {
38
+ result = await runner;
39
+ console.log('Pipeline succeeded (unexpected):', result);
40
+ } catch (e) {
41
+ error = e;
42
+ console.log('Pipeline failed (expected):', e.message, 'code:', e.code);
43
+ }
44
+
45
+ console.log('\n4. Immediately after pipeline completion/failure:');
46
+ console.log('State:', getInternalState());
47
+ console.log('Runner finished?', runner.finished);
48
+ console.log('Runner started?', runner.started);
49
+
50
+ console.log('\n5. After 10ms:');
51
+ await new Promise((resolve) => setTimeout(resolve, 10));
52
+ console.log('State:', getInternalState());
53
+
54
+ console.log('\n6. After 50ms:');
55
+ await new Promise((resolve) => setTimeout(resolve, 40));
56
+ console.log('State:', getInternalState());
57
+
58
+ console.log('\n7. After 100ms:');
59
+ await new Promise((resolve) => setTimeout(resolve, 50));
60
+ console.log('State:', getInternalState());
61
+
62
+ // Manually cleanup if needed
63
+ console.log('\n8. Manual cleanup test...');
64
+ if (typeof runner._cleanup === 'function') {
65
+ runner._cleanup();
66
+ console.log('After manual cleanup:', getInternalState());
67
+ }
68
+
69
+ // Check if runner can be killed
70
+ console.log('\n9. Kill test...');
71
+ if (!runner.finished) {
72
+ runner.kill();
73
+ console.log('After kill:', getInternalState());
74
+ console.log('Runner finished after kill?', runner.finished);
75
+ }
76
+ }
77
+
78
+ testPipelineErrorDetailed().catch(console.error);
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env bun
2
+ // Debug script to test the specific pipeline error scenario
3
+
4
+ import { $ } from '../src/$.mjs';
5
+
6
+ // Enable verbose mode
7
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
8
+
9
+ async function testPipelineError() {
10
+ console.log('=== Pipeline Error Debug ===');
11
+
12
+ console.log('\n1. Initial state:');
13
+ const initialListeners = process.listeners('SIGINT').length;
14
+ console.log('Initial SIGINT listeners:', initialListeners);
15
+
16
+ console.log('\n2. Running failing pipeline: echo "test" | exit 1 | cat');
17
+
18
+ try {
19
+ await $`echo "test" | exit 1 | cat`;
20
+ console.log('Pipeline succeeded (unexpected)');
21
+ } catch (e) {
22
+ console.log('Pipeline failed as expected:', e.message, 'code:', e.code);
23
+ }
24
+
25
+ console.log('\n3. Immediately after pipeline:');
26
+ console.log('SIGINT listeners:', process.listeners('SIGINT').length);
27
+
28
+ console.log('\n4. After 50ms wait:');
29
+ await new Promise((resolve) => setTimeout(resolve, 50));
30
+ console.log('SIGINT listeners:', process.listeners('SIGINT').length);
31
+
32
+ console.log('\n5. After 100ms total:');
33
+ await new Promise((resolve) => setTimeout(resolve, 50));
34
+ console.log('SIGINT listeners:', process.listeners('SIGINT').length);
35
+
36
+ console.log('\n6. After 200ms total:');
37
+ await new Promise((resolve) => setTimeout(resolve, 100));
38
+ console.log('SIGINT listeners:', process.listeners('SIGINT').length);
39
+
40
+ console.log('\nFinal result:');
41
+ console.log('Expected:', initialListeners);
42
+ console.log('Actual:', process.listeners('SIGINT').length);
43
+ console.log(
44
+ 'Cleaned up properly:',
45
+ process.listeners('SIGINT').length === initialListeners
46
+ );
47
+
48
+ // Show any remaining handlers
49
+ const remaining = process.listeners('SIGINT');
50
+ if (remaining.length > initialListeners) {
51
+ console.log('\nRemaining handlers:');
52
+ remaining.forEach((handler, i) => {
53
+ const str = handler.toString();
54
+ const isCommandStream =
55
+ str.includes('activeProcessRunners') ||
56
+ str.includes('ProcessRunner') ||
57
+ str.includes('activeChildren');
58
+ console.log(
59
+ `Handler ${i}: ${isCommandStream ? 'COMMAND-STREAM' : 'OTHER'} (${str.length} chars)`
60
+ );
61
+ });
62
+ }
63
+ }
64
+
65
+ testPipelineError().catch(console.error);
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Pipeline Debug ===\n');
6
+
7
+ // Add some debug tracing
8
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
9
+
10
+ console.log('1. Simple non-pipeline jq test:');
11
+ const simple = await $`jq --color-output . <<< '{"test": "simple"}'`;
12
+ console.log('Simple result:');
13
+ process.stdout.write(simple.stdout);
14
+ console.log('Simple raw bytes:', Buffer.from(simple.stdout.slice(0, 30)));
15
+
16
+ console.log('\n2. Pipeline jq test:');
17
+ const pipeline = await $`echo '{"test": "pipeline"}' | jq --color-output .`;
18
+ console.log('Pipeline result:');
19
+ process.stdout.write(pipeline.stdout);
20
+ console.log('Pipeline raw bytes:', Buffer.from(pipeline.stdout.slice(0, 30)));
21
+
22
+ console.log('\n3. Testing printf pipeline:');
23
+ const printf = await $`printf '{"test": "printf"}' | jq --color-output .`;
24
+ console.log('Printf result:');
25
+ process.stdout.write(printf.stdout);
26
+ console.log('Printf raw bytes:', Buffer.from(printf.stdout.slice(0, 30)));
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Debug Which Pipeline Method is Used ===\n');
6
+
7
+ // Enable verbose tracing to see which pipeline method is called
8
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
9
+
10
+ console.log('Testing pipeline command:');
11
+ const proc = $`printf '{"test": "data"}' | jq --color-output .`;
12
+
13
+ proc.on('stdout', (chunk) => {
14
+ console.log('STDOUT EVENT - Type:', typeof chunk, chunk.constructor.name);
15
+ console.log('STDOUT EVENT - Bytes:', Buffer.from(chunk.slice(0, 30)));
16
+ console.log('STDOUT EVENT - Content:');
17
+ process.stdout.write(chunk);
18
+ console.log('--- END STDOUT EVENT ---');
19
+ });
20
+
21
+ const result = await proc;
22
+ console.log('\nFinal result complete.');
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Pipeline Stream Debug ===');
6
+
7
+ const cmd = $`sh -c 'echo "test"' | jq -c .`;
8
+
9
+ // Instrument the stream method
10
+ const originalStream = cmd.stream.bind(cmd);
11
+ cmd.stream = function () {
12
+ console.log('stream() called for pipeline');
13
+
14
+ const generator = originalStream();
15
+
16
+ const originalNext = generator.next.bind(generator);
17
+ generator.next = function () {
18
+ console.log('pipeline generator.next() called');
19
+ const promise = originalNext();
20
+
21
+ promise
22
+ .then((result) => {
23
+ console.log('pipeline generator.next() resolved:', {
24
+ done: result.done,
25
+ hasValue: !!result.value,
26
+ valueType: result.value?.type,
27
+ });
28
+ })
29
+ .catch((err) => {
30
+ console.log('pipeline generator.next() error:', err.message);
31
+ });
32
+
33
+ return promise;
34
+ };
35
+
36
+ return generator;
37
+ };
38
+
39
+ const timeout = setTimeout(() => {
40
+ console.log('TIMEOUT: Pipeline stream took too long');
41
+ process.exit(1);
42
+ }, 5000);
43
+
44
+ try {
45
+ let count = 0;
46
+ console.log('Starting pipeline stream...');
47
+ for await (const chunk of cmd.stream()) {
48
+ count++;
49
+ console.log(
50
+ `Pipeline chunk ${count}:`,
51
+ chunk.type,
52
+ JSON.stringify(chunk.data.toString().trim())
53
+ );
54
+
55
+ if (count >= 3) {
56
+ console.log('Breaking after 3 chunks');
57
+ break;
58
+ }
59
+ }
60
+
61
+ clearTimeout(timeout);
62
+ console.log('Pipeline stream completed with', count, 'chunks');
63
+ } catch (error) {
64
+ clearTimeout(timeout);
65
+ console.log('Pipeline stream error:', error.message);
66
+ }
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Debug Pipeline Selection ===\n');
6
+
7
+ // Add debug output to see which pipeline method is being used
8
+ const originalRunPipeline = $.prototype._runPipeline;
9
+
10
+ // Simple test
11
+ console.log('Testing: echo "test" | cat');
12
+ const cmd = $`echo "test" | cat`;
13
+ const result = await cmd;
14
+ console.log('Result:', result.stdout);
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env bun
2
+ // Debug script to trace process.exit calls
3
+
4
+ import { $ } from '../src/$.mjs';
5
+
6
+ // Enable verbose mode
7
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
8
+
9
+ // Monkey patch process.exit to trace calls
10
+ const originalExit = process.exit;
11
+ process.exit = function (code) {
12
+ console.log(`🚨 process.exit(${code}) called`);
13
+ console.log('Stack trace:', new Error().stack);
14
+ return originalExit.call(this, code);
15
+ };
16
+
17
+ let cleanupDone = false;
18
+
19
+ // User handler
20
+ process.on('SIGINT', async () => {
21
+ console.log('CHILD_CLEANUP_START');
22
+ await new Promise((resolve) => setTimeout(resolve, 100));
23
+ cleanupDone = true;
24
+ console.log('CHILD_CLEANUP_DONE - calling process.exit(0)');
25
+ process.exit(0);
26
+ });
27
+
28
+ console.log('CHILD_READY');
29
+
30
+ try {
31
+ const sleepPromise = $`sleep 5`.start();
32
+
33
+ setTimeout(() => {
34
+ console.log('Sending SIGINT...');
35
+ process.kill(process.pid, 'SIGINT');
36
+ }, 500);
37
+
38
+ await sleepPromise;
39
+ } catch (error) {
40
+ console.log('SLEEP_INTERRUPTED:', error.message);
41
+ }
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Process Path Debug ===');
6
+
7
+ // Enable verbose tracing to see which code path is taken
8
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
9
+
10
+ console.log('Testing simple echo command path...');
11
+ const cmd = $`echo "test"`;
12
+
13
+ // Add event listeners to track what happens
14
+ cmd.on('data', (chunk) => {
15
+ console.log(
16
+ '[EVENT] data:',
17
+ chunk.type,
18
+ JSON.stringify(chunk.data.toString().trim())
19
+ );
20
+ });
21
+
22
+ cmd.on('end', (result) => {
23
+ console.log(
24
+ '[EVENT] end:',
25
+ result.code,
26
+ JSON.stringify(result.stdout.trim())
27
+ );
28
+ });
29
+
30
+ cmd.on('exit', (code) => {
31
+ console.log('[EVENT] exit:', code);
32
+ });
33
+
34
+ console.log('Awaiting result...');
35
+ const result = await cmd;
36
+ console.log('Final result:', result.code, JSON.stringify(result.stdout.trim()));
37
+
38
+ console.log('Process path debug completed!');
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Property Check Debug ===');
6
+
7
+ const cmd = $`echo "test"`;
8
+
9
+ console.log(
10
+ 'Object.getOwnPropertyDescriptor(cmd, "stdout"):',
11
+ Object.getOwnPropertyDescriptor(cmd, 'stdout')
12
+ );
13
+
14
+ console.log(
15
+ 'Object.getOwnPropertyDescriptor(Object.getPrototypeOf(cmd), "stdout"):',
16
+ Object.getOwnPropertyDescriptor(Object.getPrototypeOf(cmd), 'stdout')
17
+ );
18
+
19
+ console.log('cmd.hasOwnProperty("stdout"):', cmd.hasOwnProperty('stdout'));
20
+
21
+ console.log('cmd.stdout:', cmd.stdout);
22
+
23
+ console.log('Getting property names:');
24
+ console.log('Object.getOwnPropertyNames(cmd):');
25
+ Object.getOwnPropertyNames(cmd).forEach((name) => {
26
+ if (name.includes('std')) {
27
+ console.log(' ', name, ':', cmd[name]);
28
+ }
29
+ });