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,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()));
|