Skip to main content

Deep Dive

Maintain - Deep Dive

Architecture overview of the Maintain build orchestrator: Rust binary and library, Rhai scripting engine, TOML/JSON5 config editing, data flow, integration points, and CLI configuration.

Maintain is the build orchestrator for Land. It covers the internals of the Maintain Rust binary: its architecture, module layout, data flow, integration with other Land elements, and configuration options.


Architecture 🏗

Maintain is a Rust binary and library. The CLI layer accepts subcommands and delegates to the Rhai scripting engine or direct build functions. Configuration editing is performed through toml_edit and json5 for structured, non-lossy modifications to project configuration files.

graph TB
    subgraph "Maintain Build System"
        LibraryRS["Source/Library.rs<br/>Entry point"]
        CLI["Source/Build/CLI.rs<br/>Command-line interface (clap)"]
        Constant["Source/Build/Constant.rs<br/>Build constants"]
        Definition["Source/Build/Definition.rs<br/>Build group definitions"]
        FnRS["Source/Build/Fn.rs<br/>Build function dispatch"]
        Error["Source/Build/Error.rs<br/>Error types"]
        Logger["Source/Build/Logger.rs<br/>Colored terminal output"]
        Process["Source/Build/Process.rs<br/>Child process management"]
        TomlEdit["Source/Build/TomlEdit.rs<br/>Cargo.toml editor"]
        JsonEdit["Source/Build/JsonEdit.rs<br/>JSON5 editor"]
        Pascalize["Source/Build/Pascalize.rs<br/>PascalCase naming utilities"]
        GetTauri["Source/Build/GetTauriTargetTriple.rs<br/>Platform detection"]
        EnvResolve["Source/Build/EnvironmentResolver.rs<br/>Environment variable resolution"]
    end

    subgraph "Rhai Scripting"
        ConfigLoader["Source/Build/Rhai/ConfigLoader.rs<br/>Configuration file loading"]
        ScriptRunner["Source/Build/Rhai/ScriptRunner.rs<br/>Script execution engine"]
        RhaiEnvResolve["Source/Build/Rhai/EnvironmentResolver.rs<br/>Environment in scripts"]
    end

    subgraph "Shell Scripts"
        DebugSh["Debug.sh<br/>Debug build entry"]
        DevMountain["Dev-Mountain.sh<br/>Mountain development mode"]
        ReleaseSh["Release.sh<br/>Release build entry"]
        ProfileSh["Profile.sh<br/>Performance profiling"]
        DebugAll["Debug/All.sh"]
        DebugBuild["Debug/Build.sh"]
        DebugRun["Debug/Run.sh"]
        DebugWind["Debug/Wind.sh"]
    end

    LibraryRS --> CLI
    CLI --> FnRS
    CLI --> ConfigLoader
    CLI --> ScriptRunner
    FnRS --> Process
    FnRS --> TomlEdit
    FnRS --> JsonEdit
    ScriptRunner --> RhaiEnvResolve
    ConfigLoader --> ScriptRunner
    DebugSh --> CLI
    DevMountain --> CLI
    ReleaseSh --> CLI

Key Modules 🔌

PathDescription
Source/Library.rsBinary entry point; wires together CLI, logging, and error handling
Source/Build/CLI.rsclap-based CLI with subcommands: debug, release, profile, dev
Source/Build/Definition.rsBuild group definitions: which elements to build, in what order
Source/Build/Fn.rsCore build function dispatch: clean, compile, link, post-process
Source/Build/Process.rsChild process spawning with stdout/stderr capture and exit code handling
Source/Build/TomlEdit.rsNon-lossy TOML editing for Cargo.toml version bumps and dependency changes
Source/Build/JsonEdit.rsJSON5-aware configuration editing for package.json and .json5 files
Source/Build/Pascalize.rsPascalCase ↔ words conversion utilities for naming convention enforcement
Source/Build/GetTauriTargetTriple.rsDetects current Rust target triple for SideCar binary selection
Source/Build/EnvironmentResolver.rsResolves environment variables with fallbacks for build-time configuration
Source/Build/Logger.rsColored terminal output using the colored crate
Source/Build/Error.rsUnified error type for build failures
Source/Build/Rhai/ConfigLoader.rsLoads and parses Rhai build configuration scripts
Source/Build/Rhai/ScriptRunner.rsExecutes Rhai scripts within the build context with Land API bindings
Source/Build/Rhai/EnvironmentResolver.rsExposes environment variable resolution to Rhai scripts

Data Flow 🔄

sequenceDiagram
    participant Developer as Developer / CI
    participant ShellScript as Shell Script
    participant CLI as Maintain CLI
    participant Rhai as Rhai Engine
    participant Process as Process Manager
    participant Config as Config Editor

    Developer->>ShellScript: ./Maintain/Release.sh
    ShellScript->>CLI: Maintain release --target aarch64-apple-darwin
    CLI->>Rhai: Load build configuration script
    Rhai->>CLI: Build group definition
    CLI->>Config: Read Cargo.toml / package.json
    Config->>CLI: Current version and dependencies
    loop For each element in build group
        CLI->>Process: spawn("cargo build --release -p Mountain")
        Process->>CLI: Exit code + output
    end
    CLI->>Config: Write updated Cargo.toml (if version bump)
    CLI->>Developer: Build summary with timing

Integration Points 🔗

Connecting ElementDirectionMechanismDescription
MountainBuild targetcargo build subprocessMaintain compiles Mountain as part of the debug/release build group
AirBuild targetcargo build subprocessAir daemon compiled alongside Mountain
EchoBuild targetcargo build subprocessEcho scheduler compiled as a dependency of Mountain
RestBuild targetcargo build subprocessRest compiler binary built for use by Output
SideCarBuild targetcargo build subprocessSideCar Download tool compiled and run as part of setup
OutputBuild triggerpnpm run prepublishOnly subprocessMaintain triggers TypeScript builds via pnpm
Wind / SkyBuild triggerpnpm run prepublishOnly subprocessFrontend packages built through Turborepo via Maintain

Configuration 🛠

OptionCLI FlagDescription
Build modedebug / release subcommandControls --release flag and optimization level
Target triple--targetRust target triple for cross-compilation
Element filter--elementBuild only a specific element rather than the full group
Script path--scriptOverride the default Rhai build configuration script
Verbosity--verboseEnable detailed subprocess output logging

Shell script entry points

ScriptPurpose
Debug.shFull debug build of all elements
Dev-Mountain.shHot-reload development mode for Mountain
Release.shOptimized release build with all elements
Profile.shRelease build with profiling instrumentation
Debug/All.shDebug all components including frontend
Debug/Wind.shDebug Wind TypeScript service layer only