Files
IronStorage/AGENTS.md

2.4 KiB

Repository instructions

Architecture boundary

crates/storage owns all password-store behavior and all objects stored in or derived from a password-store repository. This includes filesystem layout, .gpg-id handling, GPG-compatible encryption and key handling, Git, synchronization, conflict handling, entry parsing, password generation, OTP, QR payloads, server/application identities, HTTPS Git credentials, and secure-secret-storage orchestration. Git remotes are HTTPS-only; reject other schemes before entering the Git transport.

The CLI, Ratatui, Iced, Swift, SwiftUI, AutoFill, and watchOS code may collect input, invoke the Rust API, and present Rust-provided state. They must not duplicate storage rules, derive domain state from display strings, or directly read or mutate a password-store repository.

Application code must not launch external processes. Do not invoke pass, git, gpg, shell commands, or helper executables. Use pure Rust libraries. Use FFI only where an operating-system API has no feasible Rust interface, such as Apple authentication and secure-storage APIs; keep domain decisions in crates/storage.

Keep project crates free of unsafe Rust. Isolate any unavoidable future FFI implementation in the smallest platform-specific module and document its safety contract.

Compatibility

Compatibility means the upstream pass repository format and observable behavior, including pass-otp; IronStorage must not introduce a competing on-disk format. Prove new behavior with fixtures usable by both upstream tools and crates/storage without executing those tools at application runtime.

Required checks

Run these from the repository root before committing:

cargo fmt --all -- --check
RUSTFLAGS="-D warnings" cargo check --workspace --all-targets
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace

For Apple project changes, also run xcodegen generate from apple/ and build the affected simulator targets.

Simulator biometric validation

Before testing biometric unlock, enable Biometric Unlock once in the iPhone app so its protected passphrase is enrolled. In Simulator, use Features > Face ID > Enrolled, trigger an IronStorage unlock, then choose Matching Face. Verify the app changes from locked to unlocked. Use Non-matching Face to test rejection, and clear Enrolled to test unavailable or changed biometric enrollment.