Show HN: Docx-CLI:エージェントがワードドキュメントの読み取り・編集に所要時間とトークン数を半分にし、対応しています

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 に
    .docx
    ファイルを渡すと、コメント付きの赤線版コピーを受け取れます。Word で開き、通常通り受け入れるか拒否してください。
  • 安定した位置指定: エージェントは**文字オフセット(例:
    p3:5-20
    )**という安定した位置指定子を用いてテキストにアクセスし、人間はディスク上の通常の Word フォーマットを見ることができます。
  • フォーマットの維持: カスタムスタイル、テーマカラー、埋め込みオブジェクト — すべてが維持されます。
  • 効率的な変異: 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.4M3.6M (約 50% 増加)
ウォールクロック924 s2,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 edit
    ,
    docx 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
    を使用。
    --caption
    で Word のキャプションスタイルを追加可能。
  • ハイパーリンク:
    add
    ,
    replace
    (
    --with URL
    ),
    delete
  • リスト:
    docx lists set FILE --at pN [--start N] [--format FMT]
    (FMT: decimal, lower-alpha, upper-roman など)。
  • テーブル:
    • insert-row
      ,
      insert-column
    • merge
      ,
      unmerge
    • set-widths
    • borders
      (style: single|double|none)
    • format
      (valign, halign, style ID など)

リッド変更管理

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
    (全パラグラフ範囲)。
  • セル:
    tN:rRcC:pK
    (row R, col C のセル内の段落 K)。

Offset セマンティクス: Character オフセットは 0-based、start-inclusive、end-exclusive です(例:

p3:5-20
は paragraph 3 のインデックス 5..19 の文字)。

ID の発見

各リスト動詞 (

list
) が bare JSON array を印刷し、各アイテムの id は
--at
に渡すハンドルです。

Id タイプ発見コマンド
ブロック
pN
,
tN
read
,
outline
(heading pNs),
render page images
コメント
cN
comments list FILE
脚注/末尾
fnN
/
enN
footnotes list
/
endnotes list
画像
imgN
images list FILE
ハイパーリンク
linkN
hyperlinks list FILE
リッド変更
tcN
track-changes list FILE

jq を通じたフィルタ例:

docx comments list doc.docx \| jq '.[] \| select(.author=="Jane")'

出力契約 (Output Contract)

CLI は非インタラクティブエージェントのために構築されています。Exit コード 0 は成功シグナルです。

Exit Code意味エラーコード例
0成功
2Usage / Bad locator
USAGE
,
INVALID_LOCATOR
3対象が見つからない
FILE_NOT_FOUND
,
COMMENT_NOT_FOUND
など
1一般的な失敗
NOT_A_ZIP
,
RENDER_FAILED
,
TABLE_STRUCTURE
など
  • エラーは
    {code, error, hint?}
    JSON を stdout に印刷し、非ゼロ exit を持ちます。
  • ok
    フィールドは成功時 (
    --verbose
    含む) に
    {ok:true, ...}
    と表示されます。

デフォルト出力形状

コマンドクラスデフォルト stdout (success)--verbose
新しいハンドルを生成
(comments add→cN, footnotes add→fnN, insert→pN 等)
bare locator(s)、各一つ(multi-block は複数)full
{ok:true,…}
ack
新しいハンドルなし
(edit, delete, replace, track-changes toggle/accept など)
一行確認 —
<operation> <target>
(例:
edit t1:r0c1:p0
,
replace 3 occurrences
full
{ok:true,…}
ack
findmatched span locators、各一つ(no matches → nothing, exit 0)
--json
→ JSON オブジェクト
wcbare count (whole-doc は section columns を追加)
--json
{ words, scope, ... }
readGFM Markdown;各段落は一度 pN ローケーターを運ぶ
--ast
→ JSON AST body

メモ:

find
,
replace
,
wc
などは同じ
--accepted/--baseline/--current
flags を尊重し、オフセットがコマンド間で一貫性を保ちます。


仕組み (Under the Hood)

  • その場 XML 変異:
    read
    が返す AST は別モデルではなく、パースされた XML ツリー上のビューです。編集は基盤の XML ノードを直接変異させ、再シリアライズします。カスタムスタイルやテーマカラーなどの未記述領域は失われません
  • 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
      <m:oMath>
      ↔ LaTeX round-trip(temml 経由)。
    • コードブロック: GFM 囲みブロックで折り返します。
  • Literal テキスト - パーサーフリーチャネル:
    create --text-file PATH
    /
    insert --text-file PATH
    を使用すると、改行ごとに新しい段落が作られ、Markdown の解釈(リンク作成、強調など)は適用されません。プロースの正確なままを挿入したい場合に最適です。
  • ドキュメントワイドフォント:
    docx styles set-default-font FILE "Times New Roman"
    は、
    <w:docDefaults>
    とテーマフォントスキームの両方に設定し、実 Word が解決します。
  • Visual 検証:
    docx render
    は唯一外部 runtime (Word/LibreOffice) や bundled WASM (
    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
を参照してください。

同じ日のほかのニュース

一覧に戻る →

2026/07/08 3:24

Kokoro を活用したローカル動作・CPU対応で高品質な TTS(テキスト対話)

## Japanese Translation: 2026 年 3 月 31 日にリリースされた Kokoro-82M は、わずか 8200 万パラメータだけで英語・中国語・ヒンディー語の極めてリアルな声を生成する特段に軽量な Text-to-Speech モデルです。CPU 上で完結するように設計されており、高価な GPU の依存を回避できます(GPU はローカルの LLL推論用に留保されます)。同モデルは AMD Ryzen チップを搭載した標準的なプロセッサ、Intel Core i7 システム、Apple M シリーズ CPU にもデプロイ可能です。ベンチマーク結果では、各種ハードウェア上で合成時間が 5 秒以内となっています:Intel Core i7-4770K で約 4.7 秒、Apple M2 Pro で 4.5 秒、短かい段落では AMD Ryzen 7 8745HS で低至くとも 1.5 秒です。 最も簡単なデプロイ方法では、プリダウンロード済みの音声モデルを含む Kokoro-FastAPI コンテナイメージ(約 5 GB)を使用します。ユーザーは `podman run -p 8880:8880 ghcr.io/remsky/kokoro-fastapi-cpu` コマンドで Podman を使用してサービスを開始し、`localhost:8880/web` でウェブ UI にアクセスすることで、オーディオを直接生成・再生できます。コンテナは OpenAI 互換の音声 API を公開しており、JavaScript(`./speak.js`)および Python(`./speak.py`)スクリプトなどの実装例があります。音声モデルは環境変数 `TTS_VOICE` を使用して選択でき(全リストは HuggingFace で確認可能)、出力は MP3 ファイルとして保存され、SoX がインストールされている場合は自動再生も可能です。 音声認識と Text-to-Speech の両方が必要なアプリケーション向けには、オプションの Speaches コンテナ化サービスが Whisper とシームレスに統合され、また OpenAI API 互換性もサポートしています。リソース要求を低く抑えつつ、簡潔なデプロイオプションを提供することで、Kokoro-82M は自然で多言語の音声合成を開発者のワークフローや広範なアプリケーションに統合するためのハードルを大幅に低下させます。

2026/07/07 21:38

StreetComplete:1 つの小さなクエストで OpenStreetMap を修正していくプロジェクト

## Japanese Translation: StreetComplete は、誰でも現在地から OpenStreetMap の精度を向上させるシンプルな方法を提供します。アプリは生地図上に不足している情報を簡単な「クエスト」として表示し、利用者に特定の場所を訪れて短く質問に答えるよう促し、データギャップを埋めます。このアプローチにより、高度な編集スキルや専用ソフトがなくても OpenStreetMap が最新の状態を保つことができます。ユーザーがタスクを完了すると、その貢献は瞬時にグローバルデータベースで更新され、直ちにその名前でクレジットされます。このメカニズムにより、地図の改善は情報を収集した実際の観察者まで追跡可能になります。したがって、ナビゲーションや地域発見のためのストリートレベルの詳細はより正確かつ信頼性が高まります。究極的には、このツールはマッピングを民主化し、無関心な訪問者を能動的な貢献者に転換させます。これにより、遠隔編集や大規模な専門チームに依存することなく、簡単な現場での相互作用を通じて正確な地理データが継続的に拡張されるコミュニティが育まれます。

2026/07/07 23:23

Chat Control バージョン 1.0 と 2.0 の解説

## Japanese Translation: 欧州連合(EU)は、企業に対し、子供による性虐待資料(CSAM)を検出するために私信をスキャンすることを義務付ける有効期限を迎えた暫定権能(チャットコントロール 1.0,規制 EU 2021/1232)の復活を図ろうとしている。当初 2024 年 8 月 3 日に有効期限が切れる予定だったこの措置は、2 回延期された——最初に 2026 年 4 月 3 日(2024 年 4 月 29 日の議決)、続いてさらに 2028 年 4 月まで(2025 年 12 月 18 日の提案)。2026 年 3 月 26 日、下院での投票で改正案 34 が否決されず、その一方で不特定の写真やテキストの自動評価を禁止する改正案 34 が僅差(307 対 306)で可決されたことを受け、無効化措置に基づく自発的スキャンの法的根拠は 2026 年 4 月 4 日に終了した。にもかかわらず、主要プラットフォーム(Google、Meta、Microsoft、Snap)は自発的に引き続きスキャンを行うと発表した。 しかし、立法上の行き違いが生じている:欧州議会の LIBE 委員会は 2026 年 3 月 2 日に延期を拒否し、欧州議会は 2026 年 3 月 11 日、広範な自動分析に対する保護性指令を採用し、理事会は同年 3 月中旬に欧州議会の条件を拒否した。これに対し、EU の大使たちは 2026 年 6 月 26 日に手続の簡素化を通じて暫定復活を推進することに合意し、理事会は同年 7 月 2 日にも自らの立場を採用した。2026 年 7 月 7 日、欧州議会は緊急手続を承認するため 331 対 303 の投票を行い、その際に関連する委員会を bypass して、有効期限を迎えた特別措置を迅速処理する手続きをとった。この議題に対する法的拘束力のある投票は木曜日(7 月 9 日)に予定されており、絶対多数である 361 人の欧州議会議員の賛成が必要となる。 同時に、「チャットコントロール 2.0」と呼ばれる恒久解決策を確立するための努力も停滞している。委員会は 2022 年 5 月 11 日、プラットフォームに対し暗号化全体(エンドツーエンド)を迂回して検出と報告を行うことを求める恒久規制を提案した。2023 年 11 月、欧州議会は E2E スキャンに反対する保護性指令を採用し、視覚情報のみを対象とした分析、特定の裁判所命令の要件のみを受け入れること、また年齢認証の義務化を拒否することを要請した。2025 年 12 月から 2026 年 5 月までの 4回のトリログ(三回協議)ラウンドに加えて、2026 年 6 月 29 日の「最終」ラウンドも失敗に終わったが、チャットコントロール 2.0 に関する合意は依然として達されていない。 2026 年 6 月 10 日、理事会の法務部は、裁判所の承認なしに行われる自発的スキャンは、EU 基本権憲章第 7 条(プライバシーとデータ保護)に抵触する一般化されたスキャンであるとして警告した。恒久 CSA 規制について 5回のトリログラウンドが完了後なお合意に至らず、2025 年 10 月にドイツの議長国としての任務でリスク評価と軽減義務への重点が移行している状況において、EU は児童安全の強化とデジタル権限の維持という狭いバランスを navigate しなければならない。7 月 9 日の緊急投票は、国家関連のスキャン手続に議論を伴う形で再び導入することを強いるリスクがあり、これにより憲法上の保護や公共の信頼に関連する新たな法的課題が引き起こされる可能性がある。