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,125 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { $, register } from '../src/$.mjs';
4
+
5
+ console.log('=== Testing Virtual Command Streaming ===\n');
6
+
7
+ // Register a streaming virtual command that generates data incrementally
8
+ register('stream-numbers', async function* ({ args, stdin }) {
9
+ const count = parseInt(args[0] || '3');
10
+ const delay = parseInt(args[1] || '500');
11
+
12
+ for (let i = 1; i <= count; i++) {
13
+ yield `{"number": ${i}}\n`;
14
+ if (i < count) {
15
+ await new Promise((resolve) => setTimeout(resolve, delay));
16
+ }
17
+ }
18
+ });
19
+
20
+ // Register a virtual filter command
21
+ register('filter-even', async function* ({ args, stdin }) {
22
+ const lines = stdin.trim().split('\n');
23
+ for (const line of lines) {
24
+ try {
25
+ const obj = JSON.parse(line);
26
+ if (obj.number && obj.number % 2 === 0) {
27
+ yield `${line}\n`;
28
+ }
29
+ } catch (e) {
30
+ // Skip invalid JSON
31
+ }
32
+ }
33
+ });
34
+
35
+ // Test 1: Virtual command alone with streaming
36
+ console.log('Test 1: Virtual streaming command alone:');
37
+ console.log('Should output 3 numbers with 300ms delays:\n');
38
+ const start1 = Date.now();
39
+
40
+ for await (const chunk of $`stream-numbers 3 300`.stream()) {
41
+ if (chunk.type === 'stdout') {
42
+ const elapsed = Date.now() - start1;
43
+ const data = chunk.data.toString().trim();
44
+ if (data) {
45
+ console.log(`[${elapsed}ms] ${data}`);
46
+ }
47
+ }
48
+ }
49
+
50
+ console.log('\n✅ Test 1 complete\n');
51
+
52
+ // Test 2: Virtual command piped to real command
53
+ console.log('Test 2: Virtual -> Real command pipeline:');
54
+ console.log('Stream numbers through jq:\n');
55
+ const start2 = Date.now();
56
+
57
+ for await (const chunk of $`stream-numbers 3 200 | jq -c '.number *= 2'`.stream()) {
58
+ if (chunk.type === 'stdout') {
59
+ const elapsed = Date.now() - start2;
60
+ const data = chunk.data.toString().trim();
61
+ if (data) {
62
+ console.log(`[${elapsed}ms] ${data}`);
63
+ }
64
+ }
65
+ }
66
+
67
+ console.log('\n✅ Test 2 complete\n');
68
+
69
+ // Test 3: Real command piped to virtual command
70
+ console.log('Test 3: Real -> Virtual command pipeline:');
71
+ console.log('Generate numbers with shell, filter with virtual command:\n');
72
+ const start3 = Date.now();
73
+
74
+ const cmd3 = $`sh -c 'for i in 1 2 3 4 5; do echo "{\\"number\\": $i}"; done' | filter-even`;
75
+
76
+ for await (const chunk of cmd3.stream()) {
77
+ if (chunk.type === 'stdout') {
78
+ const elapsed = Date.now() - start3;
79
+ const data = chunk.data.toString().trim();
80
+ if (data) {
81
+ console.log(`[${elapsed}ms] ${data}`);
82
+ }
83
+ }
84
+ }
85
+
86
+ console.log('\n✅ Test 3 complete\n');
87
+
88
+ // Test 4: Mixed pipeline with multiple stages
89
+ console.log('Test 4: Virtual -> Real -> Virtual pipeline:');
90
+ console.log('Stream numbers, transform with jq, filter with virtual:\n');
91
+ const start4 = Date.now();
92
+
93
+ const cmd4 = $`stream-numbers 5 150 | jq -c '{value: .number, double: (.number * 2)}' | filter-even`;
94
+
95
+ // Note: filter-even will only work on objects with 'number' field,
96
+ // so let's create a better filter
97
+ register('filter-double-even', async function* ({ args, stdin }) {
98
+ const lines = stdin.trim().split('\n');
99
+ for (const line of lines) {
100
+ try {
101
+ const obj = JSON.parse(line);
102
+ if (obj.double && obj.double % 4 === 0) {
103
+ yield `${line}\n`;
104
+ }
105
+ } catch (e) {
106
+ // Skip invalid JSON
107
+ }
108
+ }
109
+ });
110
+
111
+ const cmd4Fixed = $`stream-numbers 5 150 | jq -c '{value: .number, double: (.number * 2)}' | filter-double-even`;
112
+
113
+ for await (const chunk of cmd4Fixed.stream()) {
114
+ if (chunk.type === 'stdout') {
115
+ const elapsed = Date.now() - start4;
116
+ const data = chunk.data.toString().trim();
117
+ if (data) {
118
+ console.log(`[${elapsed}ms] ${data}`);
119
+ }
120
+ }
121
+ }
122
+
123
+ console.log('\n✅ Test 4 complete\n');
124
+
125
+ console.log('🎉 All virtual streaming tests passed!');
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ async function testWaitingCommand() {
6
+ console.log('🧪 Testing with command that truly waits');
7
+
8
+ // Use a command that definitely waits for input
9
+ const nodeCmd = $`node -e "process.stdin.on('data', d => process.stdout.write('Got: ' + d)); process.stdin.on('end', () => process.exit(0));"`;
10
+ console.log('1. Created node stdin reader command');
11
+
12
+ await nodeCmd.start({
13
+ mode: 'async',
14
+ stdin: 'pipe',
15
+ stdout: 'pipe',
16
+ stderr: 'pipe',
17
+ });
18
+ console.log('2. Started command');
19
+
20
+ // Wait a bit for process to start
21
+ await new Promise((resolve) => setTimeout(resolve, 100));
22
+
23
+ console.log('3. After start:');
24
+ console.log(' started:', nodeCmd.started);
25
+ console.log(' child exists:', !!nodeCmd.child);
26
+ console.log(' finished:', nodeCmd.finished);
27
+
28
+ if (nodeCmd.child) {
29
+ console.log(' child.pid:', nodeCmd.child.pid);
30
+ console.log(' child.stdin exists:', !!nodeCmd.child.stdin);
31
+ }
32
+
33
+ // Try to access via streams
34
+ const stdin = await nodeCmd.streams.stdin;
35
+ console.log('4. Got stdin via streams:');
36
+ console.log(' type:', typeof stdin);
37
+ console.log(' has write:', !!(stdin && stdin.write));
38
+
39
+ if (stdin && stdin.write) {
40
+ console.log('5. Writing to stdin...');
41
+ stdin.write('Hello World\n');
42
+ stdin.end();
43
+
44
+ const result = await nodeCmd;
45
+ console.log(' Result:', JSON.stringify(result.stdout));
46
+ } else {
47
+ console.log('5. No writable stdin');
48
+ nodeCmd.kill();
49
+ }
50
+ }
51
+
52
+ testWaitingCommand();
@@ -0,0 +1,83 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('=== Commands that definitely wait for stdin ===');
6
+
7
+ async function testWaitingCommands() {
8
+ try {
9
+ console.log('\\n1️⃣ cat with no arguments - waits for stdin');
10
+ const cmd1 = $`timeout 2 cat`; // Timeout as safety
11
+ const stdin1 = await cmd1.streams.stdin;
12
+ console.log('cat stdin type:', typeof stdin1);
13
+
14
+ if (stdin1 && stdin1.write) {
15
+ stdin1.write('Hello cat!\\n');
16
+ stdin1.end();
17
+ }
18
+
19
+ const result1 = await cmd1;
20
+ console.log('cat result:', JSON.stringify(result1.stdout));
21
+
22
+ console.log('\\n2️⃣ sort with no arguments - waits for stdin');
23
+ const cmd2 = $`timeout 2 sort`;
24
+ const stdin2 = await cmd2.streams.stdin;
25
+ console.log('sort stdin type:', typeof stdin2);
26
+
27
+ if (stdin2 && stdin2.write) {
28
+ stdin2.write('zebra\\n');
29
+ stdin2.write('apple\\n');
30
+ stdin2.end();
31
+ }
32
+
33
+ const result2 = await cmd2;
34
+ console.log('sort result:', JSON.stringify(result2.stdout));
35
+
36
+ console.log('\\n3️⃣ wc (word count) - waits for stdin');
37
+ const cmd3 = $`timeout 2 wc -l`;
38
+ const stdin3 = await cmd3.streams.stdin;
39
+ console.log('wc stdin type:', typeof stdin3);
40
+
41
+ if (stdin3 && stdin3.write) {
42
+ stdin3.write('line 1\\n');
43
+ stdin3.write('line 2\\n');
44
+ stdin3.end();
45
+ }
46
+
47
+ const result3 = await cmd3;
48
+ console.log('wc result:', JSON.stringify(result3.stdout));
49
+
50
+ console.log('\\n4️⃣ head -n 1 - waits for stdin, takes first line');
51
+ const cmd4 = $`timeout 2 head -n 1`;
52
+ const stdin4 = await cmd4.streams.stdin;
53
+ console.log('head stdin type:', typeof stdin4);
54
+
55
+ if (stdin4 && stdin4.write) {
56
+ stdin4.write('first line\\n');
57
+ stdin4.write('second line\\n');
58
+ stdin4.end();
59
+ }
60
+
61
+ const result4 = await cmd4;
62
+ console.log('head result:', JSON.stringify(result4.stdout));
63
+
64
+ console.log('\\n5️⃣ Node.js process.stdin - definitely waits');
65
+ const cmd5 = $`node -e "process.stdin.setEncoding('utf8'); process.stdin.on('data', d => process.stdout.write('Got: ' + d)); process.stdin.on('end', () => process.exit(0));"`;
66
+
67
+ const stdin5 = await cmd5.streams.stdin;
68
+ console.log('node stdin type:', typeof stdin5);
69
+
70
+ if (stdin5 && stdin5.write) {
71
+ stdin5.write('Node test\\n');
72
+ stdin5.end();
73
+ }
74
+
75
+ const result5 = await cmd5;
76
+ console.log('node result:', JSON.stringify(result5.stdout));
77
+ } catch (error) {
78
+ console.error('Error:', error.message);
79
+ console.error(error.stack);
80
+ }
81
+ }
82
+
83
+ testWaitingCommands();
@@ -0,0 +1,104 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+ import { promises as fs } from 'fs';
5
+ import { spawn } from 'child_process';
6
+ import os from 'os';
7
+ import path from 'path';
8
+
9
+ console.log('=== Testing watch mode ===\n');
10
+
11
+ // Start the watch process in background
12
+ console.log('Starting watch process...');
13
+ const watchProcess = spawn(
14
+ 'node',
15
+ ['claude-profiles.mjs', '--watch', 'test-watch', '--verbose'],
16
+ {
17
+ stdio: 'pipe',
18
+ env: process.env,
19
+ }
20
+ );
21
+
22
+ let output = '';
23
+ watchProcess.stdout.on('data', (data) => {
24
+ const text = data.toString();
25
+ output += text;
26
+ process.stdout.write(text);
27
+ });
28
+
29
+ watchProcess.stderr.on('data', (data) => {
30
+ const text = data.toString();
31
+ output += text;
32
+ process.stderr.write(text);
33
+ });
34
+
35
+ // Wait for initial save
36
+ console.log('\nWaiting for initial state...');
37
+ await new Promise((resolve) => setTimeout(resolve, 3000));
38
+
39
+ // Make a change to trigger save
40
+ console.log('\nMaking a change to .claude.json...');
41
+ const claudeJsonPath = path.join(os.homedir(), '.claude.json');
42
+ try {
43
+ const content = await fs.readFile(claudeJsonPath, 'utf8');
44
+ const json = JSON.parse(content);
45
+ json.test_timestamp = new Date().toISOString();
46
+ await fs.writeFile(claudeJsonPath, JSON.stringify(json, null, 2));
47
+ console.log('✅ Modified .claude.json');
48
+ } catch (error) {
49
+ console.error('Failed to modify .claude.json:', error.message);
50
+ }
51
+
52
+ // Wait for save detection
53
+ console.log('\nWaiting for change detection...');
54
+ await new Promise((resolve) => setTimeout(resolve, 8000));
55
+
56
+ // Check if save was detected
57
+ if (output.includes('Profile auto-saved')) {
58
+ console.log('\n✅ Auto-save detected and completed');
59
+ } else {
60
+ console.log('\n⚠️ Auto-save not detected in output');
61
+ }
62
+
63
+ // Make another change within throttle window
64
+ console.log('\nMaking another change (within 30s throttle)...');
65
+ try {
66
+ const content = await fs.readFile(claudeJsonPath, 'utf8');
67
+ const json = JSON.parse(content);
68
+ json.test_timestamp2 = new Date().toISOString();
69
+ await fs.writeFile(claudeJsonPath, JSON.stringify(json, null, 2));
70
+ console.log('✅ Modified .claude.json again');
71
+ } catch (error) {
72
+ console.error('Failed to modify .claude.json:', error.message);
73
+ }
74
+
75
+ // Wait to see throttling
76
+ console.log('\nWaiting to observe throttling...');
77
+ await new Promise((resolve) => setTimeout(resolve, 5000));
78
+
79
+ // Send SIGINT to test graceful shutdown
80
+ console.log('\nSending SIGINT for graceful shutdown...');
81
+ watchProcess.kill('SIGINT');
82
+
83
+ // Wait for process to exit
84
+ await new Promise((resolve) => {
85
+ watchProcess.on('exit', (code) => {
86
+ console.log(`\nWatch process exited with code: ${code}`);
87
+ resolve();
88
+ });
89
+ });
90
+
91
+ // Clean up test changes
92
+ console.log('\nCleaning up test changes...');
93
+ try {
94
+ const content = await fs.readFile(claudeJsonPath, 'utf8');
95
+ const json = JSON.parse(content);
96
+ delete json.test_timestamp;
97
+ delete json.test_timestamp2;
98
+ await fs.writeFile(claudeJsonPath, JSON.stringify(json, null, 2));
99
+ console.log('✅ Cleaned up .claude.json');
100
+ } catch (error) {
101
+ console.error('Failed to clean up:', error.message);
102
+ }
103
+
104
+ console.log('\n=== Watch mode test complete ===');
@@ -0,0 +1,26 @@
1
+ import { $ } from '../src/$.mjs';
2
+
3
+ console.log('Testing yes command cancellation...');
4
+
5
+ const runner = $`yes "test output"`;
6
+ let iterations = 0;
7
+ const maxIterations = 5;
8
+
9
+ console.log('Starting async iteration...');
10
+ for await (const chunk of runner.stream()) {
11
+ iterations++;
12
+ console.log(`Iteration ${iterations}: received chunk`);
13
+ if (iterations >= maxIterations) {
14
+ console.log('Breaking from loop...');
15
+ break; // This MUST stop the yes command
16
+ }
17
+ }
18
+
19
+ console.log(`Finished: ${runner.finished}`);
20
+ console.log(`Total iterations: ${iterations}`);
21
+
22
+ // Wait a bit to ensure no more output
23
+ await new Promise((resolve) => setTimeout(resolve, 100));
24
+
25
+ console.log('Test complete');
26
+ process.exit(0);
@@ -0,0 +1,58 @@
1
+ import { $ } from '../src/$.mjs';
2
+
3
+ console.log('Testing yes command cancellation in detail...');
4
+
5
+ // Test 1: Direct generator usage
6
+ console.log('\n=== Test 1: Direct generator test ===');
7
+ import yesCommand from '../src/commands/$.yes.mjs';
8
+
9
+ let cancelled = false;
10
+ const abortController = new AbortController();
11
+ const generator = yesCommand({
12
+ args: ['test'],
13
+ stdin: '',
14
+ isCancelled: () => cancelled,
15
+ signal: abortController.signal,
16
+ });
17
+
18
+ let count = 0;
19
+ for await (const chunk of generator) {
20
+ count++;
21
+ console.log(`Direct iteration ${count}: ${chunk.trim()}`);
22
+ if (count >= 3) {
23
+ console.log('Setting cancelled=true and aborting...');
24
+ cancelled = true;
25
+ abortController.abort();
26
+ // Try to return the generator
27
+ if (generator.return) {
28
+ await generator.return();
29
+ }
30
+ break;
31
+ }
32
+ }
33
+ console.log(`Direct test finished, count=${count}`);
34
+
35
+ // Test 2: Through command-stream
36
+ console.log('\n=== Test 2: Through command-stream ===');
37
+ const runner = $`yes "stream test"`;
38
+ let iterations = 0;
39
+
40
+ for await (const chunk of runner.stream()) {
41
+ iterations++;
42
+ console.log(`Stream iteration ${iterations}: got chunk`);
43
+ if (iterations >= 3) {
44
+ console.log('Breaking from stream...');
45
+ break;
46
+ }
47
+ }
48
+
49
+ console.log(
50
+ `Stream test finished: runner.finished=${runner.finished}, iterations=${iterations}`
51
+ );
52
+
53
+ // Wait to see if any more output comes
54
+ console.log('\nWaiting 500ms to check for spurious output...');
55
+ await new Promise((resolve) => setTimeout(resolve, 500));
56
+
57
+ console.log('All tests complete');
58
+ process.exit(0);
@@ -0,0 +1,28 @@
1
+ import { $ } from '../src/$.mjs';
2
+
3
+ console.log('Testing yes command stopping...');
4
+
5
+ const runner = $({ mirror: false })`yes "test"`;
6
+ let iterations = 0;
7
+
8
+ console.log('Starting iteration...');
9
+ for await (const chunk of runner.stream()) {
10
+ iterations++;
11
+ console.log(`Iteration ${iterations}`);
12
+
13
+ if (iterations >= 3) {
14
+ console.log('Breaking...');
15
+ break;
16
+ }
17
+ }
18
+
19
+ console.log(`Finished: ${runner.finished}`);
20
+ console.log(`Total iterations: ${iterations}`);
21
+
22
+ // Check if the runner is actually stopped
23
+ console.log('\nWaiting 100ms...');
24
+ await new Promise((resolve) => setTimeout(resolve, 100));
25
+
26
+ console.log('Still finished:', runner.finished);
27
+
28
+ process.exit(0);
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * AbortController Tracing Test
5
+ *
6
+ * Tests AbortController integration with tracing to debug external
7
+ * signal handling and virtual command cancellation.
8
+ *
9
+ * Usage:
10
+ * COMMAND_STREAM_TRACE=ProcessRunner node js/examples/trace-abort-controller.mjs
11
+ */
12
+
13
+ import { $ } from '../src/$.mjs';
14
+
15
+ console.log('Testing AbortController with tracing...');
16
+
17
+ const controller = new AbortController();
18
+ const promise = $({ signal: controller.signal })`sleep 2`;
19
+
20
+ setTimeout(() => {
21
+ console.log('🛑 Aborting with AbortController...');
22
+ controller.abort();
23
+ }, 300);
24
+
25
+ try {
26
+ const result = await promise;
27
+ console.log('✓ Virtual sleep result:', result.code);
28
+ } catch (error) {
29
+ console.log('✓ Virtual sleep was aborted (expected):', error.message);
30
+ }
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Error Handling Tracing Test
5
+ *
6
+ * Tests error conditions with tracing to debug error propagation,
7
+ * cleanup on failure, and exception handling.
8
+ *
9
+ * Usage:
10
+ * COMMAND_STREAM_TRACE=ProcessRunner node js/examples/trace-error-handling.mjs
11
+ */
12
+
13
+ import { $ } from '../src/$.mjs';
14
+
15
+ console.log('Testing error handling with tracing...');
16
+
17
+ try {
18
+ const result = await $`/nonexistent/command`;
19
+ console.log('✗ Should have failed');
20
+ } catch (error) {
21
+ console.log('✓ Error caught (expected):', error.message);
22
+ }
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Pipeline Command Tracing Test
5
+ *
6
+ * Tests pipeline command execution with tracing to debug command
7
+ * parsing, pipeline creation, and multi-process coordination.
8
+ *
9
+ * Usage:
10
+ * COMMAND_STREAM_TRACE=ProcessRunner node js/examples/trace-pipeline-command.mjs
11
+ */
12
+
13
+ import { $ } from '../src/$.mjs';
14
+
15
+ console.log('Testing pipeline command with tracing...');
16
+
17
+ const result = await $`echo "test data" | grep "test"`;
18
+ console.log(
19
+ '✓ Pipeline result:',
20
+ result.code,
21
+ JSON.stringify(result.stdout.trim())
22
+ );
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Signal Handling Tracing Test
5
+ *
6
+ * Tests process killing and signal handling with tracing to debug
7
+ * SIGINT forwarding and cleanup operations.
8
+ *
9
+ * Usage:
10
+ * COMMAND_STREAM_TRACE=ProcessRunner node js/examples/trace-signal-handling.mjs
11
+ */
12
+
13
+ import { $ } from '../src/$.mjs';
14
+
15
+ console.log('Testing signal handling with tracing...');
16
+
17
+ const runner = $`sleep 3`;
18
+ const promise = runner.start();
19
+
20
+ setTimeout(() => {
21
+ console.log('🔪 Killing process with SIGINT...');
22
+ runner.kill('SIGINT');
23
+ }, 500);
24
+
25
+ try {
26
+ const result = await promise;
27
+ console.log('✓ Sleep result (killed):', result.code);
28
+ } catch (error) {
29
+ console.log(
30
+ '✓ Sleep was interrupted (expected):',
31
+ error.message,
32
+ 'code:',
33
+ error.code
34
+ );
35
+ }
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Simple Command Tracing Test
5
+ *
6
+ * Tests basic command execution with tracing to debug process creation,
7
+ * stdout/stderr handling, and completion.
8
+ *
9
+ * Usage:
10
+ * COMMAND_STREAM_TRACE=ProcessRunner node js/examples/trace-simple-command.mjs
11
+ */
12
+
13
+ import { $ } from '../src/$.mjs';
14
+
15
+ console.log('Testing simple command execution with tracing...');
16
+
17
+ const result = await $`echo "Hello tracing"`;
18
+ console.log('✓ Result:', result.code, JSON.stringify(result.stdout.trim()));
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Stderr Output Tracing Test
5
+ *
6
+ * Tests stdout/stderr handling with tracing to debug stream pumping,
7
+ * data capture, and I/O operations.
8
+ *
9
+ * Usage:
10
+ * COMMAND_STREAM_TRACE=ProcessRunner node js/examples/trace-stderr-output.mjs
11
+ */
12
+
13
+ import { $ } from '../src/$.mjs';
14
+
15
+ console.log('Testing stderr output with tracing...');
16
+
17
+ const result =
18
+ await $`sh -c 'echo "stdout message" && echo "stderr message" >&2'`;
19
+
20
+ console.log('✓ Command result:', result.code);
21
+ console.log(' stdout:', JSON.stringify(result.stdout.trim()));
22
+ console.log(' stderr:', JSON.stringify(result.stderr.trim()));