S3-backed, git-versioned object storage for agents.
aggit is a Rust CLI that implements a minimal Git-like content store in .aggit/, plus remote sync to S3-compatible storage.
Note
This software is still in alpha: you might encounter bugs and breaking changes might be introduced in future versions
cargo install aggit@0.3.0-alphaYou can use aggit as an agent skill, downloading it with the skills CLI tool:
npx skills add AstraBert/aggitOr copy-pasting the SKILL.md file to your own skills setup.
- Initializes an
aggitrepository with internal refs and object storage. - Hashes file contents into compressed objects (
blob,tree,commit) under.aggit/objects. - Tracks staged files in a branch-specific index (
.aggit/refs/index/<branch>). - Supports core local VCS-like commands:
add,commit,checkout,status,diff,ls,catswitch(branch switching/creation)branch(list local branches)
- Stores global commit author config at
~/.config/.aggit/author.toml. - Stores repository metadata in
.aggit/repo.toml. - Manages multiple S3 origins in
.aggitorigin(create,add,update). - Pushes reachable local objects and branch metadata to S3.
- Clones
.aggitdata from S3 and restores the working tree.
Note
gitops implementation is heavilys inspired by pygit
aggit init <path>: initialize repository atpathaggit author -n <name> -e <email>: set global authoraggit repo <name> [-d <description>] [-t <topic> ...]: configure repository metadataaggit add <files...>: stage filesaggit commit -m <message>: commit staged stateaggit checkout <commit_sha>: restore working tree/index to a specific commit (commit-only checkout)aggit status: show changed/new/deleted files vs indexaggit diff: show unified diff of working copy vs indexaggit ls [-d]: list index entries (-dfor mode/SHA/stage)aggit cat -m <mode> -s <sha1-prefix>: inspect objects (blob|tree|commit|type|size|pretty)aggit switch <branch> [-c]: switch branch, optionally create (branch switching is done withswitch, notcheckout)aggit branch: list branchesaggit origin <create|add|update> <name> -e <endpoint> -s <secret> -k <key_id> -r <region>aggit push <origin>: push current branch objects/head/index to remote bucketaggit clone -o <origin> -n <repo_name> [-b <branch>]: clone from remote bucket
When pushing, aggit targets bucket:
<origin>-<repository-name>-<branch>
It uploads:
- reachable objects from local head (excluding what remote head already has)
- branch head file
- branch index file
- remote
headkey
Clone downloads remote .aggit data, sets .aggit/HEAD, then restores files into the working tree.
# Build
cargo build --release
# Init repo
aggit init .
# Configure identity + repository metadata
aggit author -n "Jane Doe" -e "jane@example.com"
aggit repo my-repo -d "Agent artifacts" -t agents -t storage
# Local workflow
echo "hello" > notes.txt
aggit add notes.txt
aggit commit -m "initial commit"
aggit status
# Configure first S3 origin
aggit origin create prod \
-e https://s3.example.com \
-s <SECRET_KEY> \
-k <KEY_ID> \
-r us-east-1
# Push
aggit push prodThis project is provided under MIT license.