2026-05-09 16:05:17 -05:00
|
|
|
# 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.
|
|
|
|
|
|
2026-05-10 18:55:21 -05:00
|
|
|
The implementation plans for each phase are in markdown files under the `plans/` directory. Claude should read these but
|
|
|
|
|
should not modify them.
|
2026-05-10 18:27:55 -05:00
|
|
|
|
2026-05-09 16:05:17 -05:00
|
|
|
## Commands
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
cargo build # compile
|
|
|
|
|
cargo run # build and run
|
|
|
|
|
cargo test # run all tests
|
|
|
|
|
cargo test <name> # run a single test by name
|
|
|
|
|
cargo clippy # lint
|
|
|
|
|
cargo fmt # format
|
|
|
|
|
```
|