1仕組みと動作原理
.docxを「ZIPコンテナ + OOXML」として扱い、タスク種別に応じて3つの技術ルートに分岐:新規作成はnpm docx-jsによるプログラム生成、既存編集はunzip→XML編集→zipの外科技術、読み取りはpandocを採用。
A `.docx` is a ZIP archive of XML files. Choose your approach by task:
作成側にはアンチフットガン(危険回避)のgotchaナレッジ一式(A4デフォルトページ、表の二重幅設定、ShadingType.CLEAR、リストnumbering、ImageRun type、PageBreakの位置、PositionalTabのリーダー線など)が組み込まれ、WordとGoogle Docsの描画差異がルール化されている。
**Table shading:** use `ShadingType.CLEAR`, never `SOLID` (renders black).
編集側ではテキスト変更前にrunの正規化を実施:Wordは1文を大量の`<w:r>` runに分割するため、merge_runs.pyで隣接する同一書式のrunを統合し、XML上での安全な検索・置換を可能にする。
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
検証ループは「画像レンダリング確認 + XSDバリデーション」の2系統:sofficeでPDF変換→pdftoppmで画像化→モデルによる画像Readで視覚的QAを実施。validate.pyでスキーマ/リレーション/変更履歴の整合性を検査。
python scripts/office/validate.py out.docx --original doc.docx # XSD checks; --auto-repair fixes common issues
変更履歴(redline)専用の検収ツールを配備:validate.pyの--authorモードにより、すべての変更が`<w:ins>`/`<w:del>`で囲まれているかを検証し、「変更したのに履歴に残らない」事故を防止。
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
コメント機能は「6ファイル連動」で構成:comment.pyが4つのcomments XML + relationships + content-type overridesを自動生成し、document.xmlへ挿入すべきアンカーコードを出力。
The script writes `comments.xml`, `commentsExtended.xml`, `commentsIds.xml`, `commentsExtensible.xml`, the relationships, and the content-type overrides.
外部からの信頼できない.docxに対する明確な防御策:解凍後にシンボリックリンク項目を削除(Zip Slip脆弱性の攻撃面を排除)。
find unpacked -type l -delete # strip symlink entries — docx from external parties is untrusted
2コア機能
3外部依存関係
| 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 容器) |
4推奨統制措置と判定根拠
- scripts/: ローカルスクリプトおよびコマンドの実行: merge_runs.py / comment.py / accept_changes.py / validate.py / soffice.py
- 本地工作目录: ファイルの読み書きと成果物出力: 出力/中間 .docx(unzip解凍ディレクトリ、zip再圧縮、out.docx)
5二重目の独立検証
- [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' 一致。
6結論
054b66c290295197…