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.
- package/js/examples/01-basic-streaming.mjs +14 -0
- package/js/examples/02-async-iterator.mjs +9 -0
- package/js/examples/03-file-and-console.mjs +16 -0
- package/js/examples/04-claude-jq-pipe.mjs +16 -0
- package/js/examples/CI-DEBUG-README.md +138 -0
- package/js/examples/README-examples.mjs +111 -0
- package/js/examples/README.md +345 -0
- package/js/examples/STREAMING_INTERFACES_SUMMARY.md +116 -0
- package/js/examples/add-test-timeouts.js +107 -0
- package/js/examples/ansi-default-preserved.mjs +11 -0
- package/js/examples/ansi-global-config.mjs +12 -0
- package/js/examples/ansi-reset-default.mjs +12 -0
- package/js/examples/ansi-strip-utils.mjs +12 -0
- package/js/examples/baseline-child-process.mjs +23 -0
- package/js/examples/baseline-claude-test.mjs +47 -0
- package/js/examples/baseline-working.mjs +34 -0
- package/js/examples/capture-mirror-comparison.mjs +23 -0
- package/js/examples/capture-mirror-default.mjs +11 -0
- package/js/examples/capture-mirror-performance.mjs +16 -0
- package/js/examples/capture-mirror-show-only.mjs +16 -0
- package/js/examples/capture-mirror-silent-processing.mjs +16 -0
- package/js/examples/ci-debug-baseline-vs-library.mjs +265 -0
- package/js/examples/ci-debug-es-module-loading.mjs +184 -0
- package/js/examples/ci-debug-signal-handling.mjs +225 -0
- package/js/examples/ci-debug-stdout-buffering.mjs +94 -0
- package/js/examples/ci-debug-test-timeouts.mjs +259 -0
- package/js/examples/claude-exact-file-output.mjs +20 -0
- package/js/examples/claude-exact-jq.mjs +13 -0
- package/js/examples/claude-exact-streaming.mjs +13 -0
- package/js/examples/claude-jq-pipeline.mjs +13 -0
- package/js/examples/claude-json-stream.mjs +39 -0
- package/js/examples/claude-streaming-basic.mjs +99 -0
- package/js/examples/claude-streaming-demo.mjs +126 -0
- package/js/examples/claude-streaming-final.mjs +20 -0
- package/js/examples/cleanup-verification-test.mjs +115 -0
- package/js/examples/colors-buffer-processing.mjs +14 -0
- package/js/examples/colors-default-preserved.mjs +15 -0
- package/js/examples/colors-per-command-config.mjs +15 -0
- package/js/examples/colors-strip-ansi.mjs +13 -0
- package/js/examples/commandstream-jq.mjs +29 -0
- package/js/examples/commandstream-working.mjs +23 -0
- package/js/examples/comprehensive-streams-demo.mjs +121 -0
- package/js/examples/ctrl-c-concurrent-processes.mjs +20 -0
- package/js/examples/ctrl-c-long-running-command.mjs +20 -0
- package/js/examples/ctrl-c-real-system-command.mjs +17 -0
- package/js/examples/ctrl-c-sleep-command.mjs +17 -0
- package/js/examples/ctrl-c-stdin-forwarding.mjs +20 -0
- package/js/examples/ctrl-c-virtual-command.mjs +17 -0
- package/js/examples/debug-already-started.mjs +20 -0
- package/js/examples/debug-ansi-processing.mjs +42 -0
- package/js/examples/debug-basic-streaming.mjs +44 -0
- package/js/examples/debug-buildshellcommand.mjs +82 -0
- package/js/examples/debug-child-process.mjs +43 -0
- package/js/examples/debug-child-state.mjs +55 -0
- package/js/examples/debug-chunking.mjs +38 -0
- package/js/examples/debug-command-parsing.mjs +61 -0
- package/js/examples/debug-complete-consolidation.mjs +97 -0
- package/js/examples/debug-echo-args.mjs +22 -0
- package/js/examples/debug-emit-timing.mjs +28 -0
- package/js/examples/debug-end-event.mjs +56 -0
- package/js/examples/debug-errexit.mjs +16 -0
- package/js/examples/debug-event-emission.mjs +40 -0
- package/js/examples/debug-event-timing.mjs +67 -0
- package/js/examples/debug-event-vs-result.mjs +30 -0
- package/js/examples/debug-exact-command.mjs +28 -0
- package/js/examples/debug-exact-test-scenario.mjs +44 -0
- package/js/examples/debug-execution-path.mjs +27 -0
- package/js/examples/debug-exit-command.mjs +38 -0
- package/js/examples/debug-exit-virtual.mjs +54 -0
- package/js/examples/debug-finish-consolidation.mjs +44 -0
- package/js/examples/debug-force-cleanup.mjs +47 -0
- package/js/examples/debug-getter-basic.mjs +13 -0
- package/js/examples/debug-getter-direct.mjs +23 -0
- package/js/examples/debug-getter-internals.mjs +61 -0
- package/js/examples/debug-handler-detection.mjs +65 -0
- package/js/examples/debug-idempotent-finish.mjs +54 -0
- package/js/examples/debug-idempotent-kill.mjs +58 -0
- package/js/examples/debug-interpolation-individual.mjs +88 -0
- package/js/examples/debug-interpolation-issue.mjs +101 -0
- package/js/examples/debug-jq-streaming.mjs +57 -0
- package/js/examples/debug-jq-tty-colors.mjs +168 -0
- package/js/examples/debug-kill-cleanup.mjs +56 -0
- package/js/examples/debug-kill-method.mjs +33 -0
- package/js/examples/debug-listener-interference.mjs +38 -0
- package/js/examples/debug-listener-lifecycle.mjs +50 -0
- package/js/examples/debug-listener-timing.mjs +62 -0
- package/js/examples/debug-listeners-property.mjs +34 -0
- package/js/examples/debug-map-methods.mjs +39 -0
- package/js/examples/debug-not-awaited-cleanup.mjs +106 -0
- package/js/examples/debug-off-method.mjs +28 -0
- package/js/examples/debug-option-merging.mjs +17 -0
- package/js/examples/debug-options.mjs +36 -0
- package/js/examples/debug-output.mjs +25 -0
- package/js/examples/debug-pattern-matching.mjs +69 -0
- package/js/examples/debug-pipeline-cat.mjs +28 -0
- package/js/examples/debug-pipeline-cleanup.mjs +71 -0
- package/js/examples/debug-pipeline-error-detailed.mjs +78 -0
- package/js/examples/debug-pipeline-error.mjs +65 -0
- package/js/examples/debug-pipeline-issue.mjs +26 -0
- package/js/examples/debug-pipeline-method.mjs +22 -0
- package/js/examples/debug-pipeline-stream.mjs +66 -0
- package/js/examples/debug-pipeline.mjs +14 -0
- package/js/examples/debug-process-exit-trace.mjs +41 -0
- package/js/examples/debug-process-path.mjs +38 -0
- package/js/examples/debug-property-check.mjs +29 -0
- package/js/examples/debug-resource-cleanup.mjs +83 -0
- package/js/examples/debug-shell-args.mjs +103 -0
- package/js/examples/debug-sigint-child-handler.mjs +44 -0
- package/js/examples/debug-sigint-forwarding.mjs +61 -0
- package/js/examples/debug-sigint-handler-install.mjs +79 -0
- package/js/examples/debug-sigint-handler-order.mjs +85 -0
- package/js/examples/debug-sigint-listeners.mjs +48 -0
- package/js/examples/debug-sigint-start-pattern.mjs +62 -0
- package/js/examples/debug-sigint-timer.mjs +40 -0
- package/js/examples/debug-simple-command.mjs +49 -0
- package/js/examples/debug-simple-getter.mjs +30 -0
- package/js/examples/debug-simple.mjs +39 -0
- package/js/examples/debug-simplified-finished.mjs +102 -0
- package/js/examples/debug-stack-overflow.mjs +25 -0
- package/js/examples/debug-stdin-simple.mjs +28 -0
- package/js/examples/debug-stdin.mjs +28 -0
- package/js/examples/debug-stream-emitter-isolated.mjs +45 -0
- package/js/examples/debug-stream-emitter.mjs +25 -0
- package/js/examples/debug-stream-events.mjs +70 -0
- package/js/examples/debug-stream-generator.mjs +23 -0
- package/js/examples/debug-stream-getter-issue.mjs +37 -0
- package/js/examples/debug-stream-getter.mjs +19 -0
- package/js/examples/debug-stream-internals.mjs +64 -0
- package/js/examples/debug-stream-method.mjs +46 -0
- package/js/examples/debug-stream-object.mjs +58 -0
- package/js/examples/debug-stream-properties.mjs +37 -0
- package/js/examples/debug-stream-timing.mjs +28 -0
- package/js/examples/debug-streaming.mjs +24 -0
- package/js/examples/debug-test-isolation.mjs +54 -0
- package/js/examples/debug-test-state.mjs +27 -0
- package/js/examples/debug-user-sigint.mjs +19 -0
- package/js/examples/debug-virtual-disable.mjs +21 -0
- package/js/examples/debug-virtual-vs-real.mjs +68 -0
- package/js/examples/debug-with-trace.mjs +23 -0
- package/js/examples/debug_parent_stream.mjs +22 -0
- package/js/examples/emulate-claude-stream.mjs +30 -0
- package/js/examples/emulated-streaming-direct.mjs +22 -0
- package/js/examples/emulated-streaming-jq-pipe.mjs +22 -0
- package/js/examples/emulated-streaming-sh-pipe.mjs +23 -0
- package/js/examples/events-build-process.mjs +73 -0
- package/js/examples/events-concurrent-streams.mjs +51 -0
- package/js/examples/events-error-handling.mjs +59 -0
- package/js/examples/events-file-monitoring.mjs +66 -0
- package/js/examples/events-interactive-simulation.mjs +69 -0
- package/js/examples/events-log-processing.mjs +72 -0
- package/js/examples/events-network-monitoring.mjs +68 -0
- package/js/examples/events-ping-basic.mjs +37 -0
- package/js/examples/events-progress-tracking.mjs +55 -0
- package/js/examples/events-stdin-input.mjs +34 -0
- package/js/examples/example-ansi-ls.mjs +39 -0
- package/js/examples/example-top.mjs +27 -0
- package/js/examples/final-ping-stdin-proof.mjs +88 -0
- package/js/examples/final-test-shell-operators.mjs +123 -0
- package/js/examples/final-working-examples.mjs +162 -0
- package/js/examples/gh-auth-test.mjs +103 -0
- package/js/examples/gh-delete-hang-test.mjs +79 -0
- package/js/examples/gh-gist-creation-test.mjs +276 -0
- package/js/examples/gh-gist-minimal-test.mjs +89 -0
- package/js/examples/gh-hang-exact-original.mjs +83 -0
- package/js/examples/gh-hang-reproduction.mjs +151 -0
- package/js/examples/gh-hang-test-with-redirect.mjs +45 -0
- package/js/examples/gh-hang-test-without-redirect.mjs +43 -0
- package/js/examples/gh-minimal-hang-check.mjs +33 -0
- package/js/examples/gh-operations-with-cd.mjs +187 -0
- package/js/examples/gh-output-test.mjs +102 -0
- package/js/examples/gh-reproduce-hang.mjs +41 -0
- package/js/examples/git-operations-with-cd.mjs +186 -0
- package/js/examples/interactive-math-calc.mjs +45 -0
- package/js/examples/interactive-top-fixed.mjs +25 -0
- package/js/examples/interactive-top-improved.mjs +72 -0
- package/js/examples/interactive-top-pty-logging.mjs +69 -0
- package/js/examples/interactive-top-pty.mjs +27 -0
- package/js/examples/interactive-top-with-logging.mjs +56 -0
- package/js/examples/interactive-top.mjs +29 -0
- package/js/examples/jq-color-demo.mjs +53 -0
- package/js/examples/jq-colors-streaming.mjs +42 -0
- package/js/examples/manual-ctrl-c-test.mjs +50 -0
- package/js/examples/methods-multiple-options.mjs +25 -0
- package/js/examples/methods-run-basic.mjs +10 -0
- package/js/examples/methods-start-basic.mjs +10 -0
- package/js/examples/node-compat-data-events.mjs +36 -0
- package/js/examples/node-compat-readable-event.mjs +29 -0
- package/js/examples/node-compat-small-buffer.mjs +33 -0
- package/js/examples/options-capture-false.mjs +12 -0
- package/js/examples/options-combined-settings.mjs +13 -0
- package/js/examples/options-custom-input.mjs +16 -0
- package/js/examples/options-default-behavior.mjs +10 -0
- package/js/examples/options-maximum-performance.mjs +15 -0
- package/js/examples/options-mirror-false.mjs +10 -0
- package/js/examples/options-performance-mode.mjs +13 -0
- package/js/examples/options-performance-optimization.mjs +14 -0
- package/js/examples/options-run-alias-demo.mjs +15 -0
- package/js/examples/options-run-alias.mjs +10 -0
- package/js/examples/options-silent-execution.mjs +14 -0
- package/js/examples/options-streaming-capture.mjs +24 -0
- package/js/examples/options-streaming-multiple.mjs +35 -0
- package/js/examples/options-streaming-silent.mjs +21 -0
- package/js/examples/options-streaming-stdin.mjs +21 -0
- package/js/examples/ping-streaming-filtered.mjs +22 -0
- package/js/examples/ping-streaming-interruptible.mjs +47 -0
- package/js/examples/ping-streaming-silent.mjs +24 -0
- package/js/examples/ping-streaming-simple.mjs +13 -0
- package/js/examples/ping-streaming-statistics.mjs +49 -0
- package/js/examples/ping-streaming-timestamps.mjs +22 -0
- package/js/examples/ping-streaming.mjs +48 -0
- package/js/examples/prove-ping-stdin-limitation.mjs +94 -0
- package/js/examples/readme-example.mjs +39 -0
- package/js/examples/realtime-json-stream.mjs +143 -0
- package/js/examples/reliable-stdin-commands.mjs +135 -0
- package/js/examples/reproduce-issue-135-v2.mjs +15 -0
- package/js/examples/reproduce-issue-135.mjs +17 -0
- package/js/examples/shell-cd-behavior.mjs +88 -0
- package/js/examples/sigint-forwarding-test.mjs +60 -0
- package/js/examples/sigint-handler-test.mjs +72 -0
- package/js/examples/simple-async-test.mjs +49 -0
- package/js/examples/simple-claude-test.mjs +17 -0
- package/js/examples/simple-event-test.mjs +33 -0
- package/js/examples/simple-jq-streaming.mjs +48 -0
- package/js/examples/simple-stream-demo.mjs +35 -0
- package/js/examples/simple-test-sleep.js +30 -0
- package/js/examples/simple-working-stdin.mjs +30 -0
- package/js/examples/streaming-behavior-test.mjs +116 -0
- package/js/examples/streaming-direct-command.mjs +21 -0
- package/js/examples/streaming-filtered-output.mjs +33 -0
- package/js/examples/streaming-grep-pipeline.mjs +21 -0
- package/js/examples/streaming-interactive-stdin.mjs +24 -0
- package/js/examples/streaming-jq-pipeline.mjs +23 -0
- package/js/examples/streaming-multistage-pipeline.mjs +23 -0
- package/js/examples/streaming-pipes-event-pattern.mjs +27 -0
- package/js/examples/streaming-pipes-multistage.mjs +22 -0
- package/js/examples/streaming-pipes-realtime-jq.mjs +23 -0
- package/js/examples/streaming-progress-tracking.mjs +34 -0
- package/js/examples/streaming-reusable-configs.mjs +52 -0
- package/js/examples/streaming-silent-capture.mjs +20 -0
- package/js/examples/streaming-test-simple.mjs +70 -0
- package/js/examples/streaming-virtual-pipeline.mjs +18 -0
- package/js/examples/syntax-basic-comparison.mjs +31 -0
- package/js/examples/syntax-basic-options.mjs +12 -0
- package/js/examples/syntax-combined-options.mjs +19 -0
- package/js/examples/syntax-command-chaining.mjs +12 -0
- package/js/examples/syntax-custom-directory.mjs +10 -0
- package/js/examples/syntax-custom-environment.mjs +13 -0
- package/js/examples/syntax-custom-stdin.mjs +10 -0
- package/js/examples/syntax-mixed-regular.mjs +11 -0
- package/js/examples/syntax-mixed-usage.mjs +15 -0
- package/js/examples/syntax-multiple-listeners.mjs +87 -0
- package/js/examples/syntax-piping-comparison.mjs +32 -0
- package/js/examples/syntax-reusable-config.mjs +16 -0
- package/js/examples/syntax-reusable-configs.mjs +21 -0
- package/js/examples/syntax-silent-operations.mjs +10 -0
- package/js/examples/syntax-stdin-option.mjs +12 -0
- package/js/examples/temp-sigint-test.mjs +21 -0
- package/js/examples/test-actual-buildshell.mjs +44 -0
- package/js/examples/test-async-streams-working.mjs +102 -0
- package/js/examples/test-async-streams.mjs +90 -0
- package/js/examples/test-auth-parse.mjs +74 -0
- package/js/examples/test-auto-quoting.mjs +57 -0
- package/js/examples/test-auto-start-fix.mjs +95 -0
- package/js/examples/test-baseline-sigint.mjs +38 -0
- package/js/examples/test-buffer-behavior.mjs +39 -0
- package/js/examples/test-buffers-simple.mjs +35 -0
- package/js/examples/test-bun-specific-issue.mjs +106 -0
- package/js/examples/test-bun-streaming.mjs +81 -0
- package/js/examples/test-cat-direct.mjs +41 -0
- package/js/examples/test-cat-pipe.mjs +34 -0
- package/js/examples/test-cd-behavior.mjs +42 -0
- package/js/examples/test-child-process-timing.mjs +53 -0
- package/js/examples/test-child-sigint-handler.mjs +62 -0
- package/js/examples/test-cleanup-simple.mjs +21 -0
- package/js/examples/test-comprehensive-tracing.mjs +58 -0
- package/js/examples/test-correct-space-handling.mjs +46 -0
- package/js/examples/test-ctrl-c-debug.mjs +44 -0
- package/js/examples/test-ctrl-c-inherit.mjs +30 -0
- package/js/examples/test-ctrl-c-sleep.mjs +31 -0
- package/js/examples/test-ctrl-c.mjs +17 -0
- package/js/examples/test-debug-new-options.mjs +55 -0
- package/js/examples/test-debug-pty.mjs +49 -0
- package/js/examples/test-debug-tee.mjs +38 -0
- package/js/examples/test-debug.mjs +25 -0
- package/js/examples/test-direct-jq.mjs +47 -0
- package/js/examples/test-direct-pipe-reading.mjs +119 -0
- package/js/examples/test-direct-pipe.sh +28 -0
- package/js/examples/test-double-quoting-prevention.mjs +138 -0
- package/js/examples/test-edge-cases-quoting.mjs +89 -0
- package/js/examples/test-events.mjs +37 -0
- package/js/examples/test-explicit-stdio.mjs +51 -0
- package/js/examples/test-final-streaming.mjs +71 -0
- package/js/examples/test-fix.mjs +71 -0
- package/js/examples/test-incremental-streaming.mjs +46 -0
- package/js/examples/test-individual-spawn.mjs +35 -0
- package/js/examples/test-inherit-stdout-not-stdin.mjs +133 -0
- package/js/examples/test-injection-protection.mjs +77 -0
- package/js/examples/test-interactive-streaming.mjs +140 -0
- package/js/examples/test-interactive-top.md +24 -0
- package/js/examples/test-interactive.mjs +17 -0
- package/js/examples/test-interpolation.mjs +14 -0
- package/js/examples/test-interrupt.mjs +40 -0
- package/js/examples/test-issue-135-comprehensive.mjs +41 -0
- package/js/examples/test-issue12-detailed.mjs +89 -0
- package/js/examples/test-issue12-exact.mjs +33 -0
- package/js/examples/test-jq-color.mjs +57 -0
- package/js/examples/test-jq-colors.mjs +41 -0
- package/js/examples/test-jq-compact.mjs +33 -0
- package/js/examples/test-jq-native.sh +10 -0
- package/js/examples/test-jq-pipeline-behavior.mjs +80 -0
- package/js/examples/test-jq-realtime.mjs +40 -0
- package/js/examples/test-manual-start.mjs +54 -0
- package/js/examples/test-mixed-quoting.mjs +88 -0
- package/js/examples/test-multi-stream.mjs +50 -0
- package/js/examples/test-multistage-debug.mjs +44 -0
- package/js/examples/test-native-spawn-vs-command-stream.mjs +154 -0
- package/js/examples/test-no-parse-pipeline.mjs +33 -0
- package/js/examples/test-non-virtual.mjs +52 -0
- package/js/examples/test-operators.mjs +53 -0
- package/js/examples/test-parent-continues.mjs +44 -0
- package/js/examples/test-path-interpolation.mjs +86 -0
- package/js/examples/test-ping-kill-and-stdin.mjs +98 -0
- package/js/examples/test-ping.mjs +12 -0
- package/js/examples/test-pty-spawn.mjs +101 -0
- package/js/examples/test-pty.mjs +38 -0
- package/js/examples/test-quote-behavior-summary.mjs +110 -0
- package/js/examples/test-quote-edge-cases.mjs +69 -0
- package/js/examples/test-quote-parsing.mjs +23 -0
- package/js/examples/test-raw-function.mjs +153 -0
- package/js/examples/test-raw-streaming.mjs +47 -0
- package/js/examples/test-readme-examples.mjs +142 -0
- package/js/examples/test-real-cat.mjs +28 -0
- package/js/examples/test-real-commands.mjs +21 -0
- package/js/examples/test-real-shell.mjs +31 -0
- package/js/examples/test-real-stdin-commands.mjs +160 -0
- package/js/examples/test-runner-batched.mjs +98 -0
- package/js/examples/test-runner-simple.mjs +80 -0
- package/js/examples/test-runner.mjs +67 -0
- package/js/examples/test-scope-parse.mjs +31 -0
- package/js/examples/test-sh-pipeline.mjs +24 -0
- package/js/examples/test-shell-detection.mjs +71 -0
- package/js/examples/test-shell-parser.mjs +37 -0
- package/js/examples/test-sigint-behavior.mjs +241 -0
- package/js/examples/test-sigint-handling.sh +14 -0
- package/js/examples/test-simple-pipe.mjs +12 -0
- package/js/examples/test-simple-streaming.mjs +32 -0
- package/js/examples/test-sleep-stdin.js +27 -0
- package/js/examples/test-sleep.mjs +56 -0
- package/js/examples/test-smart-quoting.mjs +180 -0
- package/js/examples/test-spaces-in-path.mjs +48 -0
- package/js/examples/test-special-chars-quoting.mjs +54 -0
- package/js/examples/test-stdin-after-start.mjs +39 -0
- package/js/examples/test-stdin-simple.mjs +67 -0
- package/js/examples/test-stdin-timing.mjs +74 -0
- package/js/examples/test-stdio-combinations.mjs +124 -0
- package/js/examples/test-stream-access.mjs +84 -0
- package/js/examples/test-stream-cleanup.mjs +27 -0
- package/js/examples/test-stream-readers.mjs +152 -0
- package/js/examples/test-streaming-final.mjs +57 -0
- package/js/examples/test-streaming-interfaces.mjs +141 -0
- package/js/examples/test-streaming-timing.mjs +27 -0
- package/js/examples/test-streaming.mjs +32 -0
- package/js/examples/test-streams-stdin-comprehensive.mjs +134 -0
- package/js/examples/test-streams-stdin-ctrl-c.mjs +96 -0
- package/js/examples/test-template-literal.mjs +26 -0
- package/js/examples/test-template-vs-interpolation.mjs +49 -0
- package/js/examples/test-timing.mjs +41 -0
- package/js/examples/test-top-inherit-stdout-stdin-control.mjs +123 -0
- package/js/examples/test-top-quit-stdin.mjs +118 -0
- package/js/examples/test-trace-option.mjs +21 -0
- package/js/examples/test-user-double-quotes.mjs +36 -0
- package/js/examples/test-user-single-quotes.mjs +36 -0
- package/js/examples/test-verbose.mjs +18 -0
- package/js/examples/test-verbose2.mjs +32 -0
- package/js/examples/test-virtual-streaming.mjs +125 -0
- package/js/examples/test-waiting-command.mjs +52 -0
- package/js/examples/test-waiting-commands.mjs +83 -0
- package/js/examples/test-watch-mode.mjs +104 -0
- package/js/examples/test-yes-cancellation.mjs +26 -0
- package/js/examples/test-yes-detailed.mjs +58 -0
- package/js/examples/test-yes-trace.mjs +28 -0
- package/js/examples/trace-abort-controller.mjs +30 -0
- package/js/examples/trace-error-handling.mjs +22 -0
- package/js/examples/trace-pipeline-command.mjs +22 -0
- package/js/examples/trace-signal-handling.mjs +35 -0
- package/js/examples/trace-simple-command.mjs +18 -0
- package/js/examples/trace-stderr-output.mjs +22 -0
- package/js/examples/verify-fix-both-runtimes.mjs +73 -0
- package/js/examples/verify-issue12-fixed.mjs +78 -0
- package/js/examples/which-command-common-commands.mjs +19 -0
- package/js/examples/which-command-gh-test.mjs +23 -0
- package/js/examples/which-command-nonexistent.mjs +20 -0
- package/js/examples/which-command-system-comparison.mjs +28 -0
- package/js/examples/working-example.mjs +13 -0
- package/js/examples/working-stdin-examples.mjs +138 -0
- package/js/examples/working-streaming-demo.mjs +49 -0
- package/{src ā js/src}/$.mjs +20 -4
- package/{src ā js/src}/$.utils.mjs +14 -2
- package/js/tests/$.features.test.mjs +283 -0
- package/js/tests/$.test.mjs +935 -0
- package/js/tests/builtin-commands.test.mjs +387 -0
- package/js/tests/bun-shell-path-fix.test.mjs +115 -0
- package/js/tests/bun.features.test.mjs +189 -0
- package/js/tests/cd-virtual-command.test.mjs +622 -0
- package/js/tests/cleanup-verification.test.mjs +127 -0
- package/js/tests/ctrl-c-baseline.test.mjs +207 -0
- package/js/tests/ctrl-c-basic.test.mjs +220 -0
- package/js/tests/ctrl-c-library.test.mjs +197 -0
- package/js/tests/ctrl-c-signal.test.mjs +915 -0
- package/js/tests/examples.test.mjs +252 -0
- package/js/tests/execa.features.test.mjs +198 -0
- package/js/tests/gh-commands.test.mjs +164 -0
- package/js/tests/gh-gist-operations.test.mjs +221 -0
- package/js/tests/git-gh-cd.test.mjs +466 -0
- package/js/tests/interactive-option.test.mjs +114 -0
- package/js/tests/interactive-streaming.test.mjs +307 -0
- package/js/tests/issue-135-final.test.mjs +58 -0
- package/js/tests/jq-color-behavior.test.mjs +140 -0
- package/js/tests/jq.test.mjs +318 -0
- package/js/tests/options-examples.test.mjs +106 -0
- package/js/tests/options-syntax.test.mjs +112 -0
- package/js/tests/path-interpolation.test.mjs +412 -0
- package/js/tests/pipe.test.mjs +291 -0
- package/js/tests/raw-function.test.mjs +266 -0
- package/js/tests/readme-examples.test.mjs +427 -0
- package/js/tests/resource-cleanup-internals.test.mjs +669 -0
- package/js/tests/shell-settings.test.mjs +279 -0
- package/js/tests/sigint-cleanup-isolated.test.mjs +151 -0
- package/js/tests/sigint-cleanup.test.mjs +118 -0
- package/js/tests/start-run-edge-cases.test.mjs +152 -0
- package/js/tests/start-run-options.test.mjs +181 -0
- package/js/tests/stderr-output-handling.test.mjs +279 -0
- package/js/tests/streaming-interfaces.test.mjs +194 -0
- package/js/tests/sync.test.mjs +297 -0
- package/js/tests/system-pipe.test.mjs +226 -0
- package/js/tests/test-cleanup.mjs +200 -0
- package/js/tests/test-helper-fixed.mjs +148 -0
- package/js/tests/test-helper-v2.mjs +118 -0
- package/js/tests/test-helper.mjs +171 -0
- package/js/tests/test-sigint-child.js +15 -0
- package/js/tests/text-method.test.mjs +225 -0
- package/js/tests/virtual.test.mjs +364 -0
- package/js/tests/yes-command-cleanup.test.mjs +208 -0
- package/js/tests/zx.features.test.mjs +233 -0
- package/package.json +13 -12
- package/rust/Cargo.lock +947 -0
- package/rust/Cargo.toml +47 -0
- package/rust/src/commands/basename.rs +69 -0
- package/rust/src/commands/cat.rs +123 -0
- package/rust/src/commands/cd.rs +67 -0
- package/rust/src/commands/cp.rs +187 -0
- package/rust/src/commands/dirname.rs +57 -0
- package/rust/src/commands/echo.rs +73 -0
- package/rust/src/commands/env.rs +33 -0
- package/rust/src/commands/exit.rs +36 -0
- package/rust/src/commands/false.rs +24 -0
- package/rust/src/commands/ls.rs +182 -0
- package/rust/src/commands/mkdir.rs +98 -0
- package/rust/src/commands/mod.rs +200 -0
- package/rust/src/commands/mv.rs +180 -0
- package/rust/src/commands/pwd.rs +28 -0
- package/rust/src/commands/rm.rs +150 -0
- package/rust/src/commands/seq.rs +179 -0
- package/rust/src/commands/sleep.rs +97 -0
- package/rust/src/commands/test.rs +204 -0
- package/rust/src/commands/touch.rs +99 -0
- package/rust/src/commands/true.rs +24 -0
- package/rust/src/commands/which.rs +87 -0
- package/rust/src/commands/yes.rs +99 -0
- package/rust/src/lib.rs +492 -0
- package/rust/src/main.rs +37 -0
- package/rust/src/shell_parser.rs +565 -0
- package/rust/src/utils.rs +335 -0
- package/rust/tests/builtin_commands.rs +549 -0
- package/rust/tests/process_runner.rs +286 -0
- package/rust/tests/shell_parser.rs +296 -0
- package/rust/tests/utils.rs +282 -0
- package/rust/tests/virtual_commands.rs +199 -0
- /package/{src ā js/src}/commands/$.basename.mjs +0 -0
- /package/{src ā js/src}/commands/$.cat.mjs +0 -0
- /package/{src ā js/src}/commands/$.cd.mjs +0 -0
- /package/{src ā js/src}/commands/$.cp.mjs +0 -0
- /package/{src ā js/src}/commands/$.dirname.mjs +0 -0
- /package/{src ā js/src}/commands/$.echo.mjs +0 -0
- /package/{src ā js/src}/commands/$.env.mjs +0 -0
- /package/{src ā js/src}/commands/$.exit.mjs +0 -0
- /package/{src ā js/src}/commands/$.false.mjs +0 -0
- /package/{src ā js/src}/commands/$.ls.mjs +0 -0
- /package/{src ā js/src}/commands/$.mkdir.mjs +0 -0
- /package/{src ā js/src}/commands/$.mv.mjs +0 -0
- /package/{src ā js/src}/commands/$.pwd.mjs +0 -0
- /package/{src ā js/src}/commands/$.rm.mjs +0 -0
- /package/{src ā js/src}/commands/$.seq.mjs +0 -0
- /package/{src ā js/src}/commands/$.sleep.mjs +0 -0
- /package/{src ā js/src}/commands/$.test.mjs +0 -0
- /package/{src ā js/src}/commands/$.touch.mjs +0 -0
- /package/{src ā js/src}/commands/$.true.mjs +0 -0
- /package/{src ā js/src}/commands/$.which.mjs +0 -0
- /package/{src ā js/src}/commands/$.yes.mjs +0 -0
- /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}`);
|