# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project `drawer` is a Rust project (edition 2024). Entry point is `src/main.rs`. ## Dependencies - `tar` — reading and writing tarballs in memory - `flate2` — gzip compression, paired with `tar` - `age` — encryption/decryption using SSH keys (RSA or Ed25519) loaded from disk - `clap` — command line argument parsing (derive API), used for subcommands and flags `drawer` is a command line tool for managing projects. A drawer is a single directory with related files in for a project. Drawer files always end in the `.drawer` extension, like `foo.drawer`. To create a drawer file from a directory, we first tar all files in the directory, and then encrypt the resulting tarball. To open a drawer file, we decrypt it and expand the tarball to a directory. The `drawer` tool has two subcommands, `drawer open` and `drawer close`. Each of these commands requires a key, the path to which can be given by either the `$DRAWER_KEY` environment variable or a `-i` command line parameter. ### Open subcommand The `drawer open` subcommand will decrypt and untar a drawer file into a path. It takes two arguments, the name of a drawer file (required) and a path to expand it into (optional, defaults to a directory under the current directory named the same as the drawer file). If the target path exists and is not empty, print an error message, unless the `-f` flag is passed. ### Close subcommand The `drawer close` subcommand will create a drawer file from a directory and a key. The command takes two arguments, the name of a drawer file (required) and the path to a directory (optional, defaults to the current directory). If the target drawer file is inside the directory, print an error message saying so. Otherwise, create a tarball (in memory) of the directory contents, encrypt them (again in memory), and write the drawer file to disk. ### Examples: - `drawer close -i ~/.keys/mykey ~/Documents/blah.drawer ~/Documents/blah` (create a file, `~/Documents/blah.drawer`, encrypted with `~/.keys/mykey`, containing the contents of `~/Documents/blah`) - `drawer open ~/Documents/blah.drawer` (open `~/Documents/blah.drawer` into `./blah` using a key found at `$DRAWER_KEY`) ## Implementation plan The implementation of this project will happen in several phases. Claude will do the primary coding for each phase, then the user (me) will review the code, write tests, and possibly make changes, before proceeding with the next phase. At to time should Claude delete or modify any tests whatsoever. The implementation plans for each phase are in markdown files under the `plans/` directory. Claude should read these but should not modify them. ## Commands ```bash cargo build # compile cargo run # build and run cargo test # run all tests cargo test # run a single test by name cargo clippy # lint cargo fmt # format ```