プログラミング
Show HN: Docx-CLI: エージェントがWord文書を半分の時間とトークンで読み書き
Show HN: Docx-CLI: agents read/edit Word docs using 1/2 the time and tokens (github.com)
要約
Docx-CLIは、AIエージェントがWord文書(.docx)を効率的に読み書きするためのコマンドラインインターフェースです。フォーマットを維持しつつ、コメントの追加、変更提案(redlines)、編集を可能にし、人間がWordで最終確認できます。AIがOOXMLを直接操作する代わりに、構造化されたコマンドとMarkdownビューを使用するため、トークン消費が少なく、Wordで開けないファイルが生成されるリスクが低減されます。
全文翻訳
docx-cli
AIエージェントのために構築された.docx CLI。
フォーマットを壊したりコンテンツを失ったりすることなく、コメントを残したり、変更を提案したり、Word文書を編集したりできます。人間が後でWordで承認または却下します。
ClaudeやCodexに.docxを渡すと、コメント付きの赤線(redlined)コピーが返ってきます。それをWordで開くと、通常通り承認または却下できます。
エージェントは、文字オフセット付きの安定したロケーター(p3:5-20)でテキストを処理します。人間はディスク上の通常のWordフォーマットを見ます。
カスタムスタイル、テーマカラー、埋め込みオブジェクトなど、すべてがそのまま残ります。
CLIは、損失のあるモデルから再生成するのではなく、XMLをインプレースで変更します。
なぜdocx-cliなのか?
エージェントがWord文書を編集するデフォルトの方法は、.docxを解凍して内部のOOXMLを直接書き込むことです。これには強力なモデルが必要で、トークンを消費し、通常はWordで開けないファイルが生成されます。
docx-cliは、エージェントにプレーンなコマンドと注釈付きMarkdownの読み取りビューを渡すため、XMLについて推論する必要がありません。
測定しました — 管理されたA/Bテスト:6つの実際の文書タスク(NDAの記入、請求書の記入、履歴書の再スタイル設定、契約書の赤線引き、契約書の最終化、ジャーナルの作成)、同じ開始ファイル、およびWordでレンダリングされたページから各結果を採点する独立した審査員。
各モデルティア(Haiku(弱い、安い)、Sonnet(強い))で各アーム3回実行。
| docx-cli default skill | docx-cli default skill |
|---|---|
| Tasks solved (of 6) 4.3 (4–5) | 0.7 (0–1) |
| Rendered correctly (of 6) 6 | 3.7 |
| Outright-broken documents 0 | ~1/run (up to 2) |
| Input tokens 2.4M | 6.1M (2.6×) |
| Wall-clock 924 s | 1,882 s (2.0× slower) |
| docx-cli | docx-cli |
|---|---|
| Tasks solved (of 6) 6.0 (6–6) | 4.0 (4–4) |
| Rendered correctly (of 6) 6.0 | 4.7 |
| Outright-broken documents 0 | 0 |
| Input tokens 1.6M | 3.6M (2.2×) |
| Wall-clock 1,175 s | 2,029 s (1.7× slower) |
正確性のギャップは、安価なHaikuティアで最も大きくなっています(約6倍)。フロンティアモデルでもそれを埋めることはできません。デフォルトスキルは4/6でキャップされ、契約書の赤線引きと履歴書のタスクをSonnetの各実行で失います。
コストと速度のペナルティはモデルに依存しません。トークンは約2.2〜2.6倍、両ティアで約1.7〜2倍遅くなります。トークン/時間の範囲は重複しません。
Wordはデフォルトスキルの作業を確実に開くことができませんでした。36個の出力のうち5個を開けませんでしたが、docx-cliのすべての36個は最初の試行で開きました。
完全な方法論、タスクごとのルーブリック、およびサイドバイサイドレンダリング:ベイクオフの書き込み。
インストール
npm — 最も簡単な方法(Bun >= 1.3が必要):
bun add -g bun-docx
# またはインストールせずに実行:
bunx bun-docx read doc.docx
スタンドアロンバイナリ(Bun不要)。
各リリースは、プリビルドバイナリとSHA256SUMSマニフェストを公開します。インストーラーは、インストール前にバイナリのSHA-256を検証します。
curl -fsSL https://raw.githubusercontent.com/kklimuk/docx-cli/main/install.sh | sh
PREFIX(デフォルト$HOME/.local/bin)とVERSION(デフォルトlatest)を尊重します。
linux/x64、linux/arm64、darwin/x64、darwin/arm64、windows/x64用にプリビルドされています。
最初に確認したいですか?最新リリースからdocx-<platform> + SHA256SUMSをダウンロードし、検証し、chmod +xしてPATHに配置します。
簡単な例:NDAの記入
リポジトリには、tests/fixtures/mnda.docxにCommon Paper Mutual NDAテンプレートが含まれています。
以下は、エージェントがカバーページを記入し、赤線編集を残すために構成するプリミティブです。ビデオに示されているのと同じフローです。
各コマンドはフィクスチャに対してエンドツーエンドで検証されました。
# まずコピーを作成 — 元に戻すことはできません(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 replace mnda-filled.docx "fill in state" "California"
docx replace mnda-filled.docx "Fill in, if any." "None."
# 記入すべきものが残っていないか確認する(ベアロケーター行、一致ごとに1行。何もなければ終了コード0)
docx find mnda-filled.docx '[(Fill|fill)[^]]*]' --regex --all
# 赤線引きパスのために変更履歴をオンにする
docx track-changes mnda-filled.docx on
# 使用と保護条項の "having a reasonable need to know" をタイトにする
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を開きます:変更履歴とコメントがレビューペインに表示され、承認、却下、または返信の準備ができています。
または、CLIからそれらを適用するために docx track-changes accept mnda-filled.docx --all を実行します。
エージェントスキルとしての使用
docx-cliはエージェントスキルとして提供されます — Claude Code、Codex、Pi、およびオープンなスキル形式を読み取る他のハーネス全体で機能する1つのSKILL.md。
スキルはロケーターモデルと赤線/コメント/記入ワークフローを教え、実行時に docx <command> --help に委譲するため、古くなることはありません。
なぜスキルなのか?
docx-cliは最も弱い、最も安価なエージェントのために構築されています。私たちの弱いエージェントベンチマーク(6つの実際の文書タスク(契約書の記入、赤線引き、コメント、再スタイル設定、ゼロからの作成)、Wordレンダリングに対して採点、各3回実行)では、Haikuがdocx-cliを駆動した場合、デフォルトのClaudeスキルで0.7/6だったのに対し、4.3/6のタスクを完了しました。トークンは約2.5倍少なくなっています。Sonnetでは6/6対4/6で、トークンは約2倍少なくなっています。
そして、docx-cliのすべての出力は最初の試行でWordでクリーンに開かれました — レンダラーが拒否するファイルを生成することはありません。(方法論とハーネス:.claude/skills/weak-agent-test。)
インストール
任意の(skills.sh)エージェント — 1行のクロスハーネスコマンドで、使用中のエージェントにインストールされます。
npx skills add kklimuk/docx-cli
Claude Code — 1行のプラグインインストール:
/plugin marketplace add kklimuk/docx-cli
/plugin install docx-cli@docx-cli
Codex — マーケットプレイスを追加します(プラグインのスキルは自動検出されます):
codex plugin marketplace add kklimuk/docx-cli
Pi — 1コマンドインストール(package.jsonのpiマニフェストがスキルをプルします)、その後 /skill:docx-cli: を呼び出します。
pi install git:github.com/kklimuk/docx-cli # グローバル;プロジェクト(チーム共有)インストールには -l を追加します。
# 手動代替:pi --skill /path/to/docx-cli/skills/docx-cli
任意のハーネス / 手動 — skills/docx-cli/ をエージェントのスキルディレクトリ(例:~/.claude/skills/ またはクロスツール ~/.agents/skills/)にドロップします。
最初の起動時に、スキルのscripts/bootstrap.shがdocxバイナリをインストールします(そして古いものを自己更新します)。
スキルを最新の状態に保つ
バイナリが真実の情報源です: docx info skill は、インストールされたバージョンの正規のSKILL.mdを印刷し、コミットされたコピーがドリフトした場合、CIテストは失敗します。
変更後は次のコマンドで再生成します。
docx info skill > skills/docx-cli/SKILL.md
docx <command> --help は権威ある契約です
エージェント:呼び出しを構成する前に docx <command> --help を実行してください。
各コマンドの --help は、フラグ、ロケーター形式、および正確な出力形状の真実の情報源です — このREADMEはマップであり、領土ではありません。
さらに2つの必読項目:
docx info locators — 正規のロケーター文法(マシン可読形式の場合は --json)。
トップレベルの docx --help はそれを直接述べています:「エージェントは、その機能性を理解するために docx info locators を実行することを強く推奨します。」
docx info schema — read --ast が出力するAST型定義(TypeScriptソースの場合は --ts)。
コマンドリファレンス
docx <verb> および docx <noun> <verb>。
各コマンドには --help があります。
2つのグループ:read/queryコマンドは標準出力にデータを表示します。mutateコマンドはファイルを変更します(そして --dry-run, -o/--output PATH, -v/--verbose を受け入れます)。
読み取りとクエリ(標準出力に表示、ファイルを書き込まない)
docx read FILE [--from LOC] [--to LOC] [--accepted | --baseline | --current] [--comments]
docx read FILE --ast # Markdownの代わりにJSON-AST(markdownのみのフラグを無効にする)
docx find FILE QUERY [--regex] [--ignore-case] [--all] [--nth N] [--current | --baseline] [--exact] [--json]
docx find FILE (--highlight COLOR|any | --color HEX | --bold | --italic | --underline) [--all] [--json] # フォーマットで検索(QUERYなし)
docx wc FILE [LOCATOR] [--accepted | --baseline | --current] [--json]
docx outline FILE [--style-prefix S] [--json]
docx styles FILE [--used] [--at STYLEID] [--json]