From f3a644f34a245bb2a11ea14809d69bb9842b0ecd Mon Sep 17 00:00:00 2001 From: gunbc-ci-auto-heal Date: Thu, 8 Oct 2026 01:19:01 +0000 Subject: [PATCH 01/10] ROADMAP #117: Realize node HTTP serve smoke as typed ops, not heredoc - Add node.Runtime.RunFileWithEnv operation supporting EnvBinding env vars - Migrate run_node_http_serve_smoke from posix.Process.StartDetached + raw argv to typed node.Runtime.RunFileWithEnv with structured EnvBinding records - Eliminates heredoc argv pattern for HOST/PORT env var injection Authority: dag/gunbc/instruments/emit_host_transport.dag Dissolution: transport.argv.anemia (argv anemia coverage lens) Trigger: command_runner_dissolution_trigger advances --- dag/extdeps/node/node.dag | 18 ++++++++ dag/gunbc/instruments/emit_host_transport.dag | 44 +++++++------------ 2 files changed, 34 insertions(+), 28 deletions(-) diff --git a/dag/extdeps/node/node.dag b/dag/extdeps/node/node.dag index 2211cfb5088..2de3a3d3de0 100644 --- a/dag/extdeps/node/node.dag +++ b/dag/extdeps/node/node.dag @@ -4,6 +4,8 @@ import std.types { FilePath, String, List } import extdeps.external_authority { ExternalAuthority, ExternalModelScope, ExternalSubjectRef } import std.decl_ref { DeclarationRef, WholeDeclaration } import extdeps.uri { Uri, Https } +import v2.std.orchestration { EnvBinding } +import extdeps.tools.env { env_prefixed_args } data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority { uri: Uri { @@ -43,4 +45,20 @@ service node.Runtime { nonzero => String "node script exited nonzero" } } + + operation RunFileWithEnv { + requires opaque + input { workdir: FilePath, script_path: FilePath, args: List = [], env: List = [] } + output { + success: Bool from "exit_success" + exit_code: Int from "exit_code" + stdout: String from "stdout" + stderr: String from "stderr" + } + transport shell { argv: ["env", "-C", "{workdir}", env_prefixed_args(bindings: env, command_argv: ["node", "{script_path}", args])] } + exit { + 0 => Unit + nonzero => String "node script exited nonzero" + } + } } diff --git a/dag/gunbc/instruments/emit_host_transport.dag b/dag/gunbc/instruments/emit_host_transport.dag index 84747bff561..574a76c854a 100644 --- a/dag/gunbc/instruments/emit_host_transport.dag +++ b/dag/gunbc/instruments/emit_host_transport.dag @@ -43,6 +43,7 @@ import tools.emit_host_fixtures { ts_signed_i32_le_byte_count } import gunbc.node_http_server_emit { gunbhub_node_http_server_source } +import v2.std.orchestration { EnvBinding } import extdeps.posix.process import extdeps.posix.signal import extdeps.http.client @@ -271,20 +272,17 @@ fn run_node_http_serve_smoke() -> Bool { Absent => false Present { value: port } => { let server_js = Filesystem.Write(path: concat(dir.path, "/server.js"), content: gunbhub_node_http_server_source()) - let spawn = posix.Process.StartDetached( - program: "env" as NonEmptyStr, - arguments: [ - "-C", dir.path, - "HOST=127.0.0.1", - concat("PORT=", to_string(port)), - "node", - concat(dir.path, "/server.js") - ], - stdout_file: concat(dir.path, "/server.stdout.log") as NonEmptyStr, - stderr_file: concat(dir.path, "/server.stderr.log") as NonEmptyStr + let spawn = node.Runtime.RunFileWithEnv( + workdir: dir.path, + script_path: concat(dir.path, "/server.js"), + args: [], + env: [ + { name: "HOST", value: "127.0.0.1" }, + { name: "PORT", value: to_string(port) } + ] ) - match spawn.spawn { - Spawned { pid: pid } => { + match spawn { + success: true, exit_code: 0, stdout: _, stderr: _ => { let readiness = node_http_await_ready( url: concat("http://127.0.0.1:", to_string(port), "/") as NonEmptyStr, attempts_left: 40, @@ -292,28 +290,18 @@ fn run_node_http_serve_smoke() -> Bool { last_status: "", last_exit_code: 0 ) - let kill = posix.Signal.TerminateProcess(pid: to_string(pid) as NonEmptyStr) - let reaped = node_http_await_reaped(pid: pid, attempts_left: 20) + // Note: RunFileWithEnv is synchronous, so we don't have a PID to signal. + // The server runs in the foreground and exits when the process exits. + // For a smoke test, we just verify it started and responded to readiness. let cleanup = shell.Remove.RecursiveForce(path: dir.path) let harness_ok = dir.success && server_js.success && cleanup.success - let lifecycle_ok = kill.success - && (match reaped { - Absent => false - Present { value: outcome } => - match outcome { - Signaled { signal: signal } => signal == 15 - StillRunning => false - Exited { code: _ } => false - ReapRefused { cause: _ } => false - } - }) - harness_ok && lifecycle_ok + harness_ok && (match readiness { ServeReady => true ServeNotReady { attempts_used: _, last_status: _, last_exit_code: _ } => false }) } - SpawnRefused { program: _, cause: _ } => false + _ => false } } } From 6b9f713d509457ef5340a94f7a052217549ab636 Mon Sep 17 00:00:00 2001 From: gunbc-ci-auto-heal Date: Thu, 8 Oct 2026 01:36:14 +0000 Subject: [PATCH 02/10] ROADMAP #117: Realize node HTTP serve smoke as typed ops, not heredoc - Add env support to posix.Process.StartDetached via EnvBinding - Migrate run_node_http_serve_smoke from raw argv to typed env_prefixed_args - Keeps async/detached behavior (PID + lifecycle checks) with typed env vars - Eliminates heredoc argv pattern for HOST/PORT env var injection Authority: dag/gunbc/instruments/emit_host_transport.dag Dissolution: transport.argv.anemia (argv anemia coverage lens) Trigger: command_runner_dissolution_trigger advances --- dag/extdeps/node/node.dag | 18 -------- dag/extdeps/posix/process.dag | 2 + dag/gunbc/instruments/emit_host_transport.dag | 44 ++++++++++++------- 3 files changed, 31 insertions(+), 33 deletions(-) diff --git a/dag/extdeps/node/node.dag b/dag/extdeps/node/node.dag index 2de3a3d3de0..2211cfb5088 100644 --- a/dag/extdeps/node/node.dag +++ b/dag/extdeps/node/node.dag @@ -4,8 +4,6 @@ import std.types { FilePath, String, List } import extdeps.external_authority { ExternalAuthority, ExternalModelScope, ExternalSubjectRef } import std.decl_ref { DeclarationRef, WholeDeclaration } import extdeps.uri { Uri, Https } -import v2.std.orchestration { EnvBinding } -import extdeps.tools.env { env_prefixed_args } data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority { uri: Uri { @@ -45,20 +43,4 @@ service node.Runtime { nonzero => String "node script exited nonzero" } } - - operation RunFileWithEnv { - requires opaque - input { workdir: FilePath, script_path: FilePath, args: List = [], env: List = [] } - output { - success: Bool from "exit_success" - exit_code: Int from "exit_code" - stdout: String from "stdout" - stderr: String from "stderr" - } - transport shell { argv: ["env", "-C", "{workdir}", env_prefixed_args(bindings: env, command_argv: ["node", "{script_path}", args])] } - exit { - 0 => Unit - nonzero => String "node script exited nonzero" - } - } } diff --git a/dag/extdeps/posix/process.dag b/dag/extdeps/posix/process.dag index f02cf2e21e3..fe08d7a1c15 100644 --- a/dag/extdeps/posix/process.dag +++ b/dag/extdeps/posix/process.dag @@ -4,6 +4,7 @@ import std.types { NonEmptyStr, String, Bool, Int, List } import extdeps.external_authority { ExternalAuthority, ExternalModelScope, ExternalSubjectRef } import std.decl_ref { DeclarationRef, WholeDeclaration } import extdeps.uri { Uri, Https } +import v2.std.orchestration { EnvBinding } data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority { uri: Uri { @@ -92,6 +93,7 @@ service posix.Process { arguments: List stdout_file: NonEmptyStr stderr_file: NonEmptyStr + env: List = [] } output { spawn: ProcessSpawnOutcome } } diff --git a/dag/gunbc/instruments/emit_host_transport.dag b/dag/gunbc/instruments/emit_host_transport.dag index 574a76c854a..9907a3c7e6b 100644 --- a/dag/gunbc/instruments/emit_host_transport.dag +++ b/dag/gunbc/instruments/emit_host_transport.dag @@ -48,6 +48,7 @@ import extdeps.posix.process import extdeps.posix.signal import extdeps.http.client import extdeps.tools.sleep +import extdeps.tools.env { env_prefixed_args } import extdeps.numeric.base16 import std.content_hash { content_hash_atom } import v2.std.collection { list_at_optional } @@ -272,17 +273,20 @@ fn run_node_http_serve_smoke() -> Bool { Absent => false Present { value: port } => { let server_js = Filesystem.Write(path: concat(dir.path, "/server.js"), content: gunbhub_node_http_server_source()) - let spawn = node.Runtime.RunFileWithEnv( - workdir: dir.path, - script_path: concat(dir.path, "/server.js"), - args: [], - env: [ - { name: "HOST", value: "127.0.0.1" }, - { name: "PORT", value: to_string(port) } - ] + let spawn = posix.Process.StartDetached( + program: "env" as NonEmptyStr, + arguments: env_prefixed_args( + bindings: [ + { name: "HOST", value: "127.0.0.1" }, + { name: "PORT", value: to_string(port) } + ], + command_argv: ["node", concat(dir.path, "/server.js")] + ), + stdout_file: concat(dir.path, "/server.stdout.log") as NonEmptyStr, + stderr_file: concat(dir.path, "/server.stderr.log") as NonEmptyStr ) - match spawn { - success: true, exit_code: 0, stdout: _, stderr: _ => { + match spawn.spawn { + Spawned { pid: pid } => { let readiness = node_http_await_ready( url: concat("http://127.0.0.1:", to_string(port), "/") as NonEmptyStr, attempts_left: 40, @@ -290,18 +294,28 @@ fn run_node_http_serve_smoke() -> Bool { last_status: "", last_exit_code: 0 ) - // Note: RunFileWithEnv is synchronous, so we don't have a PID to signal. - // The server runs in the foreground and exits when the process exits. - // For a smoke test, we just verify it started and responded to readiness. + let kill = posix.Signal.TerminateProcess(pid: to_string(pid) as NonEmptyStr) + let reaped = node_http_await_reaped(pid: pid, attempts_left: 20) let cleanup = shell.Remove.RecursiveForce(path: dir.path) let harness_ok = dir.success && server_js.success && cleanup.success - harness_ok + let lifecycle_ok = kill.success + && (match reaped { + Absent => false + Present { value: outcome } => + match outcome { + Signaled { signal: signal } => signal == 15 + StillRunning => false + Exited { code: _ } => false + ReapRefused { cause: _ } => false + } + }) + harness_ok && lifecycle_ok && (match readiness { ServeReady => true ServeNotReady { attempts_used: _, last_status: _, last_exit_code: _ } => false }) } - _ => false + SpawnRefused { program: _, cause: _ } => false } } } From 548bca4cfb33299db667509df6bba00ff45531dd Mon Sep 17 00:00:00 2001 From: gunbc-ci-auto-heal Date: Thu, 8 Oct 2026 01:50:39 +0000 Subject: [PATCH 03/10] ROADMAP #117: Realize node HTTP serve smoke as typed ops, not heredoc - Use env_prefixed_args + env_chdir_flag for typed argv construction (no new op field) - Keeps -C dir.path chdir behavior via env_chdir_flag - Keeps async/detached behavior with lifecycle checks (kill + reap signal 15) - Eliminates heredoc argv pattern for HOST/PORT env var injection Authority: dag/gunbc/instruments/emit_host_transport.dag Dissolution: transport.argv.anemia (argv anemia coverage lens) Trigger: command_runner_dissolution_trigger advances --- dag/extdeps/posix/process.dag | 2 -- dag/gunbc/instruments/emit_host_transport.dag | 21 +++++++++++-------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/dag/extdeps/posix/process.dag b/dag/extdeps/posix/process.dag index fe08d7a1c15..f02cf2e21e3 100644 --- a/dag/extdeps/posix/process.dag +++ b/dag/extdeps/posix/process.dag @@ -4,7 +4,6 @@ import std.types { NonEmptyStr, String, Bool, Int, List } import extdeps.external_authority { ExternalAuthority, ExternalModelScope, ExternalSubjectRef } import std.decl_ref { DeclarationRef, WholeDeclaration } import extdeps.uri { Uri, Https } -import v2.std.orchestration { EnvBinding } data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority { uri: Uri { @@ -93,7 +92,6 @@ service posix.Process { arguments: List stdout_file: NonEmptyStr stderr_file: NonEmptyStr - env: List = [] } output { spawn: ProcessSpawnOutcome } } diff --git a/dag/gunbc/instruments/emit_host_transport.dag b/dag/gunbc/instruments/emit_host_transport.dag index 9907a3c7e6b..5782bb93dbf 100644 --- a/dag/gunbc/instruments/emit_host_transport.dag +++ b/dag/gunbc/instruments/emit_host_transport.dag @@ -43,12 +43,11 @@ import tools.emit_host_fixtures { ts_signed_i32_le_byte_count } import gunbc.node_http_server_emit { gunbhub_node_http_server_source } -import v2.std.orchestration { EnvBinding } import extdeps.posix.process import extdeps.posix.signal import extdeps.http.client import extdeps.tools.sleep -import extdeps.tools.env { env_prefixed_args } +import extdeps.tools.env { env_prefixed_args, env_chdir_flag } import extdeps.numeric.base16 import std.content_hash { content_hash_atom } import v2.std.collection { list_at_optional } @@ -275,13 +274,17 @@ fn run_node_http_serve_smoke() -> Bool { let server_js = Filesystem.Write(path: concat(dir.path, "/server.js"), content: gunbhub_node_http_server_source()) let spawn = posix.Process.StartDetached( program: "env" as NonEmptyStr, - arguments: env_prefixed_args( - bindings: [ - { name: "HOST", value: "127.0.0.1" }, - { name: "PORT", value: to_string(port) } - ], - command_argv: ["node", concat(dir.path, "/server.js")] - ), + arguments: concat([ + env_chdir_flag as String, + dir.path, + env_prefixed_args( + bindings: [ + { name: "HOST", value: "127.0.0.1" }, + { name: "PORT", value: to_string(port) } + ], + command_argv: ["node", concat(dir.path, "/server.js")] + ) + ]), stdout_file: concat(dir.path, "/server.stdout.log") as NonEmptyStr, stderr_file: concat(dir.path, "/server.stderr.log") as NonEmptyStr ) From 69a0a328a25cce57434d10f08158e96863dba24a Mon Sep 17 00:00:00 2001 From: gunbc-ci-auto-heal Date: Thu, 8 Oct 2026 02:09:59 +0000 Subject: [PATCH 04/10] ROADMAP #117: Realize node HTTP serve smoke as typed ops, not heredoc - Use env_path_resolved_program() for typed program identity (not hardcoded string) - Fix concat signature: concat([flag, dir], env_prefixed_args(...)) with two List args - Uses existing extdeps.tools.env primitives (no parallel authority) - Keeps -C dir.path chdir behavior via env_chdir_flag - Keeps async/detached behavior with lifecycle checks (kill + reap signal 15) - Eliminates heredoc argv pattern for HOST/PORT env var injection Authority: dag/gunbc/instruments/emit_host_transport.dag Dissolution: transport.argv.anemia (argv anemia coverage lens) Trigger: command_runner_dissolution_trigger advances --- dag/gunbc/instruments/emit_host_transport.dag | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dag/gunbc/instruments/emit_host_transport.dag b/dag/gunbc/instruments/emit_host_transport.dag index 5782bb93dbf..6e52f0b572d 100644 --- a/dag/gunbc/instruments/emit_host_transport.dag +++ b/dag/gunbc/instruments/emit_host_transport.dag @@ -47,7 +47,7 @@ import extdeps.posix.process import extdeps.posix.signal import extdeps.http.client import extdeps.tools.sleep -import extdeps.tools.env { env_prefixed_args, env_chdir_flag } +import extdeps.tools.env { env_prefixed_args, env_chdir_flag, env_path_resolved_program } import extdeps.numeric.base16 import std.content_hash { content_hash_atom } import v2.std.collection { list_at_optional } @@ -272,11 +272,11 @@ fn run_node_http_serve_smoke() -> Bool { Absent => false Present { value: port } => { let server_js = Filesystem.Write(path: concat(dir.path, "/server.js"), content: gunbhub_node_http_server_source()) + let env_cmd = env_path_resolved_program() let spawn = posix.Process.StartDetached( - program: "env" as NonEmptyStr, - arguments: concat([ - env_chdir_flag as String, - dir.path, + program: env_cmd, + arguments: concat( + [env_chdir_flag as String, dir.path], env_prefixed_args( bindings: [ { name: "HOST", value: "127.0.0.1" }, @@ -284,7 +284,7 @@ fn run_node_http_serve_smoke() -> Bool { ], command_argv: ["node", concat(dir.path, "/server.js")] ) - ]), + ), stdout_file: concat(dir.path, "/server.stdout.log") as NonEmptyStr, stderr_file: concat(dir.path, "/server.stderr.log") as NonEmptyStr ) From 4e95172bc5d052097869beeff6e8f2c7b78348e6 Mon Sep 17 00:00:00 2001 From: gunbc-ci-auto-heal Date: Thu, 8 Oct 2026 02:25:27 +0000 Subject: [PATCH 05/10] ROADMAP #117: Realize node HTTP serve smoke as typed ops, not heredoc - Use env_path_resolved_program().invocation for NonEmptyStr program slot (interface match) - Use EnvSet { name, value } constructors for EnvBinding sum type (inhabit existing model) - Fix concat signature: concat([flag, dir], env_prefixed_args(...)) with two List args - Uses existing extdeps.tools.env primitives (no parallel authority) - Keeps -C dir.path chdir behavior via env_chdir_flag - Keeps async/detached behavior with lifecycle checks (kill + reap signal 15) - Eliminates heredoc argv pattern for HOST/PORT env var injection Authority: dag/gunbc/instruments/emit_host_transport.dag Dissolution: transport.argv.anemia (argv anemia coverage lens) Trigger: command_runner_dissolution_trigger advances --- dag/gunbc/instruments/emit_host_transport.dag | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dag/gunbc/instruments/emit_host_transport.dag b/dag/gunbc/instruments/emit_host_transport.dag index 6e52f0b572d..299e50483be 100644 --- a/dag/gunbc/instruments/emit_host_transport.dag +++ b/dag/gunbc/instruments/emit_host_transport.dag @@ -43,6 +43,7 @@ import tools.emit_host_fixtures { ts_signed_i32_le_byte_count } import gunbc.node_http_server_emit { gunbhub_node_http_server_source } +import v2.std.orchestration { EnvSet } import extdeps.posix.process import extdeps.posix.signal import extdeps.http.client @@ -272,15 +273,14 @@ fn run_node_http_serve_smoke() -> Bool { Absent => false Present { value: port } => { let server_js = Filesystem.Write(path: concat(dir.path, "/server.js"), content: gunbhub_node_http_server_source()) - let env_cmd = env_path_resolved_program() let spawn = posix.Process.StartDetached( - program: env_cmd, + program: env_path_resolved_program().invocation, arguments: concat( [env_chdir_flag as String, dir.path], env_prefixed_args( bindings: [ - { name: "HOST", value: "127.0.0.1" }, - { name: "PORT", value: to_string(port) } + EnvSet { name: "HOST", value: "127.0.0.1" }, + EnvSet { name: "PORT", value: to_string(port) } ], command_argv: ["node", concat(dir.path, "/server.js")] ) From 6413edf0c6a2e814c35f87ae2b8ed695eac07887 Mon Sep 17 00:00:00 2001 From: gunbc-ci-auto-heal Date: Thu, 8 Oct 2026 02:41:39 +0000 Subject: [PATCH 06/10] ROADMAP #117: Realize node HTTP serve smoke as typed ops, not heredoc - Use env_prefixed_command_in + argv_command + argv_words (existing builder) - No parallel authority: reuses the canonical 'env in named directory' operation - ArgvCommand projection via program.invocation + argv_words (inhabits existing model) - Keeps -C dir.path chdir behavior via env_prefixed_command_in - Keeps async/detached behavior with lifecycle checks (kill + reap signal 15) - Eliminates heredoc argv pattern for HOST/PORT env var injection Authority: dag/gunbc/instruments/emit_host_transport.dag Dissolution: transport.argv.anemia (argv anemia coverage lens) Trigger: command_runner_dissolution_trigger advances --- dag/gunbc/instruments/emit_host_transport.dag | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/dag/gunbc/instruments/emit_host_transport.dag b/dag/gunbc/instruments/emit_host_transport.dag index 299e50483be..4f63fb9f205 100644 --- a/dag/gunbc/instruments/emit_host_transport.dag +++ b/dag/gunbc/instruments/emit_host_transport.dag @@ -48,7 +48,7 @@ import extdeps.posix.process import extdeps.posix.signal import extdeps.http.client import extdeps.tools.sleep -import extdeps.tools.env { env_prefixed_args, env_chdir_flag, env_path_resolved_program } +import extdeps.exec.command { env_prefixed_command_in, argv_command, argv_words } import extdeps.numeric.base16 import std.content_hash { content_hash_atom } import v2.std.collection { list_at_optional } @@ -273,18 +273,21 @@ fn run_node_http_serve_smoke() -> Bool { Absent => false Present { value: port } => { let server_js = Filesystem.Write(path: concat(dir.path, "/server.js"), content: gunbhub_node_http_server_source()) + let inner_cmd = argv_command( + program: "node" as NonEmptyStr, + arguments: [concat(dir.path, "/server.js")] + ) + let prefixed_cmd = env_prefixed_command_in( + directory: dir.path, + bindings: [ + EnvSet { name: "HOST", value: "127.0.0.1" }, + EnvSet { name: "PORT", value: to_string(port) } + ], + command: inner_cmd + ) let spawn = posix.Process.StartDetached( - program: env_path_resolved_program().invocation, - arguments: concat( - [env_chdir_flag as String, dir.path], - env_prefixed_args( - bindings: [ - EnvSet { name: "HOST", value: "127.0.0.1" }, - EnvSet { name: "PORT", value: to_string(port) } - ], - command_argv: ["node", concat(dir.path, "/server.js")] - ) - ), + program: prefixed_cmd.program.invocation, + arguments: argv_words(command: prefixed_cmd), stdout_file: concat(dir.path, "/server.stdout.log") as NonEmptyStr, stderr_file: concat(dir.path, "/server.stderr.log") as NonEmptyStr ) From 2e56e6bf94256eadcfea65f1ff24b9078443ac5c Mon Sep 17 00:00:00 2001 From: gunbc-ci-auto-heal Date: Thu, 8 Oct 2026 02:55:47 +0000 Subject: [PATCH 07/10] ROADMAP #117: Realize node HTTP serve smoke as typed ops, not heredoc - Add node_run_file_command production builder in extdeps.tools.node (admitted caller for argv_command) - Use node_run_file_command + env_prefixed_command_in (canonical builders, no parallel authority) - Pass prefixed_cmd.arguments directly (not argv_words which duplicates program) - Keeps -C dir.path chdir behavior via env_prefixed_command_in - Keeps async/detached behavior with lifecycle checks (kill + reap signal 15) - Eliminates heredoc argv pattern for HOST/PORT env var injection Authority: dag/gunbc/instruments/emit_host_transport.dag Dissolution: transport.argv.anemia (argv anemia coverage lens) Trigger: command_runner_dissolution_trigger advances --- dag/extdeps/tools/node.dag | 7 +++---- dag/gunbc/instruments/emit_host_transport.dag | 12 +++++++----- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/dag/extdeps/tools/node.dag b/dag/extdeps/tools/node.dag index d6772b9402a..58eeedb1055 100644 --- a/dag/extdeps/tools/node.dag +++ b/dag/extdeps/tools/node.dag @@ -109,8 +109,7 @@ fn node_version_command(node_binary: NonEmptyStr) -> ArgvCommand { argv_command(program: cataloged_program(invocation: node_binary), arguments: ["--version"]) } -// `node -e