feat: accept passwords for encrypted OOXML files
PA
9d ago+497+497+012345678901234567890123456789-42-42-01234567890123456789
Problem
Callers who know the password for an encrypted Office document cannot convert it through anydoc's bindings or CLI.
Solution
Decrypt encrypted OOXML before detecting and parsing its inner format. Expose optional passwords in Rust, Node, Python, and Wasm, plus --password and ANYDOC_PASSWORD in the CLI. Node Markdown functions accept options.password alongside the existing OCR options; Python Markdown functions accept password=. Existing calls keep their behavior.
Closes #102
Validation
cargo fmt --all --checkcargo clippy --workspace --all-targets --all-features -- -D warningscargo test --locked: 302 passed; one local-samples test ignored- Node release build and all 25 tests passed
- Python release wheel build and all 14 tests passed
- Real encrypted Excel fixture checked against its expected cell values and text
- Independently encrypted a real Excel workbook with msoffcrypto-tool; decrypted Python output matched the original workbook exactly, including dates, currency, percentages, and merged cells
- CLI converted the independently encrypted workbook from both a file and stdin with an explicit XLSX format; missing and wrong Excel passwords returned encrypted errors
- Extensionless and .bin-renamed encrypted Excel files convert; the regression failed before the fix and passes afterward
- Focused independent Standards and Spec delta reviews of
67933fa..f78a00bfound no blockers; no initial full-review baseline was supplied - Wasm crate passed workspace Clippy on the host; Wasm build and execution remain for CI because the local target is unavailable
Changes were made with openai/gpt-6.1-sol through the Codex harness in T3 Code.