Repository F# setup
open System
open System.IO
open System.Threading
open System.Threading.Tasks
open Axial
open Axial.Console
open Axial.FileSystem
open Axial.PlatformService
open Axial.Process

Process.command safely tokenizes an interpolated command template and returns a runnable ProcessSpec. Each interpolation hole becomes one native argument:

let status =
    Process.command $"git status --short"
    |> Process.workingDirectory repository
    |> Process.environment "CI" "true"
    |> Process.timeout (TimeSpan.FromSeconds 15)

Apply command-specific configuration before connecting stages. Process.arg, Process.secretArg, Process.workingDirectory, Process.environment, Process.removeEnvironment, Process.encoding, and Process.successCodes require a one-command specification.

Connect stdout to the next stage with Process.pipe:

let countErrors =
    Process.command $"journalctl --priority=err"
    |> Process.pipe (Process.command $"wc -l")
    |> Process.toFlow

The DSL offers the same model with shorter names:

open Axial.Process.DSL

let result =
    cmd $"printf %s {value}"
    => cmd $"tr '[:lower:]' '[:upper:]'"
    |> timeout (TimeSpan.FromSeconds 5)
    |> capture

Each interpolation hole becomes one argument. Use secret when plans, failures, and transcripts must show *** instead of the real value. Use cmdText only for fixed command text.

Use Process.commandArgs when arguments already exist as a list. It has the same immutable specification result, without command-line parsing.

Process.plan returns a redacted, serializable description without executing anything. Process.render returns a redacted shell-like diagnostic string; it is not a shell command generator.