Query entries without decoding
find applies glob filters to normalized entry metadata. Content is never decoded, so path discovery stays cheap even on multi-gigabyte archives.
v0.5.0 · MIT · Rust
A unified archive access layer for AI agents and humans. Inspect and stream archive contents before choosing to extract them.
v0.5 ships as source — no crates.io package or prebuilt binaries yet. RAR support statically links libarchive; see Download for platform dependencies.
The same arcthis <command> <archive> [entry] shape works across ZIP, 7z, RAR, TAR and the single-stream codecs. Every session below is real output from Arcthis 0.5.0.
find applies glob filters to normalized entry metadata. Content is never decoded, so path discovery stays cheap even on multi-gigabyte archives.
grep streams regular files with entry-size, line, match-count and binary bounds. Nothing is written to disk while you search.
hash pipes one entry through SHA-256 or SHA-512; verify checks the structure and every readable entry in a single full-stream pass.
pack, extract and convert emit typed --dry-run plans, stage into a sibling location, verify, and only then commit.
Repeatable --within descends through inner archives as bounded in-memory sources — up to 8 levels, no named temporary file ever created.
Every query command speaks schema-versioned JSON on --json: stable fields, typed errors on stderr, deterministic exit codes.
Detection is content-first: misleading extensions never override valid signatures. Backends own format quirks; commands see one uniform model with honest capability flags.
| Format | Access / extract | Create | Access model |
|---|---|---|---|
| zip | Stored/Deflate, including ZipCrypto/AES decryption | Deflate, unencrypted | Random entry access |
| 7z | Yes, including AES decryption | LZMA2, unencrypted | Block/solid dependent |
| rar / rar5 | Read/extract through libarchive | read-only | Sequential |
| tar | Yes | yes | Sequential |
| tar.gz / tgz | Yes | yes | Sequential decompression |
| tar.bz2 / tbz2 | Yes | yes | Sequential decompression |
| tar.xz / txz | Yes | yes | Sequential decompression |
| tar.zst / tzst | Yes | yes | Sequential decompression |
| gzip | One implicit entry | yes | Sequential |
| bzip2 | One implicit entry | yes | Sequential |
| xz | One implicit entry | yes | Sequential |
| zstd | One implicit entry | yes | Sequential |
schema_version: "1". Field names and types are a public, versioned interface.read emits raw entry bytes and rejects --json.inspect reports capabilities like random_access and solid, so an agent can reason about what an operation will cost.{ "schema_version": "1", "archive": { "path": "dataset.zip", "path_lossy": false, "format": "zip" } }
Untrusted archives are hostile input. Every write path is conservative, validated and transactional — convenience flags exist, but they are always explicit.
Extraction rejects .., absolute paths, Windows drive/UNC prefixes, NUL bytes, and links that could escape the destination.
Output lands in a sibling staging location and commits only after every entry succeeds. A failure never leaves a partial result posing as success.
Existing destinations are refused unless you pass exactly one explicit policy: --overwrite, --skip-existing or --rename.
--delete-source runs only after perform → finalize → verify → commit. Any error, interrupt or failed verification keeps the source.
2025-06-18, with strict stdout separation.--allow-root.--allow-output-root policy.Build v0.5.0 from source and inspect your first archive in under a minute.