command-stream 0.8.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (500) hide show
  1. package/js/examples/01-basic-streaming.mjs +14 -0
  2. package/js/examples/02-async-iterator.mjs +9 -0
  3. package/js/examples/03-file-and-console.mjs +16 -0
  4. package/js/examples/04-claude-jq-pipe.mjs +16 -0
  5. package/js/examples/CI-DEBUG-README.md +138 -0
  6. package/js/examples/README-examples.mjs +111 -0
  7. package/js/examples/README.md +345 -0
  8. package/js/examples/STREAMING_INTERFACES_SUMMARY.md +116 -0
  9. package/js/examples/add-test-timeouts.js +107 -0
  10. package/js/examples/ansi-default-preserved.mjs +11 -0
  11. package/js/examples/ansi-global-config.mjs +12 -0
  12. package/js/examples/ansi-reset-default.mjs +12 -0
  13. package/js/examples/ansi-strip-utils.mjs +12 -0
  14. package/js/examples/baseline-child-process.mjs +23 -0
  15. package/js/examples/baseline-claude-test.mjs +47 -0
  16. package/js/examples/baseline-working.mjs +34 -0
  17. package/js/examples/capture-mirror-comparison.mjs +23 -0
  18. package/js/examples/capture-mirror-default.mjs +11 -0
  19. package/js/examples/capture-mirror-performance.mjs +16 -0
  20. package/js/examples/capture-mirror-show-only.mjs +16 -0
  21. package/js/examples/capture-mirror-silent-processing.mjs +16 -0
  22. package/js/examples/ci-debug-baseline-vs-library.mjs +265 -0
  23. package/js/examples/ci-debug-es-module-loading.mjs +184 -0
  24. package/js/examples/ci-debug-signal-handling.mjs +225 -0
  25. package/js/examples/ci-debug-stdout-buffering.mjs +94 -0
  26. package/js/examples/ci-debug-test-timeouts.mjs +259 -0
  27. package/js/examples/claude-exact-file-output.mjs +20 -0
  28. package/js/examples/claude-exact-jq.mjs +13 -0
  29. package/js/examples/claude-exact-streaming.mjs +13 -0
  30. package/js/examples/claude-jq-pipeline.mjs +13 -0
  31. package/js/examples/claude-json-stream.mjs +39 -0
  32. package/js/examples/claude-streaming-basic.mjs +99 -0
  33. package/js/examples/claude-streaming-demo.mjs +126 -0
  34. package/js/examples/claude-streaming-final.mjs +20 -0
  35. package/js/examples/cleanup-verification-test.mjs +115 -0
  36. package/js/examples/colors-buffer-processing.mjs +14 -0
  37. package/js/examples/colors-default-preserved.mjs +15 -0
  38. package/js/examples/colors-per-command-config.mjs +15 -0
  39. package/js/examples/colors-strip-ansi.mjs +13 -0
  40. package/js/examples/commandstream-jq.mjs +29 -0
  41. package/js/examples/commandstream-working.mjs +23 -0
  42. package/js/examples/comprehensive-streams-demo.mjs +121 -0
  43. package/js/examples/ctrl-c-concurrent-processes.mjs +20 -0
  44. package/js/examples/ctrl-c-long-running-command.mjs +20 -0
  45. package/js/examples/ctrl-c-real-system-command.mjs +17 -0
  46. package/js/examples/ctrl-c-sleep-command.mjs +17 -0
  47. package/js/examples/ctrl-c-stdin-forwarding.mjs +20 -0
  48. package/js/examples/ctrl-c-virtual-command.mjs +17 -0
  49. package/js/examples/debug-already-started.mjs +20 -0
  50. package/js/examples/debug-ansi-processing.mjs +42 -0
  51. package/js/examples/debug-basic-streaming.mjs +44 -0
  52. package/js/examples/debug-buildshellcommand.mjs +82 -0
  53. package/js/examples/debug-child-process.mjs +43 -0
  54. package/js/examples/debug-child-state.mjs +55 -0
  55. package/js/examples/debug-chunking.mjs +38 -0
  56. package/js/examples/debug-command-parsing.mjs +61 -0
  57. package/js/examples/debug-complete-consolidation.mjs +97 -0
  58. package/js/examples/debug-echo-args.mjs +22 -0
  59. package/js/examples/debug-emit-timing.mjs +28 -0
  60. package/js/examples/debug-end-event.mjs +56 -0
  61. package/js/examples/debug-errexit.mjs +16 -0
  62. package/js/examples/debug-event-emission.mjs +40 -0
  63. package/js/examples/debug-event-timing.mjs +67 -0
  64. package/js/examples/debug-event-vs-result.mjs +30 -0
  65. package/js/examples/debug-exact-command.mjs +28 -0
  66. package/js/examples/debug-exact-test-scenario.mjs +44 -0
  67. package/js/examples/debug-execution-path.mjs +27 -0
  68. package/js/examples/debug-exit-command.mjs +38 -0
  69. package/js/examples/debug-exit-virtual.mjs +54 -0
  70. package/js/examples/debug-finish-consolidation.mjs +44 -0
  71. package/js/examples/debug-force-cleanup.mjs +47 -0
  72. package/js/examples/debug-getter-basic.mjs +13 -0
  73. package/js/examples/debug-getter-direct.mjs +23 -0
  74. package/js/examples/debug-getter-internals.mjs +61 -0
  75. package/js/examples/debug-handler-detection.mjs +65 -0
  76. package/js/examples/debug-idempotent-finish.mjs +54 -0
  77. package/js/examples/debug-idempotent-kill.mjs +58 -0
  78. package/js/examples/debug-interpolation-individual.mjs +88 -0
  79. package/js/examples/debug-interpolation-issue.mjs +101 -0
  80. package/js/examples/debug-jq-streaming.mjs +57 -0
  81. package/js/examples/debug-jq-tty-colors.mjs +168 -0
  82. package/js/examples/debug-kill-cleanup.mjs +56 -0
  83. package/js/examples/debug-kill-method.mjs +33 -0
  84. package/js/examples/debug-listener-interference.mjs +38 -0
  85. package/js/examples/debug-listener-lifecycle.mjs +50 -0
  86. package/js/examples/debug-listener-timing.mjs +62 -0
  87. package/js/examples/debug-listeners-property.mjs +34 -0
  88. package/js/examples/debug-map-methods.mjs +39 -0
  89. package/js/examples/debug-not-awaited-cleanup.mjs +106 -0
  90. package/js/examples/debug-off-method.mjs +28 -0
  91. package/js/examples/debug-option-merging.mjs +17 -0
  92. package/js/examples/debug-options.mjs +36 -0
  93. package/js/examples/debug-output.mjs +25 -0
  94. package/js/examples/debug-pattern-matching.mjs +69 -0
  95. package/js/examples/debug-pipeline-cat.mjs +28 -0
  96. package/js/examples/debug-pipeline-cleanup.mjs +71 -0
  97. package/js/examples/debug-pipeline-error-detailed.mjs +78 -0
  98. package/js/examples/debug-pipeline-error.mjs +65 -0
  99. package/js/examples/debug-pipeline-issue.mjs +26 -0
  100. package/js/examples/debug-pipeline-method.mjs +22 -0
  101. package/js/examples/debug-pipeline-stream.mjs +66 -0
  102. package/js/examples/debug-pipeline.mjs +14 -0
  103. package/js/examples/debug-process-exit-trace.mjs +41 -0
  104. package/js/examples/debug-process-path.mjs +38 -0
  105. package/js/examples/debug-property-check.mjs +29 -0
  106. package/js/examples/debug-resource-cleanup.mjs +83 -0
  107. package/js/examples/debug-shell-args.mjs +103 -0
  108. package/js/examples/debug-sigint-child-handler.mjs +44 -0
  109. package/js/examples/debug-sigint-forwarding.mjs +61 -0
  110. package/js/examples/debug-sigint-handler-install.mjs +79 -0
  111. package/js/examples/debug-sigint-handler-order.mjs +85 -0
  112. package/js/examples/debug-sigint-listeners.mjs +48 -0
  113. package/js/examples/debug-sigint-start-pattern.mjs +62 -0
  114. package/js/examples/debug-sigint-timer.mjs +40 -0
  115. package/js/examples/debug-simple-command.mjs +49 -0
  116. package/js/examples/debug-simple-getter.mjs +30 -0
  117. package/js/examples/debug-simple.mjs +39 -0
  118. package/js/examples/debug-simplified-finished.mjs +102 -0
  119. package/js/examples/debug-stack-overflow.mjs +25 -0
  120. package/js/examples/debug-stdin-simple.mjs +28 -0
  121. package/js/examples/debug-stdin.mjs +28 -0
  122. package/js/examples/debug-stream-emitter-isolated.mjs +45 -0
  123. package/js/examples/debug-stream-emitter.mjs +25 -0
  124. package/js/examples/debug-stream-events.mjs +70 -0
  125. package/js/examples/debug-stream-generator.mjs +23 -0
  126. package/js/examples/debug-stream-getter-issue.mjs +37 -0
  127. package/js/examples/debug-stream-getter.mjs +19 -0
  128. package/js/examples/debug-stream-internals.mjs +64 -0
  129. package/js/examples/debug-stream-method.mjs +46 -0
  130. package/js/examples/debug-stream-object.mjs +58 -0
  131. package/js/examples/debug-stream-properties.mjs +37 -0
  132. package/js/examples/debug-stream-timing.mjs +28 -0
  133. package/js/examples/debug-streaming.mjs +24 -0
  134. package/js/examples/debug-test-isolation.mjs +54 -0
  135. package/js/examples/debug-test-state.mjs +27 -0
  136. package/js/examples/debug-user-sigint.mjs +19 -0
  137. package/js/examples/debug-virtual-disable.mjs +21 -0
  138. package/js/examples/debug-virtual-vs-real.mjs +68 -0
  139. package/js/examples/debug-with-trace.mjs +23 -0
  140. package/js/examples/debug_parent_stream.mjs +22 -0
  141. package/js/examples/emulate-claude-stream.mjs +30 -0
  142. package/js/examples/emulated-streaming-direct.mjs +22 -0
  143. package/js/examples/emulated-streaming-jq-pipe.mjs +22 -0
  144. package/js/examples/emulated-streaming-sh-pipe.mjs +23 -0
  145. package/js/examples/events-build-process.mjs +73 -0
  146. package/js/examples/events-concurrent-streams.mjs +51 -0
  147. package/js/examples/events-error-handling.mjs +59 -0
  148. package/js/examples/events-file-monitoring.mjs +66 -0
  149. package/js/examples/events-interactive-simulation.mjs +69 -0
  150. package/js/examples/events-log-processing.mjs +72 -0
  151. package/js/examples/events-network-monitoring.mjs +68 -0
  152. package/js/examples/events-ping-basic.mjs +37 -0
  153. package/js/examples/events-progress-tracking.mjs +55 -0
  154. package/js/examples/events-stdin-input.mjs +34 -0
  155. package/js/examples/example-ansi-ls.mjs +39 -0
  156. package/js/examples/example-top.mjs +27 -0
  157. package/js/examples/final-ping-stdin-proof.mjs +88 -0
  158. package/js/examples/final-test-shell-operators.mjs +123 -0
  159. package/js/examples/final-working-examples.mjs +162 -0
  160. package/js/examples/gh-auth-test.mjs +103 -0
  161. package/js/examples/gh-delete-hang-test.mjs +79 -0
  162. package/js/examples/gh-gist-creation-test.mjs +276 -0
  163. package/js/examples/gh-gist-minimal-test.mjs +89 -0
  164. package/js/examples/gh-hang-exact-original.mjs +83 -0
  165. package/js/examples/gh-hang-reproduction.mjs +151 -0
  166. package/js/examples/gh-hang-test-with-redirect.mjs +45 -0
  167. package/js/examples/gh-hang-test-without-redirect.mjs +43 -0
  168. package/js/examples/gh-minimal-hang-check.mjs +33 -0
  169. package/js/examples/gh-operations-with-cd.mjs +187 -0
  170. package/js/examples/gh-output-test.mjs +102 -0
  171. package/js/examples/gh-reproduce-hang.mjs +41 -0
  172. package/js/examples/git-operations-with-cd.mjs +186 -0
  173. package/js/examples/interactive-math-calc.mjs +45 -0
  174. package/js/examples/interactive-top-fixed.mjs +25 -0
  175. package/js/examples/interactive-top-improved.mjs +72 -0
  176. package/js/examples/interactive-top-pty-logging.mjs +69 -0
  177. package/js/examples/interactive-top-pty.mjs +27 -0
  178. package/js/examples/interactive-top-with-logging.mjs +56 -0
  179. package/js/examples/interactive-top.mjs +29 -0
  180. package/js/examples/jq-color-demo.mjs +53 -0
  181. package/js/examples/jq-colors-streaming.mjs +42 -0
  182. package/js/examples/manual-ctrl-c-test.mjs +50 -0
  183. package/js/examples/methods-multiple-options.mjs +25 -0
  184. package/js/examples/methods-run-basic.mjs +10 -0
  185. package/js/examples/methods-start-basic.mjs +10 -0
  186. package/js/examples/node-compat-data-events.mjs +36 -0
  187. package/js/examples/node-compat-readable-event.mjs +29 -0
  188. package/js/examples/node-compat-small-buffer.mjs +33 -0
  189. package/js/examples/options-capture-false.mjs +12 -0
  190. package/js/examples/options-combined-settings.mjs +13 -0
  191. package/js/examples/options-custom-input.mjs +16 -0
  192. package/js/examples/options-default-behavior.mjs +10 -0
  193. package/js/examples/options-maximum-performance.mjs +15 -0
  194. package/js/examples/options-mirror-false.mjs +10 -0
  195. package/js/examples/options-performance-mode.mjs +13 -0
  196. package/js/examples/options-performance-optimization.mjs +14 -0
  197. package/js/examples/options-run-alias-demo.mjs +15 -0
  198. package/js/examples/options-run-alias.mjs +10 -0
  199. package/js/examples/options-silent-execution.mjs +14 -0
  200. package/js/examples/options-streaming-capture.mjs +24 -0
  201. package/js/examples/options-streaming-multiple.mjs +35 -0
  202. package/js/examples/options-streaming-silent.mjs +21 -0
  203. package/js/examples/options-streaming-stdin.mjs +21 -0
  204. package/js/examples/ping-streaming-filtered.mjs +22 -0
  205. package/js/examples/ping-streaming-interruptible.mjs +47 -0
  206. package/js/examples/ping-streaming-silent.mjs +24 -0
  207. package/js/examples/ping-streaming-simple.mjs +13 -0
  208. package/js/examples/ping-streaming-statistics.mjs +49 -0
  209. package/js/examples/ping-streaming-timestamps.mjs +22 -0
  210. package/js/examples/ping-streaming.mjs +48 -0
  211. package/js/examples/prove-ping-stdin-limitation.mjs +94 -0
  212. package/js/examples/readme-example.mjs +39 -0
  213. package/js/examples/realtime-json-stream.mjs +143 -0
  214. package/js/examples/reliable-stdin-commands.mjs +135 -0
  215. package/js/examples/reproduce-issue-135-v2.mjs +15 -0
  216. package/js/examples/reproduce-issue-135.mjs +17 -0
  217. package/js/examples/shell-cd-behavior.mjs +88 -0
  218. package/js/examples/sigint-forwarding-test.mjs +60 -0
  219. package/js/examples/sigint-handler-test.mjs +72 -0
  220. package/js/examples/simple-async-test.mjs +49 -0
  221. package/js/examples/simple-claude-test.mjs +17 -0
  222. package/js/examples/simple-event-test.mjs +33 -0
  223. package/js/examples/simple-jq-streaming.mjs +48 -0
  224. package/js/examples/simple-stream-demo.mjs +35 -0
  225. package/js/examples/simple-test-sleep.js +30 -0
  226. package/js/examples/simple-working-stdin.mjs +30 -0
  227. package/js/examples/streaming-behavior-test.mjs +116 -0
  228. package/js/examples/streaming-direct-command.mjs +21 -0
  229. package/js/examples/streaming-filtered-output.mjs +33 -0
  230. package/js/examples/streaming-grep-pipeline.mjs +21 -0
  231. package/js/examples/streaming-interactive-stdin.mjs +24 -0
  232. package/js/examples/streaming-jq-pipeline.mjs +23 -0
  233. package/js/examples/streaming-multistage-pipeline.mjs +23 -0
  234. package/js/examples/streaming-pipes-event-pattern.mjs +27 -0
  235. package/js/examples/streaming-pipes-multistage.mjs +22 -0
  236. package/js/examples/streaming-pipes-realtime-jq.mjs +23 -0
  237. package/js/examples/streaming-progress-tracking.mjs +34 -0
  238. package/js/examples/streaming-reusable-configs.mjs +52 -0
  239. package/js/examples/streaming-silent-capture.mjs +20 -0
  240. package/js/examples/streaming-test-simple.mjs +70 -0
  241. package/js/examples/streaming-virtual-pipeline.mjs +18 -0
  242. package/js/examples/syntax-basic-comparison.mjs +31 -0
  243. package/js/examples/syntax-basic-options.mjs +12 -0
  244. package/js/examples/syntax-combined-options.mjs +19 -0
  245. package/js/examples/syntax-command-chaining.mjs +12 -0
  246. package/js/examples/syntax-custom-directory.mjs +10 -0
  247. package/js/examples/syntax-custom-environment.mjs +13 -0
  248. package/js/examples/syntax-custom-stdin.mjs +10 -0
  249. package/js/examples/syntax-mixed-regular.mjs +11 -0
  250. package/js/examples/syntax-mixed-usage.mjs +15 -0
  251. package/js/examples/syntax-multiple-listeners.mjs +87 -0
  252. package/js/examples/syntax-piping-comparison.mjs +32 -0
  253. package/js/examples/syntax-reusable-config.mjs +16 -0
  254. package/js/examples/syntax-reusable-configs.mjs +21 -0
  255. package/js/examples/syntax-silent-operations.mjs +10 -0
  256. package/js/examples/syntax-stdin-option.mjs +12 -0
  257. package/js/examples/temp-sigint-test.mjs +21 -0
  258. package/js/examples/test-actual-buildshell.mjs +44 -0
  259. package/js/examples/test-async-streams-working.mjs +102 -0
  260. package/js/examples/test-async-streams.mjs +90 -0
  261. package/js/examples/test-auth-parse.mjs +74 -0
  262. package/js/examples/test-auto-quoting.mjs +57 -0
  263. package/js/examples/test-auto-start-fix.mjs +95 -0
  264. package/js/examples/test-baseline-sigint.mjs +38 -0
  265. package/js/examples/test-buffer-behavior.mjs +39 -0
  266. package/js/examples/test-buffers-simple.mjs +35 -0
  267. package/js/examples/test-bun-specific-issue.mjs +106 -0
  268. package/js/examples/test-bun-streaming.mjs +81 -0
  269. package/js/examples/test-cat-direct.mjs +41 -0
  270. package/js/examples/test-cat-pipe.mjs +34 -0
  271. package/js/examples/test-cd-behavior.mjs +42 -0
  272. package/js/examples/test-child-process-timing.mjs +53 -0
  273. package/js/examples/test-child-sigint-handler.mjs +62 -0
  274. package/js/examples/test-cleanup-simple.mjs +21 -0
  275. package/js/examples/test-comprehensive-tracing.mjs +58 -0
  276. package/js/examples/test-correct-space-handling.mjs +46 -0
  277. package/js/examples/test-ctrl-c-debug.mjs +44 -0
  278. package/js/examples/test-ctrl-c-inherit.mjs +30 -0
  279. package/js/examples/test-ctrl-c-sleep.mjs +31 -0
  280. package/js/examples/test-ctrl-c.mjs +17 -0
  281. package/js/examples/test-debug-new-options.mjs +55 -0
  282. package/js/examples/test-debug-pty.mjs +49 -0
  283. package/js/examples/test-debug-tee.mjs +38 -0
  284. package/js/examples/test-debug.mjs +25 -0
  285. package/js/examples/test-direct-jq.mjs +47 -0
  286. package/js/examples/test-direct-pipe-reading.mjs +119 -0
  287. package/js/examples/test-direct-pipe.sh +28 -0
  288. package/js/examples/test-double-quoting-prevention.mjs +138 -0
  289. package/js/examples/test-edge-cases-quoting.mjs +89 -0
  290. package/js/examples/test-events.mjs +37 -0
  291. package/js/examples/test-explicit-stdio.mjs +51 -0
  292. package/js/examples/test-final-streaming.mjs +71 -0
  293. package/js/examples/test-fix.mjs +71 -0
  294. package/js/examples/test-incremental-streaming.mjs +46 -0
  295. package/js/examples/test-individual-spawn.mjs +35 -0
  296. package/js/examples/test-inherit-stdout-not-stdin.mjs +133 -0
  297. package/js/examples/test-injection-protection.mjs +77 -0
  298. package/js/examples/test-interactive-streaming.mjs +140 -0
  299. package/js/examples/test-interactive-top.md +24 -0
  300. package/js/examples/test-interactive.mjs +17 -0
  301. package/js/examples/test-interpolation.mjs +14 -0
  302. package/js/examples/test-interrupt.mjs +40 -0
  303. package/js/examples/test-issue-135-comprehensive.mjs +41 -0
  304. package/js/examples/test-issue12-detailed.mjs +89 -0
  305. package/js/examples/test-issue12-exact.mjs +33 -0
  306. package/js/examples/test-jq-color.mjs +57 -0
  307. package/js/examples/test-jq-colors.mjs +41 -0
  308. package/js/examples/test-jq-compact.mjs +33 -0
  309. package/js/examples/test-jq-native.sh +10 -0
  310. package/js/examples/test-jq-pipeline-behavior.mjs +80 -0
  311. package/js/examples/test-jq-realtime.mjs +40 -0
  312. package/js/examples/test-manual-start.mjs +54 -0
  313. package/js/examples/test-mixed-quoting.mjs +88 -0
  314. package/js/examples/test-multi-stream.mjs +50 -0
  315. package/js/examples/test-multistage-debug.mjs +44 -0
  316. package/js/examples/test-native-spawn-vs-command-stream.mjs +154 -0
  317. package/js/examples/test-no-parse-pipeline.mjs +33 -0
  318. package/js/examples/test-non-virtual.mjs +52 -0
  319. package/js/examples/test-operators.mjs +53 -0
  320. package/js/examples/test-parent-continues.mjs +44 -0
  321. package/js/examples/test-path-interpolation.mjs +86 -0
  322. package/js/examples/test-ping-kill-and-stdin.mjs +98 -0
  323. package/js/examples/test-ping.mjs +12 -0
  324. package/js/examples/test-pty-spawn.mjs +101 -0
  325. package/js/examples/test-pty.mjs +38 -0
  326. package/js/examples/test-quote-behavior-summary.mjs +110 -0
  327. package/js/examples/test-quote-edge-cases.mjs +69 -0
  328. package/js/examples/test-quote-parsing.mjs +23 -0
  329. package/js/examples/test-raw-function.mjs +153 -0
  330. package/js/examples/test-raw-streaming.mjs +47 -0
  331. package/js/examples/test-readme-examples.mjs +142 -0
  332. package/js/examples/test-real-cat.mjs +28 -0
  333. package/js/examples/test-real-commands.mjs +21 -0
  334. package/js/examples/test-real-shell.mjs +31 -0
  335. package/js/examples/test-real-stdin-commands.mjs +160 -0
  336. package/js/examples/test-runner-batched.mjs +98 -0
  337. package/js/examples/test-runner-simple.mjs +80 -0
  338. package/js/examples/test-runner.mjs +67 -0
  339. package/js/examples/test-scope-parse.mjs +31 -0
  340. package/js/examples/test-sh-pipeline.mjs +24 -0
  341. package/js/examples/test-shell-detection.mjs +71 -0
  342. package/js/examples/test-shell-parser.mjs +37 -0
  343. package/js/examples/test-sigint-behavior.mjs +241 -0
  344. package/js/examples/test-sigint-handling.sh +14 -0
  345. package/js/examples/test-simple-pipe.mjs +12 -0
  346. package/js/examples/test-simple-streaming.mjs +32 -0
  347. package/js/examples/test-sleep-stdin.js +27 -0
  348. package/js/examples/test-sleep.mjs +56 -0
  349. package/js/examples/test-smart-quoting.mjs +180 -0
  350. package/js/examples/test-spaces-in-path.mjs +48 -0
  351. package/js/examples/test-special-chars-quoting.mjs +54 -0
  352. package/js/examples/test-stdin-after-start.mjs +39 -0
  353. package/js/examples/test-stdin-simple.mjs +67 -0
  354. package/js/examples/test-stdin-timing.mjs +74 -0
  355. package/js/examples/test-stdio-combinations.mjs +124 -0
  356. package/js/examples/test-stream-access.mjs +84 -0
  357. package/js/examples/test-stream-cleanup.mjs +27 -0
  358. package/js/examples/test-stream-readers.mjs +152 -0
  359. package/js/examples/test-streaming-final.mjs +57 -0
  360. package/js/examples/test-streaming-interfaces.mjs +141 -0
  361. package/js/examples/test-streaming-timing.mjs +27 -0
  362. package/js/examples/test-streaming.mjs +32 -0
  363. package/js/examples/test-streams-stdin-comprehensive.mjs +134 -0
  364. package/js/examples/test-streams-stdin-ctrl-c.mjs +96 -0
  365. package/js/examples/test-template-literal.mjs +26 -0
  366. package/js/examples/test-template-vs-interpolation.mjs +49 -0
  367. package/js/examples/test-timing.mjs +41 -0
  368. package/js/examples/test-top-inherit-stdout-stdin-control.mjs +123 -0
  369. package/js/examples/test-top-quit-stdin.mjs +118 -0
  370. package/js/examples/test-trace-option.mjs +21 -0
  371. package/js/examples/test-user-double-quotes.mjs +36 -0
  372. package/js/examples/test-user-single-quotes.mjs +36 -0
  373. package/js/examples/test-verbose.mjs +18 -0
  374. package/js/examples/test-verbose2.mjs +32 -0
  375. package/js/examples/test-virtual-streaming.mjs +125 -0
  376. package/js/examples/test-waiting-command.mjs +52 -0
  377. package/js/examples/test-waiting-commands.mjs +83 -0
  378. package/js/examples/test-watch-mode.mjs +104 -0
  379. package/js/examples/test-yes-cancellation.mjs +26 -0
  380. package/js/examples/test-yes-detailed.mjs +58 -0
  381. package/js/examples/test-yes-trace.mjs +28 -0
  382. package/js/examples/trace-abort-controller.mjs +30 -0
  383. package/js/examples/trace-error-handling.mjs +22 -0
  384. package/js/examples/trace-pipeline-command.mjs +22 -0
  385. package/js/examples/trace-signal-handling.mjs +35 -0
  386. package/js/examples/trace-simple-command.mjs +18 -0
  387. package/js/examples/trace-stderr-output.mjs +22 -0
  388. package/js/examples/verify-fix-both-runtimes.mjs +73 -0
  389. package/js/examples/verify-issue12-fixed.mjs +78 -0
  390. package/js/examples/which-command-common-commands.mjs +19 -0
  391. package/js/examples/which-command-gh-test.mjs +23 -0
  392. package/js/examples/which-command-nonexistent.mjs +20 -0
  393. package/js/examples/which-command-system-comparison.mjs +28 -0
  394. package/js/examples/working-example.mjs +13 -0
  395. package/js/examples/working-stdin-examples.mjs +138 -0
  396. package/js/examples/working-streaming-demo.mjs +49 -0
  397. package/{src → js/src}/$.mjs +20 -4
  398. package/{src → js/src}/$.utils.mjs +14 -2
  399. package/js/tests/$.features.test.mjs +283 -0
  400. package/js/tests/$.test.mjs +935 -0
  401. package/js/tests/builtin-commands.test.mjs +387 -0
  402. package/js/tests/bun-shell-path-fix.test.mjs +115 -0
  403. package/js/tests/bun.features.test.mjs +189 -0
  404. package/js/tests/cd-virtual-command.test.mjs +622 -0
  405. package/js/tests/cleanup-verification.test.mjs +127 -0
  406. package/js/tests/ctrl-c-baseline.test.mjs +207 -0
  407. package/js/tests/ctrl-c-basic.test.mjs +220 -0
  408. package/js/tests/ctrl-c-library.test.mjs +197 -0
  409. package/js/tests/ctrl-c-signal.test.mjs +915 -0
  410. package/js/tests/examples.test.mjs +252 -0
  411. package/js/tests/execa.features.test.mjs +198 -0
  412. package/js/tests/gh-commands.test.mjs +164 -0
  413. package/js/tests/gh-gist-operations.test.mjs +221 -0
  414. package/js/tests/git-gh-cd.test.mjs +466 -0
  415. package/js/tests/interactive-option.test.mjs +114 -0
  416. package/js/tests/interactive-streaming.test.mjs +307 -0
  417. package/js/tests/issue-135-final.test.mjs +58 -0
  418. package/js/tests/jq-color-behavior.test.mjs +140 -0
  419. package/js/tests/jq.test.mjs +318 -0
  420. package/js/tests/options-examples.test.mjs +106 -0
  421. package/js/tests/options-syntax.test.mjs +112 -0
  422. package/js/tests/path-interpolation.test.mjs +412 -0
  423. package/js/tests/pipe.test.mjs +291 -0
  424. package/js/tests/raw-function.test.mjs +266 -0
  425. package/js/tests/readme-examples.test.mjs +427 -0
  426. package/js/tests/resource-cleanup-internals.test.mjs +669 -0
  427. package/js/tests/shell-settings.test.mjs +279 -0
  428. package/js/tests/sigint-cleanup-isolated.test.mjs +151 -0
  429. package/js/tests/sigint-cleanup.test.mjs +118 -0
  430. package/js/tests/start-run-edge-cases.test.mjs +152 -0
  431. package/js/tests/start-run-options.test.mjs +181 -0
  432. package/js/tests/stderr-output-handling.test.mjs +279 -0
  433. package/js/tests/streaming-interfaces.test.mjs +194 -0
  434. package/js/tests/sync.test.mjs +297 -0
  435. package/js/tests/system-pipe.test.mjs +226 -0
  436. package/js/tests/test-cleanup.mjs +200 -0
  437. package/js/tests/test-helper-fixed.mjs +148 -0
  438. package/js/tests/test-helper-v2.mjs +118 -0
  439. package/js/tests/test-helper.mjs +171 -0
  440. package/js/tests/test-sigint-child.js +15 -0
  441. package/js/tests/text-method.test.mjs +225 -0
  442. package/js/tests/virtual.test.mjs +364 -0
  443. package/js/tests/yes-command-cleanup.test.mjs +208 -0
  444. package/js/tests/zx.features.test.mjs +233 -0
  445. package/package.json +13 -12
  446. package/rust/Cargo.lock +947 -0
  447. package/rust/Cargo.toml +47 -0
  448. package/rust/src/commands/basename.rs +69 -0
  449. package/rust/src/commands/cat.rs +123 -0
  450. package/rust/src/commands/cd.rs +67 -0
  451. package/rust/src/commands/cp.rs +187 -0
  452. package/rust/src/commands/dirname.rs +57 -0
  453. package/rust/src/commands/echo.rs +73 -0
  454. package/rust/src/commands/env.rs +33 -0
  455. package/rust/src/commands/exit.rs +36 -0
  456. package/rust/src/commands/false.rs +24 -0
  457. package/rust/src/commands/ls.rs +182 -0
  458. package/rust/src/commands/mkdir.rs +98 -0
  459. package/rust/src/commands/mod.rs +200 -0
  460. package/rust/src/commands/mv.rs +180 -0
  461. package/rust/src/commands/pwd.rs +28 -0
  462. package/rust/src/commands/rm.rs +150 -0
  463. package/rust/src/commands/seq.rs +179 -0
  464. package/rust/src/commands/sleep.rs +97 -0
  465. package/rust/src/commands/test.rs +204 -0
  466. package/rust/src/commands/touch.rs +99 -0
  467. package/rust/src/commands/true.rs +24 -0
  468. package/rust/src/commands/which.rs +87 -0
  469. package/rust/src/commands/yes.rs +99 -0
  470. package/rust/src/lib.rs +492 -0
  471. package/rust/src/main.rs +37 -0
  472. package/rust/src/shell_parser.rs +565 -0
  473. package/rust/src/utils.rs +335 -0
  474. package/rust/tests/builtin_commands.rs +549 -0
  475. package/rust/tests/process_runner.rs +286 -0
  476. package/rust/tests/shell_parser.rs +296 -0
  477. package/rust/tests/utils.rs +282 -0
  478. package/rust/tests/virtual_commands.rs +199 -0
  479. /package/{src → js/src}/commands/$.basename.mjs +0 -0
  480. /package/{src → js/src}/commands/$.cat.mjs +0 -0
  481. /package/{src → js/src}/commands/$.cd.mjs +0 -0
  482. /package/{src → js/src}/commands/$.cp.mjs +0 -0
  483. /package/{src → js/src}/commands/$.dirname.mjs +0 -0
  484. /package/{src → js/src}/commands/$.echo.mjs +0 -0
  485. /package/{src → js/src}/commands/$.env.mjs +0 -0
  486. /package/{src → js/src}/commands/$.exit.mjs +0 -0
  487. /package/{src → js/src}/commands/$.false.mjs +0 -0
  488. /package/{src → js/src}/commands/$.ls.mjs +0 -0
  489. /package/{src → js/src}/commands/$.mkdir.mjs +0 -0
  490. /package/{src → js/src}/commands/$.mv.mjs +0 -0
  491. /package/{src → js/src}/commands/$.pwd.mjs +0 -0
  492. /package/{src → js/src}/commands/$.rm.mjs +0 -0
  493. /package/{src → js/src}/commands/$.seq.mjs +0 -0
  494. /package/{src → js/src}/commands/$.sleep.mjs +0 -0
  495. /package/{src → js/src}/commands/$.test.mjs +0 -0
  496. /package/{src → js/src}/commands/$.touch.mjs +0 -0
  497. /package/{src → js/src}/commands/$.true.mjs +0 -0
  498. /package/{src → js/src}/commands/$.which.mjs +0 -0
  499. /package/{src → js/src}/commands/$.yes.mjs +0 -0
  500. /package/{src → js/src}/shell-parser.mjs +0 -0
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Final working examples of streaming interfaces for README
5
+ */
6
+
7
+ import { $ } from '../src/$.mjs';
8
+
9
+ console.log('šŸš€ Final Working Examples - Streaming Interfaces');
10
+ console.log('='.repeat(55));
11
+
12
+ async function finalWorkingExamples() {
13
+ try {
14
+ console.log('\\nšŸ“ EXAMPLE 1: Send data via streams.stdin');
15
+ console.log('─'.repeat(30));
16
+
17
+ // Create a simple echo script that waits for input
18
+ const echoCmd = $`node -e "process.stdin.pipe(process.stdout)"`;
19
+ const stdin = await echoCmd.streams.stdin;
20
+
21
+ if (stdin) {
22
+ stdin.write('Hello from stdin!\\n');
23
+ stdin.write('Multiple lines work!\\n');
24
+ stdin.end();
25
+ }
26
+
27
+ const result = await echoCmd;
28
+ console.log('āœ… Output:', JSON.stringify(result.stdout));
29
+
30
+ console.log('\\nšŸ”§ EXAMPLE 2: Filter data with grep');
31
+ console.log('─'.repeat(30));
32
+
33
+ const grepCmd = $`grep "important"`;
34
+ const grepStdin = await grepCmd.streams.stdin;
35
+
36
+ if (grepStdin) {
37
+ grepStdin.write('ignore this line\\n');
38
+ grepStdin.write('important message 1\\n');
39
+ grepStdin.write('skip this too\\n');
40
+ grepStdin.write('another important note\\n');
41
+ grepStdin.end();
42
+ }
43
+
44
+ const grepResult = await grepCmd;
45
+ console.log('āœ… Filtered output:', JSON.stringify(grepResult.stdout));
46
+
47
+ console.log('\\nšŸ“Š EXAMPLE 3: Sort data via stdin');
48
+ console.log('─'.repeat(30));
49
+
50
+ const sortCmd = $`sort`;
51
+ const sortStdin = await sortCmd.streams.stdin;
52
+
53
+ if (sortStdin) {
54
+ sortStdin.write('zebra\\n');
55
+ sortStdin.write('apple\\n');
56
+ sortStdin.write('banana\\n');
57
+ sortStdin.write('cherry\\n');
58
+ sortStdin.end();
59
+ }
60
+
61
+ const sortResult = await sortCmd;
62
+ console.log('āœ… Sorted output:', JSON.stringify(sortResult.stdout));
63
+
64
+ console.log('\\n🧮 EXAMPLE 4: Calculator with bc');
65
+ console.log('─'.repeat(30));
66
+
67
+ const calcCmd = $`bc -l`;
68
+ const calcStdin = await calcCmd.streams.stdin;
69
+
70
+ if (calcStdin) {
71
+ calcStdin.write('scale=2\\n'); // Set decimal precision
72
+ calcStdin.write('10 / 3\\n'); // Division
73
+ calcStdin.write('sqrt(16)\\n'); // Square root
74
+ calcStdin.write('quit\\n'); // Exit
75
+ }
76
+
77
+ const calcResult = await calcCmd;
78
+ console.log(
79
+ 'āœ… Calculation results:',
80
+ JSON.stringify(calcResult.stdout.trim())
81
+ );
82
+
83
+ console.log('\\nšŸ”„ EXAMPLE 5: Text transformation with tr');
84
+ console.log('─'.repeat(30));
85
+
86
+ const trCmd = $`tr 'a-z' 'A-Z'`; // Convert to uppercase
87
+ const trStdin = await trCmd.streams.stdin;
88
+
89
+ if (trStdin) {
90
+ trStdin.write('hello world\\n');
91
+ trStdin.write('this is lowercase text\\n');
92
+ trStdin.end();
93
+ }
94
+
95
+ const trResult = await trCmd;
96
+ console.log('āœ… Transformed text:', JSON.stringify(trResult.stdout));
97
+
98
+ console.log(
99
+ '\\n⚔ EXAMPLE 6: Process control - kill() for commands that ignore stdin'
100
+ );
101
+ console.log('─'.repeat(30));
102
+
103
+ const pingCmd = $`ping -c 10 8.8.8.8`; // Long ping
104
+
105
+ // Try stdin (will be ignored by ping)
106
+ setTimeout(async () => {
107
+ const pingStdin = await pingCmd.streams.stdin;
108
+ if (pingStdin) {
109
+ pingStdin.write('q\\n');
110
+ pingStdin.end();
111
+ console.log(' šŸ“ Sent "q" to ping (will be ignored)');
112
+ }
113
+ }, 500);
114
+
115
+ // Use kill() since ping ignores stdin
116
+ setTimeout(() => {
117
+ console.log(' šŸ”Ŗ Using kill() method to stop ping...');
118
+ pingCmd.kill();
119
+ }, 1500);
120
+
121
+ const pingResult = await pingCmd;
122
+ console.log('āœ… Ping stopped with exit code:', pingResult.code);
123
+ console.log(
124
+ 'āœ… Captured',
125
+ pingResult.stdout.length,
126
+ 'characters of output'
127
+ );
128
+
129
+ console.log('\\nšŸŽÆ EXAMPLE 7: Mixed stdout/stderr handling');
130
+ console.log('─'.repeat(30));
131
+
132
+ const mixedCmd = $`sh -c 'echo "stdout message" && echo "stderr message" >&2'`;
133
+
134
+ const [stdout, stderr] = await Promise.all([
135
+ mixedCmd.strings.stdout,
136
+ mixedCmd.strings.stderr,
137
+ ]);
138
+
139
+ console.log('āœ… Stdout:', JSON.stringify(stdout.trim()));
140
+ console.log('āœ… Stderr:', JSON.stringify(stderr.trim()));
141
+
142
+ console.log(`\\n${'='.repeat(55)}`);
143
+ console.log('šŸŽ‰ ALL STREAMING EXAMPLES COMPLETED SUCCESSFULLY!');
144
+ console.log('\\nšŸ“‹ Key Takeaways:');
145
+ console.log(
146
+ ' āœ… await cmd.streams.stdin - Send data to interactive commands'
147
+ );
148
+ console.log(' āœ… await cmd.buffers.stdout - Get binary data');
149
+ console.log(' āœ… await cmd.strings.stderr - Get text data');
150
+ console.log(
151
+ ' āœ… cmd.kill() - Stop processes that ignore stdin'
152
+ );
153
+ console.log(' āœ… Works with: grep, sort, bc, tr, node, python, etc.');
154
+ console.log(' āœ… Network commands (ping) need kill(), not stdin');
155
+ } catch (error) {
156
+ console.log('\\nāŒ ERROR:', error.message);
157
+ console.error(error.stack);
158
+ process.exit(1);
159
+ }
160
+ }
161
+
162
+ finalWorkingExamples();
@@ -0,0 +1,103 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+
5
+ console.log('Testing gh auth status with $.mjs\n');
6
+
7
+ // Test 1: Basic gh auth status with capture
8
+ console.log('Test 1: Using .run() with capture');
9
+ try {
10
+ const result = await $`gh auth status`.run({ capture: true, mirror: false });
11
+ console.log('Exit code:', result.code);
12
+ console.log('Stdout length:', result.stdout.length);
13
+ console.log('Stderr length:', result.stderr.length);
14
+ console.log('Success: gh auth check passed\n');
15
+ } catch (error) {
16
+ console.log('Error with .run():', error.message);
17
+ console.log('Exit code:', error.code);
18
+ console.log('Stdout:', error.stdout);
19
+ console.log('Stderr:', error.stderr);
20
+ }
21
+
22
+ // Test 2: Using await directly
23
+ console.log('Test 2: Using await directly');
24
+ try {
25
+ const result = await $`gh auth status`;
26
+ console.log('Exit code:', result.code);
27
+ console.log('Success: gh auth check passed\n');
28
+ } catch (error) {
29
+ console.log('Error with await:', error.message);
30
+ }
31
+
32
+ // Test 3: Check with 2>&1 redirection
33
+ console.log('Test 3: Using 2>&1 redirection');
34
+ try {
35
+ const result = await $`gh auth status 2>&1`.run({
36
+ capture: true,
37
+ mirror: false,
38
+ });
39
+ console.log('Exit code:', result.code);
40
+ console.log('Combined output length:', result.stdout.length);
41
+ console.log('Success: gh auth check passed\n');
42
+ } catch (error) {
43
+ console.log('Error with redirection:', error.message);
44
+ }
45
+
46
+ // Test 4: Using streaming
47
+ console.log('Test 4: Using streaming');
48
+ try {
49
+ const cmd = $`gh auth status`;
50
+ let outputReceived = false;
51
+
52
+ for await (const chunk of cmd.stream()) {
53
+ outputReceived = true;
54
+ console.log(
55
+ `Received ${chunk.type}: ${chunk.data.toString().slice(0, 50)}...`
56
+ );
57
+ }
58
+
59
+ const result = await cmd;
60
+ console.log('Exit code:', result.code);
61
+ console.log('Stream output received:', outputReceived);
62
+ console.log('Success: gh auth check passed\n');
63
+ } catch (error) {
64
+ console.log('Error with streaming:', error.message);
65
+ }
66
+
67
+ // Test 5: Check actual authentication status
68
+ console.log('Test 5: Parse auth status');
69
+ try {
70
+ const result = await $`gh auth status 2>&1`.run({
71
+ capture: true,
72
+ mirror: false,
73
+ });
74
+
75
+ // Check if output contains success indicators
76
+ const output = result.stdout + result.stderr;
77
+ const isAuthenticated =
78
+ output.includes('Logged in to') || output.includes('āœ“');
79
+
80
+ console.log('Is authenticated:', isAuthenticated);
81
+
82
+ if (isAuthenticated) {
83
+ // Try to extract username
84
+ const usernameMatch = output.match(/account\s+(\S+)/);
85
+ if (usernameMatch) {
86
+ console.log('GitHub username:', usernameMatch[1]);
87
+ }
88
+ }
89
+
90
+ // The command might exit with 0 even when not authenticated (just showing status)
91
+ // or exit with 1 when not authenticated
92
+ console.log('Raw exit code:', result.code);
93
+ } catch (error) {
94
+ console.log('Failed to check auth status:', error.message);
95
+ console.log('This might mean gh is not authenticated');
96
+ }
97
+
98
+ console.log('\n--- Summary ---');
99
+ console.log('gh auth status behavior:');
100
+ console.log('- Exit code 0: gh CLI is installed and can show status');
101
+ console.log('- Exit code 1: Usually means not authenticated');
102
+ console.log('- Output goes to stderr by default (not stdout)');
103
+ console.log('- Use 2>&1 to capture the status output');
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+ import { promises as fs } from 'fs';
5
+ import path from 'path';
6
+ import os from 'os';
7
+
8
+ console.log('=== Testing gh gist delete hanging scenario ===\n');
9
+
10
+ // First create a gist to delete
11
+ const tempFile = path.join(os.tmpdir(), 'delete-hang-test.txt');
12
+ await fs.writeFile(tempFile, 'Test content for deletion\n');
13
+
14
+ console.log('Creating a gist to test deletion...');
15
+ const createResult =
16
+ await $`gh gist create ${tempFile} --desc "delete-test" --public=false 2>&1`.run(
17
+ {
18
+ capture: true,
19
+ mirror: false,
20
+ }
21
+ );
22
+
23
+ const lines = createResult.stdout.trim().split('\n');
24
+ const gistUrl = lines.find((line) => line.includes('gist.github.com'));
25
+ if (!gistUrl) {
26
+ console.error('Failed to create test gist');
27
+ process.exit(1);
28
+ }
29
+
30
+ const gistId = gistUrl.split('/').pop();
31
+ console.log('Created gist:', gistId);
32
+
33
+ console.log('\nNow testing deletion that might hang...');
34
+ console.log('Using the pattern from the original test:\n');
35
+
36
+ // This is the pattern that was in the original test
37
+ async function deleteGist(gistId) {
38
+ console.log('šŸ—‘ļø Deleting the test gist...');
39
+
40
+ try {
41
+ const deleteResult = await $`gh gist delete ${gistId} --yes`.run({
42
+ capture: true,
43
+ mirror: false,
44
+ });
45
+ console.log(' - Exit code:', deleteResult.code);
46
+ console.log(' - āœ… Gist deleted successfully');
47
+ return true;
48
+ } catch (error) {
49
+ console.log(' āŒ Failed to delete:', error.message);
50
+ return false;
51
+ }
52
+ }
53
+
54
+ // Call the delete function
55
+ const startTime = Date.now();
56
+ await deleteGist(gistId);
57
+ const deleteTime = Date.now() - startTime;
58
+ console.log(`Delete completed in ${deleteTime}ms`);
59
+
60
+ // Now try to verify it's gone (this is where it might hang)
61
+ console.log('\nāœ… Verifying deletion...');
62
+ const verifyStart = Date.now();
63
+
64
+ try {
65
+ console.log('Running gh gist view (this might hang)...');
66
+ await $`gh gist view ${gistId}`.run({ capture: true, mirror: false });
67
+ console.log(' āŒ Gist still exists!');
68
+ } catch (error) {
69
+ console.log(' āœ… Confirmed: gist no longer exists');
70
+ console.log(' Error code:', error.code);
71
+ }
72
+
73
+ const verifyTime = Date.now() - verifyStart;
74
+ console.log(`Verification completed in ${verifyTime}ms`);
75
+
76
+ // Clean up
77
+ await fs.unlink(tempFile).catch(() => {});
78
+
79
+ console.log('\n=== Test completed without hanging ===');
@@ -0,0 +1,276 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+ import { promises as fs } from 'fs';
5
+ import path from 'path';
6
+ import os from 'os';
7
+
8
+ console.log('=== Testing Secret Gist Creation with $.mjs ===\n');
9
+
10
+ const TEST_GIST_DESC = 'test-gist-from-command-stream';
11
+ const TEST_FILE_CONTENT =
12
+ '# Test Gist\n\nThis is a test gist created by command-stream $.mjs library.\n';
13
+
14
+ async function cleanup() {
15
+ // Clean up any existing test gists
16
+ console.log('🧹 Cleaning up any existing test gists...');
17
+ try {
18
+ const listResult =
19
+ await $`gh api /gists --jq '.[] | select(.description == "${TEST_GIST_DESC}") | .id'`.run(
20
+ { capture: true, mirror: false }
21
+ );
22
+ const gistIds = listResult.stdout
23
+ .trim()
24
+ .split('\n')
25
+ .filter((id) => id);
26
+
27
+ for (const gistId of gistIds) {
28
+ if (gistId) {
29
+ console.log(` Deleting old test gist: ${gistId}`);
30
+ await $`gh gist delete ${gistId} --yes`.run({
31
+ capture: true,
32
+ mirror: false,
33
+ });
34
+ }
35
+ }
36
+ } catch (error) {
37
+ console.log(' No existing test gists to clean up');
38
+ }
39
+ }
40
+
41
+ async function createGist() {
42
+ console.log('\nšŸ“ Creating a secret gist...');
43
+
44
+ // Create temp file
45
+ const tempFile = path.join(os.tmpdir(), 'test-gist-content.md');
46
+ await fs.writeFile(tempFile, TEST_FILE_CONTENT);
47
+
48
+ try {
49
+ // Create secret gist - use 2>&1 to capture all output
50
+ console.log(' Running: gh gist create with file:', tempFile);
51
+ const createResult =
52
+ await $`gh gist create ${tempFile} --desc "${TEST_GIST_DESC}" --public=false 2>&1`.run(
53
+ {
54
+ capture: true,
55
+ mirror: false,
56
+ timeout: 10000, // 10 second timeout
57
+ }
58
+ );
59
+
60
+ console.log(' Exit code:', createResult.code);
61
+ console.log(' Output:', createResult.stdout.trim());
62
+
63
+ if (createResult.code !== 0) {
64
+ throw new Error(`Failed to create gist. Exit code: ${createResult.code}`);
65
+ }
66
+
67
+ // Extract gist ID from URL (last line should be the URL)
68
+ const outputLines = createResult.stdout.trim().split('\n');
69
+ const gistUrl =
70
+ outputLines.find((line) => line.includes('gist.github.com')) ||
71
+ outputLines[outputLines.length - 1];
72
+
73
+ if (!gistUrl || !gistUrl.includes('gist.github.com')) {
74
+ throw new Error(`Invalid gist URL returned: ${gistUrl}`);
75
+ }
76
+
77
+ const gistId = gistUrl.split('/').pop();
78
+
79
+ console.log(' āœ… Gist created with ID:', gistId);
80
+
81
+ // Clean up temp file
82
+ await fs.unlink(tempFile);
83
+
84
+ return gistId;
85
+ } catch (error) {
86
+ await fs.unlink(tempFile).catch(() => {});
87
+ throw error;
88
+ }
89
+ }
90
+
91
+ async function verifyGistExists(gistId) {
92
+ console.log('\nšŸ” Verifying gist exists...');
93
+
94
+ // Method 1: Using gh gist view
95
+ try {
96
+ const viewResult = await $`gh gist view ${gistId} --files`.run({
97
+ capture: true,
98
+ mirror: false,
99
+ });
100
+ console.log(' Method 1 (gh gist view):');
101
+ console.log(' - Exit code:', viewResult.code);
102
+ console.log(' - Files found:', viewResult.stdout.trim());
103
+ console.log(' - āœ… Gist exists and is accessible');
104
+ } catch (error) {
105
+ console.log(' āŒ Method 1 failed:', error.message);
106
+ }
107
+
108
+ // Method 2: Using gh api
109
+ try {
110
+ const apiResult = await $`gh api /gists/${gistId} --jq '.description'`.run({
111
+ capture: true,
112
+ mirror: false,
113
+ });
114
+ console.log(' Method 2 (gh api):');
115
+ console.log(' - Exit code:', apiResult.code);
116
+ console.log(' - Description:', apiResult.stdout.trim());
117
+ console.log(' - āœ… Confirmed via API');
118
+ } catch (error) {
119
+ console.log(' āŒ Method 2 failed:', error.message);
120
+ }
121
+
122
+ // Method 3: Check if it's secret
123
+ try {
124
+ const secretResult = await $`gh api /gists/${gistId} --jq '.public'`.run({
125
+ capture: true,
126
+ mirror: false,
127
+ });
128
+ const isPublic = secretResult.stdout.trim() === 'true';
129
+ console.log(' Method 3 (check privacy):');
130
+ console.log(' - Is public:', isPublic);
131
+ console.log(' - Is secret:', !isPublic);
132
+ console.log(
133
+ ' -',
134
+ !isPublic ? 'āœ… Confirmed as secret gist' : 'āŒ Not a secret gist'
135
+ );
136
+ } catch (error) {
137
+ console.log(' āŒ Method 3 failed:', error.message);
138
+ }
139
+ }
140
+
141
+ async function findGistByDescription() {
142
+ console.log('\nšŸ”Ž Finding gist by description...');
143
+
144
+ try {
145
+ // Use jq to filter gists by description
146
+ const findResult =
147
+ await $`gh api /gists --jq '.[] | select(.description == "${TEST_GIST_DESC}") | .id + " " + .description' | head -1`.run(
148
+ { capture: true, mirror: false }
149
+ );
150
+
151
+ if (findResult.stdout.trim()) {
152
+ const [id, desc] = findResult.stdout.trim().split(' ');
153
+ console.log(' - Found gist ID:', id);
154
+ console.log(' - Description:', desc || TEST_GIST_DESC);
155
+ console.log(' - āœ… Successfully found by description');
156
+ return id;
157
+ } else {
158
+ console.log(' - āŒ No gist found with that description');
159
+ return null;
160
+ }
161
+ } catch (error) {
162
+ console.log(' āŒ Error finding gist:', error.message);
163
+ return null;
164
+ }
165
+ }
166
+
167
+ async function addFileToGist(gistId) {
168
+ console.log('\nšŸ“Ž Adding another file to the gist...');
169
+
170
+ const tempFile2 = path.join(os.tmpdir(), 'additional-file.txt');
171
+ await fs.writeFile(
172
+ tempFile2,
173
+ 'This is an additional file added to the gist.\n'
174
+ );
175
+
176
+ try {
177
+ const editResult =
178
+ await $`gh gist edit ${gistId} ${tempFile2} --filename "added-file.txt"`.run(
179
+ { capture: true, mirror: false }
180
+ );
181
+ console.log(' - Exit code:', editResult.code);
182
+ console.log(' - āœ… File added successfully');
183
+
184
+ // Verify the file was added
185
+ const filesResult = await $`gh gist view ${gistId} --files`.run({
186
+ capture: true,
187
+ mirror: false,
188
+ });
189
+ console.log(' - Files in gist:', filesResult.stdout.trim());
190
+
191
+ await fs.unlink(tempFile2);
192
+ return true;
193
+ } catch (error) {
194
+ await fs.unlink(tempFile2).catch(() => {});
195
+ console.log(' āŒ Failed to add file:', error.message);
196
+ return false;
197
+ }
198
+ }
199
+
200
+ async function deleteGist(gistId) {
201
+ console.log('\nšŸ—‘ļø Deleting the test gist...');
202
+
203
+ try {
204
+ const deleteResult = await $`gh gist delete ${gistId} --yes`.run({
205
+ capture: true,
206
+ mirror: false,
207
+ });
208
+ console.log(' - Exit code:', deleteResult.code);
209
+ console.log(' - āœ… Gist deleted successfully');
210
+ return true;
211
+ } catch (error) {
212
+ console.log(' āŒ Failed to delete:', error.message);
213
+ return false;
214
+ }
215
+ }
216
+
217
+ // Main test flow
218
+ async function runTests() {
219
+ try {
220
+ // Check authentication first
221
+ console.log('šŸ” Checking GitHub authentication...');
222
+ const authResult = await $`gh auth status`.run({
223
+ capture: true,
224
+ mirror: false,
225
+ });
226
+ if (authResult.code !== 0) {
227
+ console.error(
228
+ 'āŒ Not authenticated to GitHub. Please run: gh auth login'
229
+ );
230
+ process.exit(1);
231
+ }
232
+ console.log(' āœ… Authenticated\n');
233
+
234
+ // Clean up any existing test gists
235
+ await cleanup();
236
+
237
+ // Create a secret gist
238
+ const gistId = await createGist();
239
+
240
+ // Verify it exists
241
+ await verifyGistExists(gistId);
242
+
243
+ // Find it by description
244
+ const foundId = await findGistByDescription();
245
+ console.log(' - IDs match:', foundId === gistId ? 'āœ… Yes' : 'āŒ No');
246
+
247
+ // Add a file to it
248
+ await addFileToGist(gistId);
249
+
250
+ // Delete it
251
+ await deleteGist(gistId);
252
+
253
+ // Verify it's gone
254
+ console.log('\nāœ… Verifying deletion...');
255
+ try {
256
+ await $`gh gist view ${gistId}`.run({ capture: true, mirror: false });
257
+ console.log(' āŒ Gist still exists!');
258
+ } catch (error) {
259
+ console.log(' āœ… Confirmed: gist no longer exists');
260
+ }
261
+
262
+ console.log('\n=== Summary ===');
263
+ console.log(
264
+ 'āœ… Successfully created, verified, modified, and deleted a secret gist'
265
+ );
266
+ console.log('āœ… All operations work correctly with $.mjs');
267
+ console.log('āœ… Exit codes are properly captured');
268
+ console.log('āœ… Output is correctly captured in stdout');
269
+ } catch (error) {
270
+ console.error('\nāŒ Test failed:', error.message);
271
+ process.exit(1);
272
+ }
273
+ }
274
+
275
+ // Run the tests
276
+ runTests();
@@ -0,0 +1,89 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { $ } from '../src/$.mjs';
4
+ import fs from 'fs/promises';
5
+
6
+ console.log('=== Minimal gh gist create test ===\n');
7
+
8
+ // Create a test file
9
+ const testFile = '/tmp/test-minimal.txt';
10
+ await fs.writeFile(testFile, 'Test content from minimal test\n');
11
+
12
+ console.log('Test 1: Direct command execution');
13
+ try {
14
+ console.log('Running: gh gist create with timeout...');
15
+ const result =
16
+ await $`timeout 10 gh gist create ${testFile} --desc "minimal-test" --public=false`.run(
17
+ {
18
+ capture: true,
19
+ mirror: true, // Show output as it happens
20
+ }
21
+ );
22
+
23
+ console.log('\nResult:');
24
+ console.log('- Exit code:', result.code);
25
+ console.log('- Stdout:', result.stdout?.slice(0, 100));
26
+
27
+ // Extract gist ID and delete it
28
+ const gistUrl = result.stdout?.trim();
29
+ if (gistUrl && gistUrl.includes('gist.github.com')) {
30
+ const gistId = gistUrl.split('/').pop();
31
+ console.log('- Gist ID:', gistId);
32
+
33
+ // Clean up
34
+ await $`gh gist delete ${gistId} --yes`.run({
35
+ capture: true,
36
+ mirror: false,
37
+ });
38
+ console.log('- Cleaned up test gist');
39
+ }
40
+ } catch (error) {
41
+ console.log('Error:', error.message);
42
+ console.log('Exit code:', error.code);
43
+ }
44
+
45
+ console.log('\n---\n');
46
+
47
+ console.log('Test 2: Without timeout wrapper');
48
+ try {
49
+ console.log('Running: gh gist create directly...');
50
+
51
+ // Set a timeout option if available
52
+ const result =
53
+ await $`gh gist create ${testFile} --desc "minimal-test-2" --public=false`.run(
54
+ {
55
+ capture: true,
56
+ mirror: true,
57
+ timeout: 10000, // 10 second timeout
58
+ }
59
+ );
60
+
61
+ console.log('\nResult:');
62
+ console.log('- Exit code:', result.code);
63
+ console.log('- Stdout:', result.stdout?.slice(0, 100));
64
+
65
+ // Extract gist ID and delete it
66
+ const gistUrl = result.stdout?.trim();
67
+ if (gistUrl && gistUrl.includes('gist.github.com')) {
68
+ const gistId = gistUrl.split('/').pop();
69
+ console.log('- Gist ID:', gistId);
70
+
71
+ // Clean up
72
+ await $`gh gist delete ${gistId} --yes`.run({
73
+ capture: true,
74
+ mirror: false,
75
+ });
76
+ console.log('- Cleaned up test gist');
77
+ }
78
+ } catch (error) {
79
+ console.log('Error:', error.message);
80
+ console.log('Exit code:', error.code);
81
+ if (error.killed) {
82
+ console.log('Process was killed (timeout?)');
83
+ }
84
+ }
85
+
86
+ // Clean up test file
87
+ await fs.unlink(testFile).catch(() => {});
88
+
89
+ console.log('\n=== Done ===');