
2026/07/08 3:19
Show HN: Docx-CLI:エージェントがワードドキュメントの読み取り・編集に所要時間とトークン数を半分にし、対応しています
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
元のサマリーは、核心となる「これをなぜ使用するのか」というメッセージについては高品質ですが、インストール方法やコマンド、読み込み形式などを含む「Key Points List」の具体的なかつ技術的な広がりを持たせていません。これらの欠けている要素を含めながら、明確さを保つため拡張を行います。
Improved Summary:
docx-cli ツールは、安定した XML マューターを活用することで AI エージェントが Word ドキュメント (.docx) を信頼して編集できるようにし、人間による確認を伴うフォーマット保存を確保するとともに、デフォルトのエージェントスキルで観測される約 14% のファイル破損率を排除します。標準的な可視化レンダリング手法とは異なり、docx-cli は正確な文字オフセットロケータ(例:p3:5-20)を使用してドキュメント構造を解釈し、LaTeX 方程式、コードブロック、GFM タスクリストといった高度なコンテンツ形式をサポートすると同時に、マルクス解析エラーを誘発しません。パフォーマンステストの結果、docx-cli はデフォルトのスキルよりもはるかに多くのタスクを解決します(最多で 6/6 の成功対フロンティアモデルの 4/6)のに対し、トークン使用量を半減以上させ、生成されたすべてのファイルが初回試行で Microsoft Word で正常に開くことを保証します。柔軟な agent skill として設計されており、Claude Code、Codex、Pi というプラットフォームとクロスハーネスコマンドを通じて統合され、read(GFM マルクスまたは JSON AST を出力)、query、mutate(インプレイス XML エディティングのため)を含む包括的なコマンドスイートを提供します。npm(Bun >= 1.3)でのインストールがサポートされており、Linux、macOS、Windows 向けのスタンドアロンバイナリも提供され、SHA256 検証を備えています。これによりスタイル、テーブル、画像、ヘッダー/フッター、コメント、修正履歴への完全な制御を提供しつつ、レイアウトの破損を防ぎます。本文
docx-cli: AI エージェントのためのドキュメント編集 CLI ツール
AI エージェント向けに構築された
.docx コマンドラインインターフェース(CLI)です。
コメントを追加し、赤線(Trace)編集を提案しながら Word ドキュメントを編集する際に、フォーマットを崩したりコンテンツを失ったりすることなく作業を行います。その後、人間が Word で最終的な受諾または拒否を決定できます。
特徴と仕組み
- 人間に近い出力: Claude や Codex に
ファイルを渡すと、コメント付きの赤線版コピーを受け取れます。Word で開き、通常通り受け入れるか拒否してください。.docx - 安定した位置指定: エージェントは**文字オフセット(例:
)**という安定した位置指定子を用いてテキストにアクセスし、人間はディスク上の通常の Word フォーマットを見ることができます。p3:5-20 - フォーマットの維持: カスタムスタイル、テーマカラー、埋め込みオブジェクト — すべてが維持されます。
- 効率的な変異: CLI は失効するモデルから再エミッションをするのではなく、XML をその場に変異(mutate)させます。
なぜ docx-cli か?
エージェントが Word ドキュメントを編集するデフォルトの方法は、
.docx を解凍して OOXML を手書きで編集することです。これは強力なモデルが必要であり、トークンを消費し、通常 Word で開けないファイルを生成することがあります。
- docx-cli の利点: エージェントに単なるコマンドと注釈付きの Markdown リードビューを提供するため、XML に関する推論を行う必要がありません。
実証データ:A/B テストの結果
制御された A/B テスト(6 つの実際のドキュメントタスク)を実施しました。独立した審査員が Word レンダリングページの各結果を評価し、モデル階層ごとの 2 つのレベルで 3 回の実行を行いました。
| 指標 | Haiku(軽量・低コスト) (docx-cli デフォルトスキル) | Sonnet(高性能) (デフォルトスキル) |
|---|---|---|
| 解決率 | 4.3 (4–5)/6 解決 | 4.0 (4–4)/6 解決 |
| Word 開き率 | 6/6 レンダリング正常 0 完全に破損したドキュメント | 4.7/6 レンダリング正常 ~1/run 破損したドキュメント |
| 入力トークン | 2.4M | 3.6M (約 50% 増加) |
| ウォールクロック | 924 s | 2,029 s (約 2 倍遅い) |
主要な発見
- 正解のギャップ: 低コストな Haiku レベルで最も広く(約 6 倍)。フロンティアモデルはそれを埋めることができません — デフォルトスキルは最大 4/6 に達し、Sonnet の各実行ごとに契約書の赤線編集とレジュメを失います。
- コストとスピードのペナルティ: モデルに依存しない — 両方の階層で約 2.2〜2.6 倍多くのトークンと約 1.7〜2 倍遅いです。
- Word の信頼性: Word はデフォルトスキルの作業を正常に開けることができませんでした(36 件中 5 件を開けませんでした)。docx-cli のすべての 36 件は 1 回目で開きました。
[完全な方法論、タスク別基準、並置レンダリング:テスタメントの記録] (参照)
インストール
1. npm / Bun
Bun >= 1.3 を必要とします。
bun add -g bun-docx # またはインストールなしで実行: bunx bun-docx read doc.docx
2. スタンドアロンバイナリ
Bun は不要です。プリビルトされたバイナリを使用します。
curl -fsSL https://raw.githubusercontent.com/kklimuk/docx-cli/main/install.sh | sh
- PREFIX: デフォルト
$HOME/.local/bin - VERSION: デフォルト
latest
クイック例:NDA の記入
レポジトリには Common Paper Mutual NDA テンプレート (
tests/fixtures/mnda.docx) が含まれています。以下はカバーページを埋め込み赤線編集を残すためにエージェントが作成するプリミティブです。
# まずコピーを作成します — やり直しはありません (git が履歴であり、CLI はその場を上書き) cp tests/fixtures/mnda.docx mnda-filled.docx # エージェントがプレースホルダーを知るためにカバーページのテーブルを読み取る docx read mnda-filled.docx --from t1 --to t1 # 黄色でハイライトされたかっこ内のプレースホルダーを記入する docx replace mnda-filled.docx "Fill in: today's date" "May 6, 2026" docx replace mnda-filled.docx "fill in state and/or county" "California" # リッド変更のためにオンに切り替える docx track-changes mnda-filled.docx on # 「Use & Protection」節内のフレーズを縮める docx replace mnda-filled.docx \ "having a reasonable need to know" \ "with a documented need to know" # 人間審査員向けのコメントを残す — --at で既存のスパンにアドレスする docx comments add mnda-filled.docx --at p7:0-30 \ --text "Should we narrow 'representatives' to a named list?" # Word で mnda-filled.docx を開く: # リッド変更とコメントはレビューウィンドウに表示され、受け入れるか拒否するか返信する準備ができている。
エージェントスキルとして使用
docx-cli はエージェントスキルとして出荷されています。SKILL.md ファイルを読み取るハーネス(Claude Code, Codex, Pi など)で機能します。
インストール方法
- あらゆるエージェント (skills.sh):
npx skills add kklimuk/docx-cli - Claude Code:
/plugin marketplace add kklimuk/docx-cli /plugin install docx-cli@docx-cli - Codex:
codex plugin marketplace add kklimuk/docx-cli - Pi:
pi install git:github.com/kklimuk/docx-cli # グローバル
最新の状態に保つ
バイナリが真のソースです。コミットされたコピーがドリフトした場合 CI テストは失敗します。
docx info skill > skills/docx-cli/SKILL.md
重要:
は権威ある契約です。エージェントはコールを構成する前にこれを必ず実行してください。各コマンドのdocx <command> --helpがフラグ、ローケーター形式、正確な出力形状の真のソースです。--help
コマンド参照
基本構文
docx <verb> と docx <noun> <verb> の 2 形式があります。すべてのコマンドに --help があります。
- リード&クエリー: データを stdout に印刷します(ファイル書き換えなし)。
- 変異コマンド: ファイルを変更します(
、--dry-run
を支持)。-o/--output PATH
リード&クエリー (stdout 出力)
docx read FILE [--from LOC] [--to LOC] [--accepted | --baseline | --current] [--comments] docx read FILE --ast # JSON-AST 代わりに Markdown(Markdown のみフラグを無効化) docx find FILE QUERY [--regex] [--ignore-case] [--all] docx find FILE (--highlight COLOR) [--all] # フォーマットによる検索(QUERY なし) docx wc FILE [LOCATOR] [--json] docx outline FILE [--style-prefix S] [--json] # インデントツリー docx styles FILE [--used] [--at STYLEID] docx styles --catalog # 組み込みスタイル一覧 (Title, Heading1–9...) docx images list FILE docx hyperlinks list FILE
変異 (FILE をその場で変更)
- Core:
,docx create
,docx insert
,docx editdocx delete - Replace & Batch:
docx replace FILE PATTERN REPLACEMENT [--regex] [--all] [--limit N] # バッチ処理 (JSONL) の例: docx edit FILE --batch fills.jsonl docx insert FILE --batch additions.jsonl docx replace FILE --batch script.jsonl
コメント・脚注・ヘッダー操作
コメント
docx comments add FILE --at LOCATOR --text "..." [--author NAME] docx comments reply FILE --at cN --text "..." docx comments resolve FILE --at cN docx comments delete FILE --at cN docx comments add FILE --batch reviews.jsonl # JSONL: { at | anchor, text, author? }
脚注・末尾脚注
docx footnotes add FILE --at pN[:offset] (--text "..." | --markdown TEXT) docx footnotes edit FILE --at fnN (--text "..." | --markdown TEXT) docx endnotes add FILE --at pN[:offset] (...), delete, edit
ヘッダー・フッター (marginals)
# セクション sN に設定します (--type default|first|even/odd / --first-page etc.) docx headers set FILE [--at sN] [--text "..."] [--align left] [--page-number] [--style-ref STYLE] [--field filename|title] docx footers set FILE … # 同一フラグ(kind=footer) # クリア docx headers clear FILE [--at sN]
画像・ハイパーリンク・リスト・テーブル
- 画像:
,extract
,replace
を使用。delete
で Word のキャプションスタイルを追加可能。--caption - ハイパーリンク:
,add
(replace
),--with URL
。delete - リスト:
(FMT: decimal, lower-alpha, upper-roman など)。docx lists set FILE --at pN [--start N] [--format FMT] - テーブル:
,insert-rowinsert-column
,mergeunmergeset-widths
(style: single|double|none)borders
(valign, halign, style ID など)format
リッド変更管理
docx track-changes on|off FILE docx track-changes list FILE [--json] docx track-changes accept FILE (--at tcN | --all) # ファイルを finaliza せずに一括適用 docx track-changes reject FILE docx track-changes apply FILE # 元の id に対して決断リストを一呼いで適用(再番号化せず)
ローケーター (Locator) と ID の発見
位置指定の形式
- ブロック:
(段落),pN
(テーブル),tN
(セクション)。sN - スパン:
(文字範囲),pN:S-E
(全パラグラフ範囲)。pN-pM - セル:
(row R, col C のセル内の段落 K)。tN:rRcC:pK
Offset セマンティクス: Character オフセットは 0-based、start-inclusive、end-exclusive です(例:
p3:5-20 は paragraph 3 のインデックス 5..19 の文字)。
ID の発見
各リスト動詞 (
list) が bare JSON array を印刷し、各アイテムの id は --at に渡すハンドルです。
| Id タイプ | 例 | 発見コマンド |
|---|---|---|
| ブロック | , | , (heading pNs), |
| コメント | | |
| 脚注/末尾 | / | / |
| 画像 | | |
| ハイパーリンク | | |
| リッド変更 | | |
jq を通じたフィルタ例:
docx comments list doc.docx \| jq '.[] \| select(.author=="Jane")'
出力契約 (Output Contract)
CLI は非インタラクティブエージェントのために構築されています。Exit コード 0 は成功シグナルです。
| Exit Code | 意味 | エラーコード例 |
|---|---|---|
| 0 | 成功 | — |
| 2 | Usage / Bad locator | , |
| 3 | 対象が見つからない | , など |
| 1 | 一般的な失敗 | , , など |
- エラーは
JSON を stdout に印刷し、非ゼロ exit を持ちます。{code, error, hint?}
フィールドは成功時 (ok
含む) に--verbose
と表示されます。{ok:true, ...}
デフォルト出力形状
| コマンドクラス | デフォルト stdout (success) | --verbose |
|---|---|---|
| 新しいハンドルを生成 (comments add→cN, footnotes add→fnN, insert→pN 等) | bare locator(s)、各一つ(multi-block は複数) | full ack |
| 新しいハンドルなし (edit, delete, replace, track-changes toggle/accept など) | 一行確認 — (例:, ) | full ack |
| find | matched span locators、各一つ(no matches → nothing, exit 0) | → JSON オブジェクト |
| wc | bare count (whole-doc は section columns を追加) | → |
| read | GFM Markdown;各段落は一度 pN ローケーターを運ぶ | → JSON AST body |
メモ:
,find,replaceなどは同じwcflags を尊重し、オフセットがコマンド間で一貫性を保ちます。--accepted/--baseline/--current
仕組み (Under the Hood)
- その場 XML 変異:
が返す AST は別モデルではなく、パースされた XML ツリー上のビューです。編集は基盤の XML ノードを直接変異させ、再シリアライズします。カスタムスタイルやテーマカラーなどの未記述領域は失われません。read - JSX for エミッター: OOXML フラグメントを imperatively 構築する代わりに、新鮮な XML は JSX で作成されます(
のような構文)。<w.rPr><w.b/></w.rPr> - リッド変更:
が設定されている場合、<w:trackChanges/>
はネイティブinsert/edit/delete/replace
を出力します。<w:ins>/<w:del>
やimages replace
についてはhyperlinks
オーディットコメントを出力します。[docx-cli] - Rich コンテンツ:
- 画像: Path、Data URI、URL を受け付けます。HEIC → JPEG transcode。非公開リダイレクトは拒否。
- 方程式: OOXML
↔ LaTeX round-trip(temml 経由)。<m:oMath> - コードブロック: GFM 囲みブロックで折り返します。
- Literal テキスト - パーサーフリーチャネル:
/create --text-file PATH
を使用すると、改行ごとに新しい段落が作られ、Markdown の解釈(リンク作成、強調など)は適用されません。プロースの正確なままを挿入したい場合に最適です。insert --text-file PATH - ドキュメントワイドフォント:
は、docx styles set-default-font FILE "Times New Roman"
とテーマフォントスキームの両方に設定し、実 Word が解決します。<w:docDefaults> - Visual 検証:
は唯一外部 runtime (Word/LibreOffice) や bundled WASM (docx render
) を必要とするコマンドです。pdfium
スタックとコントリビュート
技術スタック
- Runtime: Bun (node:util parseArgs, JSX, native zlib)
- Parser: jszip + fast-xml-parser / builder
- Markdown: unified + remark-parse/gfm/math
- Math: temml (MIT) LaTeX → MathML ↔ OMML アダプター
- Render: @hyzyla/pdfium (WASM) for PDF rasterization
- Quality: Biome + Knip + tsc;LibreOffice headless for CI
コンタクト
詳細なアーキテクチャ概要や開発セットアップについては、
CONTRIBUTING.md を参照してください。