文档 · v0.6.0 · schema_version "2"

CLI 用法说明, 以已实现的为准。

本页对应 0.6.0(schema 2);0.5.1 使用 schema 1,升级前请核对接口迁移。还在规划中的功能会标记 planned。完整长篇指南是仓库里的 START.zh-CN.md。

命令语法

一套与格式无关的语法。没有 ZIP 专属或 TAR 专属的一级命令。

grammar
arcthis <command> <archive> [entry] [options]

默认工作流是先访问,再解压:inspect → tree/list → stat/read → 只 extract 真正需要的内容。完整解压始终是显式操作。

输出规则

两种输出严格分开,让脚本和 AI Agent 可以安全地调用 Arcthis。

  • stdout 只承载结果数据;stderr 承载诊断、警告与进度。
  • --json 让支持的命令输出给程序读取的 JSON;read 始终输出原始文件内容,并且拒绝 --json。
  • JSON 输出和不接终端时的输出都不含颜色等终端装饰。在终端里可以用 --no-color 或 NO_COLOR 关闭颜色。
  • 管道另一端的程序提前退出(比如 | head)不算错误 —— arcthis read a.zip big.bin | head 的退出码为 0。
  • 非 UTF-8 的文件名会通过 path_encoding 字段如实标出;默认抽取拒绝未解码名字,可显式 --encoding 严格解码后再检查。

全局选项

放在子命令之前,出自 arcthis --help。

选项默认值含义
--json关在支持的命令上输出稳定的机器可读 JSON
--no-sync默认逐文件 fsyncextract/extract-all/convert 跳过逐文件 fsync;保留暂存与回滚,降低掉电耐久性
--entry-index <N>—精确选择 stat/read/hash/extract 的实例,仅作用于 within 最终层
--encoding <name>—严格 utf8/cp437/gbk/shift-jis 解码,继续检查路径与冲突
--stdin-name <name>stdin只读标准输入源 - 的虚拟文件名
--max-stdin-bytes <bytes>64 MiB限制实际缓冲的 stdin 压缩字节
--no-color关禁用终端颜色装饰
--within <entry>—进入压缩包内的某个压缩包;可重复使用以逐层深入(最多 8 层)
--max-nested-entry-size <bytes>268435456嵌套压缩包中单个文件允许占用的最大内存(字节)
--password-file <path>—从文件读取压缩包密码(自动去掉行尾换行);密码绝不直接写在命令行里
--volume <path>—添加一个分卷压缩包文件;需按分卷顺序逐个添加
--index-directory <path>平台缓存目录更改索引文件的存放位置(默认用系统缓存目录)

命令

命令签名来自实际 CLI,说明来自 arcthis --help。

inspectarcthis inspect <archive> [--json]

展示压缩包的基本信息、能力和风险提示:文件数量、大小、压缩率,以及 random_access(能否随机读取)、solid(是否整体压缩)、encrypted(是否加密)等能力标记 —— 足以让 Agent 在执行前估算一次操作要付出的代价。

listarcthis list <archive> [--json]

保留归档顺序与全部重名实例,包括 ZIP。命名访问遇到歧义返回 collision;--entry-index 按 archive_index 选择实例。

treearcthis tree <archive> [--json]

以文件树展示压缩包内容。JSON 输出为嵌套的 tree 数组。每条路径最多 4096 字节、256 层,超限返回 resource_limit。

statarcthis stat <archive> [entry] [--verbose] [--json]

展示条目元数据;--verbose 增加原始名、CRC、时间与编码信息。可按 --entry-index 选择;只有一个普通文件时可省略 entry。未知元数据为 null。

readarcthis read <archive> [entry] [--verify-first]

默认直接流式输出原始字节;CRC 失败前可能已有部分输出,必须检查退出码。--verify-first 先在匿名临时文件中完整校验,再写 stdout,实际大小默认最多 4 GiB。read --json 在读取源或密码前返回 invalid_argument/2。

findarcthis find <archive> --glob <pattern> [--json]

按通配符查找路径匹配的文件。只对完整路径做匹配,完全不读取文件内容。

greparcthis grep <archive> <literal> [--glob <pattern>] [--json]

直接搜索文件中的文字。默认单个文件最多 16 MiB、10,000 条匹配、单行保留 1 MiB。--max-result-bytes 限制跨文件的结果总量,默认 16 MiB;省略的匹配会标记 matches_truncated。默认跳过二进制文件,可用 --binary 开启。 ZIP/TAR/7z/RAR 复用一次内容遍历与有界结果预算。

hasharcthis hash <archive> [entry] [--algorithm sha256|sha512]

计算单个文件的校验值,默认 SHA-256,也支持 SHA-512。结果是小写十六进制。

indexarcthis index [archive] [--refresh|--delete|--list|--prune] [--dry-run]

有效缓存自动用于查询,archive.index_used 显示命中。--list 列出缓存;--prune 清理失效或过期索引,可配 --dry-run 和 --max-age-seconds(默认 30 天)。只操作索引目录内哈希命名的 JSON;Unix 额外核验 ctime/dev/inode。

extractarcthis extract <archive> [entry] [--output <path>] [--dry-run]

安全地解压全部内容或指定的单个文件。先完整检查一遍文件清单;解压结果先写到旁边的临时位置,全部成功后才正式保存。相关选项:--dry-run、--delete-source,以及 --overwrite / --skip-existing / --rename 三选一。 安全规范化 ./;同名与规范化后冲突仍拒绝。--no-sync 可显式降低 fsync 开销,成功删除源文件会有回执。

extract-allarcthis extract-all <directory> [--recursive] [--workers <n>]

有界并行处理,结果排序固定。--continue-on-error 隔离坏档、规划错误与路径冲突,继续执行独立好档;部分失败返回 12,JSON 保留逐档结果。dry-run 也会报告错误清单。

packarcthis pack <source> --output <archive> [--dry-run]

把文件或目录打包成压缩包并验证。先在旁边生成临时文件,再重新打开逐个校验内容,全部通过后才保存为正式结果。输出路径位于被压缩的目录内部、或与源是同一个文件,都会被拒绝。 --strip-root 只打包目录内容;输出权限遵循 umask,Gzip 写入 FNAME/mtime。

verifyarcthis verify <archive> [--json]

从头到尾完整读一遍,校验压缩包结构和每个可读文件的数据。JSON 输出会附带含 verified、entries_checked、bytes_checked 的 verification 对象。

convertarcthis convert <archive> --output <archive> [--dry-run]

把压缩包转换成另一种格式:先安全地解压到临时位置,再打包并校验。文件路径保持不变;写入磁盘前先完成资源与路径安全检查;新压缩包验证通过并正式保存后,--delete-source 才可能删除原文件。

mcparcthis mcp --allow-root <path> [--allow-output-root <path>]

提供本地 MCP 服务,协议版本 2025-06-18。授权输入目录后可用九个只读工具;授权输出目录后增加 extract、pack、convert 的六个计划与执行工具。删除源文件需服务配置和请求同时允许。 schema 2 与 CLI 共享只读结构和错误信封。只读请求可传授权根内的 password_file(最多 4096 字节),不接受明文 password;支持 entry_index。干净 EOF 退出 0;mcp --json 返回参数错误。

--max-concurrent-requests 默认 4,允许 1–64;--max-response-bytes 默认 16 MiB,计算工具结果中的 JSON 和文本副本。单次请求另有上限:--max-entries 100,000、--max-decoded-bytes 1 GiB、--max-results 10,000 条 find/grep 结果、--max-read-window 1 MiB(单次 archive_read 窗口)。超限返回 resource_limit。客户端无法提高服务端限额,MCP grep 的结果上限还受响应大小约束。

JSON 与错误

每个成功的结构化响应都是一份 JSON 文档加一个换行。各命令特有的字段会加在共享的基本结构上。

基本结构 + 文件对象
{
  "schema_version": "2",
  "archive": {
    "path": "/data/dataset.zip",
    "path_lossy": false,
    "index_used": false,
    "format": "zip"
  },
  "entry": {
    "archive_index": 42,
    "path": "train/data.csv",
    "path_encoding": "utf8",
    "path_raw_hex": "747261696e2f646174612e637376",
    "kind": "file",
    "size": 1048576,
    "compressed_size": 182341,
    "modified_time": null,
    "modified_time_local": "2026-08-27T12:00:00",
    "encrypted": false,
    "executable": false,
    "symlink_target": null,
    "crc32": "c0ffee00",
    "mime_guess": "text/csv"
  }
}

使用 --json 时,命令错误以 JSON 写入 stderr,stdout 保持为空:

机器错误 — stderr
{
  "schema_version": "2",
  "error": {
    "code": "entry_not_found",
    "message": "archive entry was not found",
    "details": { "entry": "README.md" }
  }
}

稳定错误类别:

invalid_argument not_an_archive unsupported_format invalid_archive corrupted_archive entry_not_found permission_denied unsafe_path resource_limit password_required wrong_password collision unsupported_operation verification_failed partial_failure io_error

schema 2 将 executable 改为可空,modified_time_local 与绝对 RFC3339 时间分开,path_raw_hex 保留 adapter 暴露的名字字节。solid 7z 的共享压缩大小为 null,比例限制按块计算。CLI/MCP 共用只读结构;文件源引用是绝对路径,stdin/nested 保留虚拟引用。 ADR 0002

退出码

每种错误类别对应一个固定的退出码。

退出码类别
0成功,包括 BrokenPipe 消费方停止
1一般 I/O 错误
2命令行语法 / invalid_argument
3unsupported_format / not_an_archive
4invalid_archive 或 corrupted_archive
5entry_not_found
6permission_denied
7unsafe_path
8resource_limit
9collision
10unsupported_operation、密码类错误
11verification_failed
12partial_failure

资源限制

解压时检查实际输出字节,查询与 MCP 另有调用和结果限制。

选项默认值
--max-entries100,000
--max-total-size16 GiB
--max-entry-size4 GiB
--max-compression-ratio未指定则不启用
--max-entry-duration-seconds未指定则不启用
grep --max-result-bytes16 MiB
mcp --max-entries100,000
mcp --max-decoded-bytes1 GiB
mcp --max-results10,000
mcp --max-read-window1 MiB
mcp --max-concurrent-requests4
mcp --max-response-bytes16 MiB

安全默认值

简短版;精确保证与已知限制见 docs/SECURITY.md。

  • 路径检查。统一的检查会拒绝 ..、绝对路径、Windows 盘符/UNC 前缀、NUL 字节,以及可能跳出目标目录的链接。
  • 不自动恢复链接和特殊文件。符号链接、硬链接和特殊文件默认不恢复。
  • 写入要么完整生效,要么不生效。先写临时文件再正式保存;pack 会重新打开新压缩包逐个验证,通过后才放到你指定的位置。
  • 重叠检查。所有写入都拒绝源和目标相同或互相包含;批处理同时检查不同压缩包之间的路径冲突。
  • 最后才删源文件。--delete-source 只在新文件写入、验证并正式保存之后才运行;错误、中断和验证失败都会保留源文件。dry-run 不写入也不删除。
  • 密码不出现在命令行参数里。密码只能来自 --password-file 指定的文件,在调试输出中也会被隐藏。

Planned

以下功能仍在规划中。详见 ROADMAP.md。

preview · planned 跨压缩包递归搜索 · planned RAR 原生分卷 · planned 交互式密码输入 / 密码管理器 · planned 远程压缩包 · planned