3.4 KiB
CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Project Overview
Covenant-Setup is a Windows installer engine written in Rust. It deterministically tracks all system mutations (files, directories, registry keys, shortcuts, scripts) via a journaling model, enabling exact rollback on uninstall. Windows-only; all system operations use Win32 APIs directly.
Build & Run Commands
cargo fmt # Format code
cargo check # Type-check without building
cargo build # Debug build
cargo build --release # Release build
# Package: bundle manifest + payload into a single-file installer EXE
cargo run -- package examples/install.toml --output dist
# Install: apply a manifest directly (or from embedded bundle)
cargo run -- install examples/install.toml --json
# Uninstall: reverse all journaled actions
cargo run -- uninstall examples/journal.json --json
No automated test suite exists yet. Manual testing uses the example manifest (examples/install.toml).
Architecture
Two source files:
src/main.rs— CLI (clap derive), manifest parsing, install/uninstall/package logic, journaling, UI (TUI/GUI/JSON), elevation handlingsrc/win.rs— All Win32 FFI isolated here. Everyunsafeblock is bracketed withlogger.unsafe_enter()/unsafe_exit()calls. ContainsPathResolverfor known-folder token resolution, file/directory/registry/shortcut operations, Restart Manager queries, and elevation checks.
Three operational modes (CLI subcommands):
package— Reads TOML manifest, embeds it + payload files into the EXE binary using an append format (JSON payload + u64 size + magic footerCOVENANT_SETUP_BUNDLE_V1)install— Parses manifest (from file or embedded bundle), executes mutations in order, writesjournal.json, registers in Add/Remove Programsuninstall— Readsjournal.json, reverses actions in LIFO order, handles locked files via Restart Manager +MoveFileExreboot fallback, spawns cleanup helper for self-deletion
Key types:
InstallManifest— Declarative TOML contract: directories, files, registry, shortcuts, scripts, purge specJournal/JournalAction— Serialized record of every mutation for deterministic rollbackMutationTrackertrait — Extensibility point (MVP usesDeclaredTracker; future:ObservedTrackerfor ETW-based capture)PathResolver— Resolves{ProgramFilesX64},{LocalAppData},{Desktop}tokens viaSHGetKnownFolderPathLogger— Dual-mode output: structured JSON (--jsonflag) for IPC or human-readable text
Elevation: Manifest/journal is scanned for HKLM registry or ProgramFiles paths to determine if admin is needed. Auto-relaunches via ShellExecuteW with runas when --elevate flag is set. Exit code 33 signals elevation required.
UI modes: --headless forces TUI, --headed forces GUI (PowerShell-hosted WinForms), auto-detected from parent process otherwise. JSON mode (--json) is for programmatic consumers.
Conventions
- All Win32 calls go in
src/win.rs, never inmain.rs - UTF-16 conversion uses the
Utf16Argwrapper type - Registry always uses
KEY_WOW64_64KEYfor explicit 64-bit access - Path tokens (
{ProgramFilesX64}, etc.) are resolved at runtime, never hardcoded - Subprocess calls use
CREATE_NO_WINDOWflag - Rust edition 2024