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

Process.command safely tokenizes an executable and its arguments and returns a runnable ProcessSpec:

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`, `secretArg`, `workingDirectory`, `environment`, `removeEnvironment`, `encoding`, and `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.run
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 value` when plans, failures, and transcripts must show `***` instead of the real value. Use `cmdText` only for fixed command text.

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.