docx
Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files) or Word templates (.dotx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', '.dotx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.
1How It Works & Mechanism
Treat .docx as a 'ZIP container + OOXML' and adopt three distinct technical routes based on task type: programmatically generate via npm docx-js for creation; perform surgical unzip → XML edit → zip operations for editing existing files; and use pandoc for reading.
A `.docx` is a ZIP archive of XML files. Choose your approach by task:
The creation side embeds a comprehensive set of anti-footgun gotchas (default A4 page, dual-width table constraints, ShadingType.CLEAR, list numbering, ImageRun type, PageBreak placement, PositionalTab dot leaders, etc.), hardcoding rendering differences between Word and Google Docs into explicit rules.
**Table shading:** use `ShadingType.CLEAR`, never `SOLID` (renders black).
On the editing side, runs are normalized before text modification: Word fractures sentences into numerous `<w:r>` runs, and merge_runs.py merges adjacent identically-formatted runs to ensure reliable XML-level find-and-replace.
Word splits text across many `<w:r>` runs (revision ids, spell-check markers), so a phrase you can see in the document often doesn't exist as a contiguous string in the XML. `merge_runs.py` merges adjacent identically-formatted runs in `word/document.xml` without changing content or rendering
Validation loop utilizes a dual-track strategy of 'Render to images for inspection + XSD validation': soffice converts to PDF → pdftoppm produces images → the model reads images for visual QA; validate.py checks schema, relationship, and tracked change consistency.
python scripts/office/validate.py out.docx --original doc.docx # XSD checks; --auto-repair fixes common issues
Tracked changes (redlines) feature a dedicated acceptance tool: validate.py's --author mode verifies that all modifications are wrapped in `<w:ins>`/`<w:del>`, preventing accidental invisible edits.
it reports any text you changed without a `<w:ins>`/`<w:del>` around it, which is easy to do by accident and invisible in the accepted view
Comments are assembled across a six-file link: comment.py automatically writes 4 comments XML files + relationships + content-type overrides, then outputs the anchor snippet to insert into document.xml.
The script writes `comments.xml`, `commentsExtended.xml`, `commentsIds.xml`, `commentsExtensible.xml`, the relationships, and the content-type overrides.
Maintains explicit defensive measures against untrusted external .docx files: deletes symlink entries after unzipping to mitigate zip-slip style attack surfaces.
find unpacked -type l -delete # strip symlink entries — docx from external parties is untrusted
2Core Capabilities
3External Dependencies
| Kind | Dependency / Endpoint |
|---|---|
| package | docx(npm,docx-js) |
| cli | pandoc(读取 .docx → markdown) |
| cli | LibreOffice soffice(渲染 QA/接受修订/.doc 转换;经 soffice.py 包装) |
| cli | pdftoppm(Poppler,PDF 渲染成图) |
| cli | unzip / zip(解包与回封 OOXML 容器) |
4Recommended Governance & Evidence
- scripts/: Executes local scripts or commands: merge_runs.py / comment.py / accept_changes.py / validate.py / soffice.py
- 本地工作目录: File I/O and artifact output: output/intermediate .docx (unzip directory, zip repackaging, out.docx)
5Second-Pass Verification
- [ok] 『创建走 docx-js』路线与依赖声明 — approach 表与 Dependencies 节一致;npm 包不在仓库内(外部依赖,条件安装)。
- [ok] merge_runs 机制(runs 拆分问题) — SKILL.md 描述与 merge_runs.py docstring 相互印证,均原文在。
- [ok] redline --author 验收与 accept_changes — 两工具及用法命令行均存在于 SKILL.md,accept_changes.py 存在且 docstring 相符。
- [ok] 批注六文件机制与 templates — comment.py 写 4 个 comments xml + rels + content-type(代码 rels/ct 常量可查);templates/ 5 个 xml 模板(含 people.xml)与脚本引用一致。
- [ok] soffice.py 沙箱 shim 无外联 — C shim 仅拦 AF_UNIX socket/listen/accept 做 socketpair 回退;编译产物在 tempdir;无任何网络地址。
- [ok] 网络/凭证零命中 — 脚本层无网络调用无 env/token 读取(get_soffice_env 仅拷贝环境变量+设 SAL_USE_VCLPLUGIN/LD_PRELOAD)。
- [ok] 功能声明 vs 实现(夸大检查) — description 声称的能力均有对应命令/脚本;'Do NOT use for PDFs, spreadsheets…' 负面边界清晰。唯一无法源码证实的是环境预装假设。
- [ok] 元数据 — 本地 HEAD==pin 41bbe19;LICENSE.txt 为 Anthropic 专有条款(© 2025 Anthropic, PBC.),与 SKILL.md frontmatter 'Proprietary' 一致。
6Verdict & Scenarios
054b66c290295197…