Repository F# setup
open System
open System.IO
open System.Threading
open System.Threading.Tasks
open Axial
open Axial.Layers
open Axial.Console
open Axial.FileSystem
open Axial.Hosting
open Axial.Hosting.Browser
open Axial.Hosting.Node
open Axial.HttpClient
open Axial.PlatformService
open Axial.Process
open Axial.State
open Axial.Telemetry
open Axial.Telemetry.JavaScript

Open Axial.Process.DSL for command-line-shaped authoring:

open Axial.Process.DSL

let workflow =
    cmd $"device-tool connect {deviceId}"
    |> cwd workspace
    |> env "DEVICE_MODE" "service"
    |> timeout (TimeSpan.FromSeconds 30)
    |> capture
Interpolation holes remain individual native arguments. They are not concatenated into shell source. Mark sensitive values explicitly:
let workflow =
    cmd $"device-tool authenticate {secret token}"
    |> capture
Use `bash`, `sh`, or `pwsh` when shell syntax is required. Interpolated values are passed out of band as positional arguments:
let workflow =
    bash $"printf '%s' {value} | tr '[:lower:]' '[:upper:]'"
    |> capture
The DSL's execution verbs are `run`, `capture`, `console`, and `stream`. `capture` selects complete stdout and stderr capture before running. `console` forwards both channels while retaining structured completion data. `stream` yields `ProcessEvent` values.

At a command-line host boundary, Script.run console workflow executes against live services, prints a typed process failure through the supplied console service, and returns a host exit code.