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,24 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Debug Streaming Test ===\n');
6
+
7
+ // Test without pipe first
8
+ console.log('Test 1: No pipe (should work):');
9
+ try {
10
+ const result = await $`echo "hello"`;
11
+ console.log('Result:', result.stdout);
12
+ } catch (e) {
13
+ console.error('Error:', e.message);
14
+ }
15
+
16
+ // Test with simple pipe
17
+ console.log('\nTest 2: Simple pipe:');
18
+ try {
19
+ const result = await $`echo "hello" | cat`;
20
+ console.log('Result:', result.stdout);
21
+ } catch (e) {
22
+ console.error('Error:', e.message);
23
+ console.error('Stack:', e.stack);
24
+ }
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { spawn } from 'child_process';
4
+ import { readdirSync } from 'fs';
5
+
6
+ // Get all test files
7
+ const testFiles = readdirSync('tests').filter((f) => f.endsWith('.test.mjs'));
8
+
9
+ function getSigintHandlerCount() {
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
+ return commandStreamListeners.length;
20
+ }
21
+
22
+ console.log('=== Test Isolation Debug ===');
23
+ console.log(`Initial SIGINT handlers: ${getSigintHandlerCount()}`);
24
+
25
+ // Run a few key tests individually and check handler count
26
+ const keyTests = [
27
+ 'resource-cleanup-internals.test.mjs',
28
+ 'cleanup-verification.test.mjs',
29
+ 'sigint-cleanup.test.mjs',
30
+ 'sigint-cleanup-isolated.test.mjs',
31
+ ];
32
+
33
+ for (const testFile of keyTests) {
34
+ console.log(`\n--- Running ${testFile} ---`);
35
+ console.log(`Before: ${getSigintHandlerCount()} handlers`);
36
+
37
+ try {
38
+ const result = spawn('bun', ['test', `tests/${testFile}`, '--verbose'], {
39
+ stdio: ['inherit', 'pipe', 'pipe'],
40
+ timeout: 30000,
41
+ });
42
+
43
+ await new Promise((resolve, reject) => {
44
+ result.on('close', resolve);
45
+ result.on('error', reject);
46
+ setTimeout(() => reject(new Error('timeout')), 30000);
47
+ });
48
+
49
+ console.log(`After: ${getSigintHandlerCount()} handlers`);
50
+ } catch (error) {
51
+ console.log(`Error running ${testFile}:`, error.message);
52
+ console.log(`After (with error): ${getSigintHandlerCount()} handlers`);
53
+ }
54
+ }
@@ -0,0 +1,27 @@
1
+ // Debug test to understand why virtual commands get bypassed in full test suite
2
+ import { $ } from '../src/$.mjs';
3
+
4
+ async function debugTestState() {
5
+ console.log('=== Debug Test State ===');
6
+
7
+ // Test 1: Simple echo
8
+ console.log('\nTest 1: Simple echo');
9
+ const result1 = await $`echo simple`;
10
+ console.log('Result1:', JSON.stringify(result1.stdout.trim()));
11
+
12
+ // Test 2: Echo with interpolation (like the failing test)
13
+ console.log('\nTest 2: Echo with interpolation');
14
+ const name = 'World';
15
+ const $custom = $({ capture: true, mirror: false });
16
+ const result2 = await $custom`echo Hello, ${name}!`;
17
+ console.log('Result2:', JSON.stringify(result2.stdout.trim()));
18
+ console.log('Expected:', JSON.stringify("Hello, 'World'!"));
19
+ console.log('Test passes:', result2.stdout.trim() === "Hello, 'World'!");
20
+
21
+ // Test 3: Another echo to see if state persists
22
+ console.log('\nTest 3: Another echo');
23
+ const result3 = await $`echo test`;
24
+ console.log('Result3:', JSON.stringify(result3.stdout.trim()));
25
+ }
26
+
27
+ debugTestState().catch(console.error);
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ let sigintReceived = false;
6
+
7
+ process.on('SIGINT', () => {
8
+ sigintReceived = true;
9
+ console.log('USER_SIGINT_HANDLER_CALLED');
10
+ process.exit(42); // Custom exit code to verify user handler was called
11
+ });
12
+
13
+ console.log('Process started, waiting for SIGINT...');
14
+
15
+ // Wait for SIGINT (simulate doing some work without child processes)
16
+ setTimeout(() => {
17
+ console.log('TIMEOUT_REACHED - no SIGINT received');
18
+ process.exit(1); // Should not reach here in test
19
+ }, 5000);
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Enable verbose tracing
4
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
5
+
6
+ import { $, disableVirtualCommands } from '../src/$.mjs';
7
+
8
+ console.log('=== Virtual Disable Debug ===');
9
+
10
+ console.log('1. Before disabling virtual commands:');
11
+ const cmd1 = $`echo "test1"`;
12
+ cmd1.start();
13
+ console.log('Immediate child1:', !!cmd1.child);
14
+ await cmd1;
15
+
16
+ console.log('2. After disabling virtual commands:');
17
+ disableVirtualCommands();
18
+ const cmd2 = $`echo "test2"`;
19
+ cmd2.start();
20
+ console.log('Immediate child2:', !!cmd2.child);
21
+ await cmd2;
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $, disableVirtualCommands } from '../src/$.mjs';
4
+
5
+ console.log('=== Virtual vs Real Commands Debug ===');
6
+
7
+ console.log('1. Testing with virtual commands enabled:');
8
+ const cmd1 = $`echo "virtual test"`;
9
+
10
+ cmd1.on('end', (result) => {
11
+ console.log('[VIRTUAL] end event:', result.code);
12
+ });
13
+
14
+ const result1 = await cmd1;
15
+ console.log(
16
+ '[VIRTUAL] await result:',
17
+ result1.code,
18
+ JSON.stringify(result1.stdout.trim())
19
+ );
20
+
21
+ console.log('2. Testing with virtual commands disabled:');
22
+ disableVirtualCommands();
23
+
24
+ const cmd2 = $`echo "real test"`;
25
+
26
+ cmd2.on('end', (result) => {
27
+ console.log('[REAL] end event:', result.code);
28
+ });
29
+
30
+ const result2 = await cmd2;
31
+ console.log(
32
+ '[REAL] await result:',
33
+ result2.code,
34
+ JSON.stringify(result2.stdout.trim())
35
+ );
36
+
37
+ console.log('3. Testing stream with virtual commands disabled:');
38
+ const cmd3 = $`echo "real stream test"`;
39
+ let streamEndFired = false;
40
+
41
+ cmd3.on('end', (result) => {
42
+ streamEndFired = true;
43
+ console.log('[REAL STREAM] end event:', result.code);
44
+ });
45
+
46
+ console.log('Starting stream...');
47
+ try {
48
+ const chunks = [];
49
+ for await (const chunk of cmd3.stream()) {
50
+ chunks.push(chunk);
51
+ console.log(
52
+ '[REAL STREAM] chunk:',
53
+ chunk.type,
54
+ JSON.stringify(chunk.data.toString().trim())
55
+ );
56
+
57
+ // Break after receiving data to see if end event fires
58
+ if (chunks.length >= 1) {
59
+ console.log('[REAL STREAM] Breaking after first chunk');
60
+ break;
61
+ }
62
+ }
63
+ console.log('[REAL STREAM] Stream completed, end fired?', streamEndFired);
64
+ } catch (error) {
65
+ console.log('[REAL STREAM] Error:', error.message);
66
+ }
67
+
68
+ console.log('Debug completed!');
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Set trace before importing
4
+ process.env.COMMAND_STREAM_TRACE = 'all';
5
+ process.env.COMMAND_STREAM_VERBOSE = 'true';
6
+
7
+ import { $ } from '../src/$.mjs';
8
+
9
+ async function debugWithTrace() {
10
+ console.log('🐛 Testing with full tracing enabled');
11
+
12
+ const sortCmd = $`echo "test" | sort`;
13
+ console.log('Created command');
14
+
15
+ try {
16
+ const result = await sortCmd;
17
+ console.log('Result:', result);
18
+ } catch (error) {
19
+ console.log('Error:', error.message);
20
+ }
21
+ }
22
+
23
+ debugWithTrace();
@@ -0,0 +1,22 @@
1
+ import { $ } from '../src/$.mjs';
2
+
3
+ console.log('=== PARENT STREAM CLOSURE TEST ===');
4
+
5
+ // Start a long-running command
6
+ const runner = $`sleep 5`;
7
+ const promise = runner.start();
8
+
9
+ // Simulate parent stream closure after a delay
10
+ setTimeout(() => {
11
+ console.log('SIMULATING_PARENT_STREAM_CLOSURE');
12
+ process.stdout.destroy(); // This should trigger cleanup
13
+ }, 1000);
14
+
15
+ try {
16
+ await promise;
17
+ console.log('COMMAND_COMPLETED');
18
+ } catch (error) {
19
+ console.log('COMMAND_INTERRUPTED:', error.message);
20
+ }
21
+
22
+ console.log('=== TEST DONE ===');
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // Emulate claude's streaming JSON output
4
+ // This simulates how claude outputs JSON objects incrementally
5
+
6
+ const events = [
7
+ { type: 'start', message: 'Starting analysis...' },
8
+ { type: 'progress', step: 1, message: 'Reading files...' },
9
+ { type: 'data', content: 'Found main entry point' },
10
+ { type: 'progress', step: 2, message: 'Analyzing dependencies...' },
11
+ { type: 'data', content: 'Processing module imports' },
12
+ { type: 'progress', step: 3, message: 'Building context...' },
13
+ { type: 'result', summary: 'Analysis complete' },
14
+ { type: 'end', status: 'success' },
15
+ ];
16
+
17
+ async function* streamJsonEvents() {
18
+ for (const event of events) {
19
+ // Output JSON object
20
+ console.log(JSON.stringify(event));
21
+
22
+ // Small delay to simulate processing
23
+ await new Promise((resolve) => setTimeout(resolve, 200));
24
+ }
25
+ }
26
+
27
+ // Main execution
28
+ for await (const _ of streamJsonEvents()) {
29
+ // Events are printed in the generator
30
+ }
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // Direct execution of emulator
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Direct execution of emulator:');
8
+ const start = Date.now();
9
+
10
+ for await (const chunk of $`bun run js/examples/emulate-claude-stream.mjs`.stream()) {
11
+ if (chunk.type === 'stdout') {
12
+ const elapsed = Date.now() - start;
13
+ const lines = chunk.data
14
+ .toString()
15
+ .trim()
16
+ .split('\n')
17
+ .filter((l) => l);
18
+ for (const line of lines) {
19
+ console.log(`[${elapsed}ms] ${line}`);
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // Emulator piped through jq
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Emulator piped through jq:');
8
+ const start = Date.now();
9
+
10
+ for await (const chunk of $`bun run js/examples/emulate-claude-stream.mjs | jq .`.stream()) {
11
+ if (chunk.type === 'stdout') {
12
+ const elapsed = Date.now() - start;
13
+ const lines = chunk.data
14
+ .toString()
15
+ .trim()
16
+ .split('\n')
17
+ .filter((l) => l);
18
+ for (const line of lines) {
19
+ console.log(`[${elapsed}ms] ${line}`);
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env bun
2
+
3
+ // Using sh -c with pipe
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Using sh -c with pipe:');
8
+ const start = Date.now();
9
+
10
+ const cmd = $`sh -c 'bun run js/examples/emulate-claude-stream.mjs | jq .'`;
11
+ for await (const chunk of cmd.stream()) {
12
+ if (chunk.type === 'stdout') {
13
+ const elapsed = Date.now() - start;
14
+ const lines = chunk.data
15
+ .toString()
16
+ .trim()
17
+ .split('\n')
18
+ .filter((l) => l);
19
+ for (const line of lines) {
20
+ console.log(`[${elapsed}ms] ${line}`);
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,73 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Build process simulation with events
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Build process simulation:');
8
+ const $buildProcess = $({ mirror: false });
9
+
10
+ try {
11
+ const buildScript = `
12
+ echo "Build started"
13
+ echo "Compiling TypeScript..." >&2
14
+ sleep 0.5
15
+ echo "✓ TypeScript compilation complete"
16
+ echo "Running tests..." >&2
17
+ sleep 0.8
18
+ echo "✓ All tests passed (15/15)"
19
+ echo "Bundling assets..." >&2
20
+ sleep 0.6
21
+ echo "✓ Assets bundled successfully"
22
+ echo "Optimizing..." >&2
23
+ sleep 0.4
24
+ echo "✓ Optimization complete"
25
+ echo "Build finished successfully"
26
+ `;
27
+
28
+ const runner = $buildProcess`bash -c '${buildScript}'`;
29
+
30
+ const buildSteps = [];
31
+ const startTime = Date.now();
32
+
33
+ runner.on('stdout', (data) => {
34
+ const lines = data
35
+ .toString()
36
+ .split('\n')
37
+ .filter((line) => line.trim());
38
+ for (const line of lines) {
39
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
40
+
41
+ if (line.startsWith('✓')) {
42
+ buildSteps.push(line);
43
+ console.log(`[${elapsed}s] ✅ ${line.substring(2)}`);
44
+ } else if (line.includes('Build started')) {
45
+ console.log(`[${elapsed}s] 🚀 ${line}`);
46
+ } else if (line.includes('Build finished')) {
47
+ console.log(`[${elapsed}s] 🎉 ${line}`);
48
+ }
49
+ }
50
+ });
51
+
52
+ runner.on('stderr', (data) => {
53
+ const lines = data
54
+ .toString()
55
+ .split('\n')
56
+ .filter((line) => line.trim());
57
+ for (const line of lines) {
58
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
59
+ console.log(`[${elapsed}s] ⏳ ${line}`);
60
+ }
61
+ });
62
+
63
+ runner.on('close', (code) => {
64
+ const totalTime = ((Date.now() - startTime) / 1000).toFixed(1);
65
+ console.log(
66
+ `🏁 Build completed in ${totalTime}s with ${buildSteps.length} successful steps`
67
+ );
68
+ });
69
+
70
+ await runner;
71
+ } catch (error) {
72
+ console.log(`Error: ${error.message}`);
73
+ }
@@ -0,0 +1,51 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Multiple concurrent event streams
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Multiple concurrent event streams:');
8
+
9
+ const $concurrent1 = $({ mirror: false });
10
+ const $concurrent2 = $({ mirror: false });
11
+ const $concurrent3 = $({ mirror: false });
12
+
13
+ try {
14
+ console.log('Starting concurrent ping streams...');
15
+
16
+ const runners = [
17
+ { runner: $concurrent1`ping -c 3 8.8.8.8`, name: 'Google DNS' },
18
+ { runner: $concurrent2`ping -c 3 1.1.1.1`, name: 'Cloudflare DNS' },
19
+ { runner: $concurrent3`ping -c 3 127.0.0.1`, name: 'Localhost' },
20
+ ];
21
+
22
+ const results = {};
23
+
24
+ for (const { runner, name } of runners) {
25
+ results[name] = { packets: 0, completed: false };
26
+
27
+ runner.on('stdout', (data) => {
28
+ const output = data.toString().trim();
29
+ if (output.includes('bytes from')) {
30
+ results[name].packets++;
31
+ console.log(`🌐 ${name}: packet #${results[name].packets}`);
32
+ }
33
+ });
34
+
35
+ runner.on('close', (code) => {
36
+ results[name].completed = true;
37
+ console.log(`✅ ${name}: completed (${results[name].packets} packets)`);
38
+ });
39
+ }
40
+
41
+ // Wait for all to complete
42
+ await Promise.all(runners.map(({ runner }) => runner));
43
+
44
+ console.log('\n📊 Final results:');
45
+ for (const [name, data] of Object.entries(results)) {
46
+ const status = data.completed ? '✅' : '❌';
47
+ console.log(`${status} ${name}: ${data.packets} packets received`);
48
+ }
49
+ } catch (error) {
50
+ console.log(`❌ Error: ${error.message}`);
51
+ }
@@ -0,0 +1,59 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Error handling and recovery with events
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Error handling and recovery:');
8
+ const $errorTest = $({ mirror: false });
9
+
10
+ try {
11
+ // First try a command that will fail
12
+ console.log('Testing error handling...');
13
+ const failRunner = $errorTest`ping -c 2 invalid.host.name.that.does.not.exist`;
14
+
15
+ const errorMessages = [];
16
+
17
+ failRunner.on('stdout', (data) => {
18
+ console.log(`📤 Stdout: ${data.toString().trim()}`);
19
+ });
20
+
21
+ failRunner.on('stderr', (data) => {
22
+ const error = data.toString().trim();
23
+ errorMessages.push(error);
24
+ console.log(`🚨 Stderr: ${error}`);
25
+ });
26
+
27
+ failRunner.on('close', (code) => {
28
+ console.log(`🔚 Failed command exit code: ${code}`);
29
+ console.log(`📝 Error messages collected: ${errorMessages.length}`);
30
+ });
31
+
32
+ try {
33
+ await failRunner;
34
+ } catch (error) {
35
+ console.log(`⚠️ Caught error: ${error.message}`);
36
+ }
37
+
38
+ // Then try a command that succeeds
39
+ console.log('\nTesting successful recovery...');
40
+ const successRunner = $errorTest`ping -c 2 127.0.0.1`;
41
+
42
+ let successCount = 0;
43
+
44
+ successRunner.on('stdout', (data) => {
45
+ const output = data.toString().trim();
46
+ if (output.includes('bytes from')) {
47
+ successCount++;
48
+ console.log(`✅ Success #${successCount}: Local ping OK`);
49
+ }
50
+ });
51
+
52
+ successRunner.on('close', (code) => {
53
+ console.log(`🎯 Recovery successful with code: ${code}`);
54
+ });
55
+
56
+ await successRunner;
57
+ } catch (error) {
58
+ console.log(`❌ Unexpected error: ${error.message}`);
59
+ }
@@ -0,0 +1,66 @@
1
+ #!/usr/bin/env node
2
+
3
+ // File monitoring simulation with events
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('File monitoring simulation:');
8
+ const $fileMonitor = $({ mirror: false, capture: true });
9
+
10
+ try {
11
+ const monitorScript = `
12
+ echo "File: config.json - CREATED"
13
+ sleep 0.3
14
+ echo "File: config.json - MODIFIED"
15
+ sleep 0.3
16
+ echo "File: app.log - CREATED"
17
+ sleep 0.3
18
+ echo "File: temp.txt - CREATED"
19
+ sleep 0.3
20
+ echo "File: temp.txt - DELETED"
21
+ sleep 0.3
22
+ echo "File: config.json - MODIFIED"
23
+ `;
24
+
25
+ const runner = $fileMonitor`bash -c '${monitorScript}'`;
26
+
27
+ const fileEvents = new Map();
28
+
29
+ runner.on('stdout', (data) => {
30
+ const lines = data
31
+ .toString()
32
+ .split('\n')
33
+ .filter((line) => line.trim());
34
+ for (const line of lines) {
35
+ const match = line.match(/File: (.+) - (.+)/);
36
+ if (match) {
37
+ const [, filename, action] = match;
38
+
39
+ if (!fileEvents.has(filename)) {
40
+ fileEvents.set(filename, []);
41
+ }
42
+ fileEvents.get(filename).push(action);
43
+
44
+ const emoji =
45
+ {
46
+ CREATED: '📄',
47
+ MODIFIED: '✏️',
48
+ DELETED: '🗑️',
49
+ }[action] || '📋';
50
+
51
+ console.log(`${emoji} ${filename}: ${action.toLowerCase()}`);
52
+ }
53
+ }
54
+ });
55
+
56
+ runner.on('close', (code) => {
57
+ console.log(`📊 File activity summary:`);
58
+ for (const [filename, events] of fileEvents) {
59
+ console.log(` ${filename}: ${events.join(' → ')}`);
60
+ }
61
+ });
62
+
63
+ await runner;
64
+ } catch (error) {
65
+ console.log(`Error: ${error.message}`);
66
+ }
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Interactive command simulation with events
4
+
5
+ import { $ } from '../src/$.mjs';
6
+
7
+ console.log('Interactive command simulation:');
8
+ const $interactive = $({ stdin: 'John\n25\nDeveloper\ny\n', mirror: false });
9
+
10
+ try {
11
+ const interactiveScript = `
12
+ echo "Please enter your name:"
13
+ read name
14
+ echo "Hello $name!"
15
+ echo "Please enter your age:"
16
+ read age
17
+ echo "You are $age years old."
18
+ echo "Please enter your job:"
19
+ read job
20
+ echo "So you work as a $job."
21
+ echo "Is this correct? (y/n):"
22
+ read confirm
23
+ if [ "$confirm" = "y" ]; then
24
+ echo "Profile saved successfully!"
25
+ else
26
+ echo "Profile cancelled."
27
+ fi
28
+ `;
29
+
30
+ const runner = $interactive`bash -c '${interactiveScript}'`;
31
+
32
+ let questionCount = 0;
33
+ let responseCount = 0;
34
+
35
+ runner.on('stdout', (data) => {
36
+ const lines = data
37
+ .toString()
38
+ .split('\n')
39
+ .filter((line) => line.trim());
40
+ for (const line of lines) {
41
+ if (line.includes('Please enter') || line.includes('Is this correct')) {
42
+ questionCount++;
43
+ console.log(`❓ Question #${questionCount}: ${line}`);
44
+ } else if (
45
+ line.includes('Hello') ||
46
+ line.includes('You are') ||
47
+ line.includes('So you work')
48
+ ) {
49
+ responseCount++;
50
+ console.log(`💬 Response #${responseCount}: ${line}`);
51
+ } else if (
52
+ line.includes('Profile saved') ||
53
+ line.includes('Profile cancelled')
54
+ ) {
55
+ console.log(`✅ Result: ${line}`);
56
+ }
57
+ }
58
+ });
59
+
60
+ runner.on('close', (code) => {
61
+ console.log(
62
+ `📝 Interactive session completed: ${questionCount} questions, ${responseCount} responses`
63
+ );
64
+ });
65
+
66
+ await runner;
67
+ } catch (error) {
68
+ console.log(`Error: ${error.message}`);
69
+ }