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,94 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Example: Debugging stdout buffering issues in CI environments
5
+ *
6
+ * Problem: In CI environments (non-TTY), stdout is often buffered, causing
7
+ * output to not appear immediately. This can make tests fail when they expect
8
+ * immediate output.
9
+ *
10
+ * Solution: Force stdout flush in non-TTY environments.
11
+ */
12
+
13
+ import { $ } from '../src/$.mjs';
14
+
15
+ console.log('Testing stdout buffering in CI environment');
16
+ console.log('Is TTY?', process.stdout.isTTY);
17
+
18
+ // Example 1: Force flush in non-TTY environment
19
+ async function testWithFlush() {
20
+ console.log('TEST 1: With stdout flush');
21
+
22
+ // Write and immediately flush
23
+ process.stdout.write('IMMEDIATE_OUTPUT\n');
24
+
25
+ // Force flush if not TTY (CI environment)
26
+ if (!process.stdout.isTTY && process.stdout.write('', () => {})) {
27
+ // This forces a flush
28
+ }
29
+
30
+ // Small delay to demonstrate the difference
31
+ await new Promise((resolve) => setTimeout(resolve, 100));
32
+ console.log('After delay');
33
+ }
34
+
35
+ // Example 2: Using command-stream with proper output handling
36
+ async function testCommandStream() {
37
+ console.log('\nTEST 2: Using command-stream');
38
+
39
+ // This should handle output correctly in CI
40
+ const result = await $`echo "COMMAND_OUTPUT"`;
41
+ console.log('Result:', result.stdout);
42
+
43
+ // For streaming output in CI
44
+ const runner = $`echo "STREAMING_START" && sleep 0.1 && echo "STREAMING_END"`;
45
+
46
+ for await (const chunk of runner.stream()) {
47
+ process.stdout.write(`Chunk: ${chunk.data}`);
48
+ // Force flush in CI
49
+ if (!process.stdout.isTTY) {
50
+ process.stdout.write('', () => {});
51
+ }
52
+ }
53
+ }
54
+
55
+ // Example 3: Debugging missing output in CI
56
+ async function debugMissingOutput() {
57
+ console.log('\nTEST 3: Debugging missing output');
58
+
59
+ // Add timestamps to understand timing
60
+ const log = (msg) => {
61
+ const timestamp = new Date().toISOString();
62
+ const message = `[${timestamp}] ${msg}\n`;
63
+ process.stderr.write(message); // stderr is often unbuffered
64
+ process.stdout.write(message);
65
+
66
+ // Force flush
67
+ if (!process.stdout.isTTY) {
68
+ process.stdout.write('', () => {});
69
+ }
70
+ };
71
+
72
+ log('Starting test');
73
+ log('Running command...');
74
+
75
+ const result = await $`echo "TEST_OUTPUT"`;
76
+ log(`Command completed with code ${result.code}`);
77
+ log(`Output: ${result.stdout}`);
78
+ }
79
+
80
+ // Run tests
81
+ async function main() {
82
+ try {
83
+ await testWithFlush();
84
+ await testCommandStream();
85
+ await debugMissingOutput();
86
+
87
+ console.log('\nAll tests completed successfully');
88
+ } catch (error) {
89
+ console.error('Test failed:', error);
90
+ process.exit(1);
91
+ }
92
+ }
93
+
94
+ main();
@@ -0,0 +1,259 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Example: Debugging test timeout issues in CI
5
+ *
6
+ * Problem: Tests hang indefinitely in CI without proper timeout configuration,
7
+ * causing the entire CI job to timeout after hours.
8
+ *
9
+ * Solution: Add proper timeouts to all tests and handle stuck processes.
10
+ */
11
+
12
+ import { spawn } from 'child_process';
13
+ import { $ } from '../src/$.mjs';
14
+
15
+ console.log('Testing timeout handling strategies');
16
+
17
+ // Example 1: Test with no timeout (problematic)
18
+ async function testNoTimeout() {
19
+ console.log('\nTEST 1: Command with no timeout (problematic)');
20
+ console.log('This would hang forever in CI...');
21
+
22
+ // DON'T DO THIS - example of what to avoid
23
+ // const result = await $`sleep 999999`;
24
+
25
+ console.log('Skipping actual execution to prevent hang');
26
+ }
27
+
28
+ // Example 2: Test with promise race timeout
29
+ async function testPromiseRaceTimeout() {
30
+ console.log('\nTEST 2: Using Promise.race for timeout');
31
+
32
+ const command = $`sleep 30`;
33
+ const timeout = new Promise((_, reject) => {
34
+ setTimeout(() => reject(new Error('Command timeout')), 2000);
35
+ });
36
+
37
+ try {
38
+ const result = await Promise.race([command, timeout]);
39
+ console.log('Command completed:', result.stdout);
40
+ } catch (error) {
41
+ console.log('āœ“ Command timed out as expected:', error.message);
42
+ // Clean up the command
43
+ command.kill();
44
+ }
45
+ }
46
+
47
+ // Example 3: Test with AbortController
48
+ async function testAbortController() {
49
+ console.log('\nTEST 3: Using AbortController for timeout');
50
+
51
+ const controller = new AbortController();
52
+
53
+ // Set timeout
54
+ const timeoutId = setTimeout(() => {
55
+ console.log('Timeout reached, aborting...');
56
+ controller.abort();
57
+ }, 2000);
58
+
59
+ try {
60
+ const result = await $`sleep 30`.start({ signal: controller.signal });
61
+ clearTimeout(timeoutId);
62
+ console.log('Command completed:', result.stdout);
63
+ } catch (error) {
64
+ console.log('āœ“ Command aborted:', error.message);
65
+ }
66
+ }
67
+
68
+ // Example 4: Custom timeout wrapper
69
+ async function withTimeout(promise, ms, message = 'Operation timed out') {
70
+ const timeout = new Promise((_, reject) => {
71
+ setTimeout(() => reject(new Error(message)), ms);
72
+ });
73
+
74
+ return Promise.race([promise, timeout]);
75
+ }
76
+
77
+ async function testCustomTimeoutWrapper() {
78
+ console.log('\nTEST 4: Custom timeout wrapper');
79
+
80
+ try {
81
+ const result = await withTimeout(
82
+ $`sleep 30`,
83
+ 2000,
84
+ 'Command exceeded 2 second timeout'
85
+ );
86
+ console.log('Command completed:', result.stdout);
87
+ } catch (error) {
88
+ console.log('āœ“ Timeout wrapper worked:', error.message);
89
+ }
90
+ }
91
+
92
+ // Example 5: Bun test timeout pattern
93
+ async function testBunTestPattern() {
94
+ console.log('\nTEST 5: Bun test timeout pattern');
95
+
96
+ // This shows how to add timeouts in Bun tests
97
+ const exampleTest = `
98
+ import { test, expect } from 'bun:test';
99
+
100
+ // WITHOUT TIMEOUT - Can hang forever
101
+ test('problematic test', async () => {
102
+ await $\`sleep 999999\`;
103
+ });
104
+
105
+ // WITH TIMEOUT - Will fail after 5 seconds
106
+ test('properly configured test', async () => {
107
+ await $\`sleep 999999\`;
108
+ }, 5000); // <-- Timeout in milliseconds
109
+
110
+ // WITH CUSTOM TIMEOUT for long operations
111
+ test('long running test', async () => {
112
+ // Some operation that legitimately takes time
113
+ await $\`npm install\`;
114
+ }, 60000); // 60 second timeout
115
+ `;
116
+
117
+ console.log('Example Bun test with timeout:');
118
+ console.log(exampleTest);
119
+ }
120
+
121
+ // Example 6: Detecting stuck processes
122
+ async function testStuckProcessDetection() {
123
+ console.log('\nTEST 6: Detecting stuck processes');
124
+
125
+ const child = spawn('sleep', ['30'], {
126
+ stdio: 'pipe',
127
+ });
128
+
129
+ console.log(`Started process with PID ${child.pid}`);
130
+
131
+ // Monitor for inactivity
132
+ let lastActivity = Date.now();
133
+ const inactivityTimeout = 2000; // 2 seconds
134
+
135
+ const monitor = setInterval(() => {
136
+ const idle = Date.now() - lastActivity;
137
+ if (idle > inactivityTimeout) {
138
+ console.log(`Process ${child.pid} appears stuck (idle for ${idle}ms)`);
139
+ console.log('Killing stuck process...');
140
+ child.kill('SIGKILL');
141
+ clearInterval(monitor);
142
+ }
143
+ }, 500);
144
+
145
+ // Update activity on any output
146
+ child.stdout.on('data', () => {
147
+ lastActivity = Date.now();
148
+ });
149
+ child.stderr.on('data', () => {
150
+ lastActivity = Date.now();
151
+ });
152
+
153
+ await new Promise((resolve) => {
154
+ child.on('exit', (code, signal) => {
155
+ clearInterval(monitor);
156
+ console.log(`Process exited with code ${code}, signal ${signal}`);
157
+ resolve();
158
+ });
159
+ });
160
+ }
161
+
162
+ // Example 7: CI-specific timeout configuration
163
+ async function testCITimeoutConfig() {
164
+ console.log('\nTEST 7: CI-specific timeout configuration');
165
+
166
+ const isCI = process.env.CI === 'true';
167
+
168
+ // Use different timeouts for CI vs local
169
+ const timeouts = {
170
+ default: isCI ? 30000 : 5000, // 30s in CI, 5s local
171
+ long: isCI ? 120000 : 30000, // 2min in CI, 30s local
172
+ network: isCI ? 60000 : 10000, // 1min in CI, 10s local
173
+ };
174
+
175
+ console.log('Timeout configuration:');
176
+ console.log(`- Environment: ${isCI ? 'CI' : 'Local'}`);
177
+ console.log(`- Default timeout: ${timeouts.default}ms`);
178
+ console.log(`- Long operation timeout: ${timeouts.long}ms`);
179
+ console.log(`- Network operation timeout: ${timeouts.network}ms`);
180
+
181
+ // Example usage
182
+ try {
183
+ await withTimeout(
184
+ $`sleep 30`,
185
+ timeouts.default,
186
+ `Command exceeded ${isCI ? 'CI' : 'local'} timeout`
187
+ );
188
+ } catch (error) {
189
+ console.log('āœ“ CI-aware timeout worked:', error.message);
190
+ }
191
+ }
192
+
193
+ // Example 8: Cleanup after timeout
194
+ async function testTimeoutCleanup() {
195
+ console.log('\nTEST 8: Cleanup after timeout');
196
+
197
+ const runners = [];
198
+ const startRunner = (name) => {
199
+ const runner = $`sleep 30`;
200
+ runners.push({ name, runner });
201
+ return runner.start();
202
+ };
203
+
204
+ // Start multiple commands
205
+ const promises = [
206
+ startRunner('command1'),
207
+ startRunner('command2'),
208
+ startRunner('command3'),
209
+ ];
210
+
211
+ // Set global timeout
212
+ setTimeout(() => {
213
+ console.log('Global timeout reached, cleaning up all runners...');
214
+ runners.forEach(({ name, runner }) => {
215
+ if (!runner.finished) {
216
+ console.log(`Killing ${name}`);
217
+ runner.kill();
218
+ }
219
+ });
220
+ }, 2000);
221
+
222
+ // Wait for all to finish (either naturally or by timeout)
223
+ const results = await Promise.allSettled(promises);
224
+
225
+ results.forEach((result, i) => {
226
+ const status = result.status === 'fulfilled' ? 'completed' : 'failed';
227
+ console.log(`${runners[i].name}: ${status}`);
228
+ });
229
+
230
+ // Verify cleanup
231
+ const unfinished = runners.filter((r) => !r.runner.finished);
232
+ console.log(`Unfinished runners: ${unfinished.length}`);
233
+ }
234
+
235
+ // Run tests
236
+ async function main() {
237
+ try {
238
+ console.log('Environment:');
239
+ console.log(`- CI: ${process.env.CI || 'false'}`);
240
+ console.log(`- Node: ${process.version}`);
241
+ console.log(`- Platform: ${process.platform}`);
242
+
243
+ await testNoTimeout();
244
+ await testPromiseRaceTimeout();
245
+ await testAbortController();
246
+ await testCustomTimeoutWrapper();
247
+ await testBunTestPattern();
248
+ await testStuckProcessDetection();
249
+ await testCITimeoutConfig();
250
+ await testTimeoutCleanup();
251
+
252
+ console.log('\nAll timeout tests completed successfully');
253
+ } catch (error) {
254
+ console.error('Test failed:', error);
255
+ process.exit(1);
256
+ }
257
+ }
258
+
259
+ main();
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+ import { appendFileSync } from 'fs';
5
+
6
+ const claude = 'claude';
7
+ const logFile = 'claude-output.log';
8
+
9
+ console.log('šŸ¤– Claude streaming to console and file');
10
+
11
+ let events = 0;
12
+ for await (const chunk of $`${claude} -p "hi" --output-format stream-json --verbose --model sonnet`.stream()) {
13
+ const data = chunk.data.toString();
14
+ console.log(`šŸ“¦ Event ${++events}: ${data.trim()}`);
15
+
16
+ // Write to file simultaneously
17
+ appendFileSync(logFile, `Event ${events}: ${data}`);
18
+ }
19
+
20
+ console.log(`āœ… ${events} events streamed to console and saved to ${logFile}`);
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ const claude = 'claude';
6
+ console.log('šŸ¤– Claude → jq streaming pipeline');
7
+
8
+ let events = 0;
9
+ for await (const chunk of $`${claude} -p "hi" --output-format stream-json --verbose --model sonnet | jq`.stream()) {
10
+ console.log(`šŸ“¦ Event ${++events}: ${chunk.data.toString().trim()}`);
11
+ }
12
+
13
+ console.log(`āœ… Pipeline completed with ${events} events`);
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ const claude = 'claude';
6
+ console.log('šŸ¤– Claude exact streaming example');
7
+
8
+ let events = 0;
9
+ for await (const chunk of $`${claude} -p "hi" --output-format stream-json --verbose --model sonnet`.stream()) {
10
+ console.log(`šŸ“¦ Event ${++events}: ${chunk.data.toString().trim()}`);
11
+ }
12
+
13
+ console.log(`āœ… Received ${events} streaming events`);
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('šŸ¤– Claude → jq streaming pipeline');
6
+
7
+ // Claude with JSON output piped to jq
8
+ let events = 0;
9
+ for await (const chunk of $`claude "say hi" --output-format stream-json | jq -r '.type // empty'`.stream()) {
10
+ console.log(`šŸ“¦ Event ${++events}: ${chunk.data.toString().trim()}`);
11
+ }
12
+
13
+ console.log(`āœ… Pipeline completed with ${events} events`);
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env node
2
+ // Test Claude in JSON streaming mode
3
+ import { spawn } from 'child_process';
4
+
5
+ console.log('=== Claude JSON streaming test ===');
6
+
7
+ let chunkCount = 0;
8
+ const child = spawn('claude', ['hi', '--output-format', 'stream-json'], {
9
+ stdio: 'pipe',
10
+ });
11
+
12
+ child.stdout.on('data', (data) => {
13
+ chunkCount++;
14
+ const str = data.toString();
15
+ console.log(`JSON chunk ${chunkCount}:`, str);
16
+
17
+ // Try to parse each line as JSON
18
+ str
19
+ .split('\n')
20
+ .filter((line) => line.trim())
21
+ .forEach((line, i) => {
22
+ try {
23
+ const json = JSON.parse(line);
24
+ console.log(` Parsed line ${i + 1}:`, json);
25
+ } catch (e) {
26
+ console.log(` Raw line ${i + 1}:`, line);
27
+ }
28
+ });
29
+ });
30
+
31
+ child.stderr.on('data', (data) => {
32
+ console.log('stderr:', data.toString());
33
+ });
34
+
35
+ child.on('close', (code) => {
36
+ console.log(
37
+ `Process closed with code ${code}, received ${chunkCount} chunks`
38
+ );
39
+ });
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Basic Claude streaming example with command-stream
5
+ *
6
+ * This example demonstrates:
7
+ * 1. Real-time streaming output from Claude
8
+ * 2. Multiple chunks/events being captured
9
+ * 3. Both console display and file writing simultaneously
10
+ */
11
+
12
+ import { $ } from '../src/$.mjs';
13
+ import { writeFileSync, appendFileSync, existsSync } from 'fs';
14
+
15
+ // Claude command - using a prompt that should generate multiple chunks
16
+ const claudeCommand = 'claude';
17
+ const prompt =
18
+ 'Count from 1 to 5, explaining each number briefly. Use --output-format stream-json if available.';
19
+
20
+ console.log('šŸš€ Starting Claude streaming example...\n');
21
+
22
+ // Clean up any existing log file
23
+ const logFile = 'claude-streaming.log';
24
+ if (existsSync(logFile)) {
25
+ writeFileSync(logFile, '');
26
+ }
27
+
28
+ console.log('šŸ“ Command being executed:');
29
+ console.log(`${claudeCommand} "${prompt}"`);
30
+ console.log('\n🌊 Streaming output:\n');
31
+
32
+ let chunkCount = 0;
33
+ let totalOutput = '';
34
+
35
+ try {
36
+ // Create the command but don't start it yet
37
+ const command = $`${claudeCommand} "${prompt}"`;
38
+
39
+ // Attach event handlers
40
+ command
41
+ .on('data', (chunk) => {
42
+ chunkCount++;
43
+ const data = chunk.data.toString();
44
+
45
+ console.log(`šŸ“¦ Chunk ${chunkCount} (${chunk.type}):`);
46
+ console.log(data);
47
+ console.log('---');
48
+
49
+ // Write to log file in real-time
50
+ appendFileSync(
51
+ logFile,
52
+ `=== Chunk ${chunkCount} (${chunk.type}) ===\n${data}\n`
53
+ );
54
+
55
+ totalOutput += data;
56
+ })
57
+ .on('stderr', (chunk) => {
58
+ const data = chunk.toString();
59
+ console.log('āš ļø stderr:', data);
60
+ appendFileSync(logFile, `=== STDERR ===\n${data}\n`);
61
+ })
62
+ .on('end', (result) => {
63
+ console.log('\nāœ… Streaming completed!');
64
+ console.log(`šŸ“Š Total chunks received: ${chunkCount}`);
65
+ console.log(`šŸ“ Log saved to: ${logFile}`);
66
+ console.log(`šŸŽÆ Exit code: ${result.code}`);
67
+ console.log(`šŸ“ Total output length: ${totalOutput.length} characters`);
68
+
69
+ // Write final summary
70
+ appendFileSync(
71
+ logFile,
72
+ `\n=== SUMMARY ===\nTotal chunks: ${chunkCount}\nExit code: ${result.code}\nTotal length: ${totalOutput.length}\n`
73
+ );
74
+ })
75
+ .on('error', (error) => {
76
+ console.error('āŒ Error:', error);
77
+ appendFileSync(logFile, `=== ERROR ===\n${error}\n`);
78
+ });
79
+
80
+ // Start the command
81
+ await command.start();
82
+ } catch (error) {
83
+ console.error('šŸ’„ Failed to execute command:', error.message);
84
+
85
+ // Check if claude command is available
86
+ try {
87
+ const checkResult = await $`which ${claudeCommand}`;
88
+ if (checkResult.code !== 0) {
89
+ console.log(
90
+ '\nšŸ’” Tip: Make sure Claude CLI is installed and in your PATH'
91
+ );
92
+ console.log(
93
+ ' You can install it from: https://github.com/anthropics/claude-cli'
94
+ );
95
+ }
96
+ } catch (checkError) {
97
+ console.log('\nšŸ’” Claude CLI not found in PATH. Please install it first.');
98
+ }
99
+ }
@@ -0,0 +1,126 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Claude streaming demo with command-stream
5
+ *
6
+ * This demonstrates:
7
+ * 1. Real-time streaming output
8
+ * 2. Multiple chunks/events being captured
9
+ * 3. Simultaneous console display and file writing
10
+ * 4. Handling of both stdout and stderr
11
+ */
12
+
13
+ import { $ } from '../src/$.mjs';
14
+ import { writeFileSync, appendFileSync, existsSync } from 'fs';
15
+
16
+ // We'll use a command that produces output over time to simulate streaming
17
+ // If claude is not available, we'll fall back to a simulation
18
+ const claudeCommand = 'claude';
19
+ const fallbackCommand =
20
+ 'sh -c \'for i in $(seq 1 5); do echo "Response chunk $i: This is simulated streaming output from Claude."; sleep 0.5; done\'';
21
+
22
+ console.log('šŸš€ Starting Claude streaming demo...\n');
23
+
24
+ // Clean up any existing log file
25
+ const logFile = 'claude-streaming-demo.log';
26
+ if (existsSync(logFile)) {
27
+ writeFileSync(logFile, '');
28
+ }
29
+
30
+ let chunkCount = 0;
31
+ let totalOutput = '';
32
+
33
+ async function runClaudeDemo() {
34
+ console.log('šŸ“ Attempting to run Claude command...\n');
35
+
36
+ try {
37
+ // First check if claude is available
38
+ const claudeCheck = await $`which ${claudeCommand}`;
39
+
40
+ if (claudeCheck.code !== 0) {
41
+ console.log('āš ļø Claude CLI not found, using fallback simulation\n');
42
+ return runFallbackDemo();
43
+ }
44
+
45
+ // Try to run Claude with streaming output
46
+ const prompt =
47
+ 'Count from 1 to 5, explaining each number briefly. Make each response a separate chunk if possible.';
48
+ console.log(`šŸŽÆ Command: ${claudeCommand} "${prompt}"`);
49
+ console.log('\n🌊 Streaming output:\n');
50
+
51
+ const command = $`${claudeCommand} "${prompt}"`;
52
+
53
+ command
54
+ .on('data', handleChunk)
55
+ .on('stderr', handleStderr)
56
+ .on('end', handleEnd)
57
+ .on('error', handleError);
58
+
59
+ await command.start();
60
+ } catch (error) {
61
+ console.log('āš ļø Claude command failed, using fallback simulation\n');
62
+ return runFallbackDemo();
63
+ }
64
+ }
65
+
66
+ async function runFallbackDemo() {
67
+ console.log('šŸŽÆ Running fallback streaming simulation');
68
+ console.log('🌊 Streaming output:\n');
69
+
70
+ const command = $`${fallbackCommand}`;
71
+
72
+ command
73
+ .on('data', handleChunk)
74
+ .on('stderr', handleStderr)
75
+ .on('end', handleEnd)
76
+ .on('error', handleError);
77
+
78
+ await command.start();
79
+ }
80
+
81
+ function handleChunk(chunk) {
82
+ chunkCount++;
83
+ const data = chunk.data.toString();
84
+
85
+ console.log(`šŸ“¦ Chunk ${chunkCount} (${chunk.type}):`);
86
+ console.log(data);
87
+ console.log('---');
88
+
89
+ // Write to log file in real-time
90
+ appendFileSync(
91
+ logFile,
92
+ `=== Chunk ${chunkCount} (${chunk.type}) ===\n${data}\n`
93
+ );
94
+
95
+ totalOutput += data;
96
+ }
97
+
98
+ function handleStderr(chunk) {
99
+ const data = chunk.toString();
100
+ console.log('āš ļø stderr:', data);
101
+ appendFileSync(logFile, `=== STDERR ===\n${data}\n`);
102
+ }
103
+
104
+ function handleEnd(result) {
105
+ console.log('\nāœ… Streaming completed!');
106
+ console.log(`šŸ“Š Total chunks received: ${chunkCount}`);
107
+ console.log(`šŸ“ Log saved to: ${logFile}`);
108
+ console.log(`šŸŽÆ Exit code: ${result.code}`);
109
+ console.log(`šŸ“ Total output length: ${totalOutput.length} characters`);
110
+
111
+ // Write final summary
112
+ appendFileSync(
113
+ logFile,
114
+ `\n=== SUMMARY ===\nTotal chunks: ${chunkCount}\nExit code: ${result.code}\nTotal length: ${totalOutput.length}\n`
115
+ );
116
+
117
+ console.log('\nšŸ’” Pro tip: Check the log file to see all captured output!');
118
+ }
119
+
120
+ function handleError(error) {
121
+ console.error('āŒ Error:', error);
122
+ appendFileSync(logFile, `=== ERROR ===\n${error}\n`);
123
+ }
124
+
125
+ // Run the demo
126
+ runClaudeDemo().catch(console.error);
@@ -0,0 +1,20 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+ import { appendFileSync } from 'fs';
5
+
6
+ console.log('šŸ¤– Claude streaming example');
7
+
8
+ // Simple prompt that should stream
9
+ let events = 0;
10
+ const logFile = 'claude-stream.log';
11
+
12
+ for await (const chunk of $`claude hi`.stream()) {
13
+ const data = chunk.data.toString();
14
+ console.log(`šŸ“¦ Event ${++events}: ${data.trim()}`);
15
+
16
+ // Write to file simultaneously
17
+ appendFileSync(logFile, `Event ${events}: ${data}`);
18
+ }
19
+
20
+ console.log(`āœ… Received ${events} streaming events, logged to ${logFile}`);