fill-protocol について
既存の DOCX フォームテンプレートに入力するドキュメントスキルです。旧形式の DOC ファイルも必要に応じて変換し、ラベルによる項目照合、レイアウトの維持、未入力項目や表示上の問題の確認を行います。
主な機能
- 01既存の DOCX テンプレートへの入力
- 02旧形式 DOC ファイルの変換
- 03ラベル文字列による項目照合
- 04行構造と文字スタイルの維持
- 05出力の検証と目視確認
活用シーン
- 01YAML の内容を使った機関フォームの入力
- 02入力前の DOC テンプレート変換
- 03項目漏れとレイアウト問題の確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ aperivue/ medsci-skills --skill fill-protocolインストール後、Claude Code で/fill-protocolを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
setup.shskill.ymlexamples/example_irb_template.yamlreferences/best_practices.mdscripts/doc_to_docx.pyfill_form.pyinspect_template.pytests/test_fill_form_integrity.shtest_fill_form_newlines.shtest_fill_form.sh詳細
Fill-Protocol スキル
基本原則(必ず守ってください)
- 既存のテンプレートを開き、最初から作成しないでください。
Document()ではなくDocument(template_path)を使用してください。作り直すと、ヘッダーロゴ、カスタム余白、フッターのプレースホルダー、ページ番号が失われます。セルや段落のテキストはその場で置き換えてください。cell.text = "value"のように単一の代入を行うと、run レベルのスタイル(太字、色、eastAsia フォント)が消去されるため、絶対に使用しないでください。 - 編集の前に、LibreOffice のヘッドレスモードで .doc を .docx に変換してください。
pandoc -f docはサポートされていません。textutilはテーブル構造を破損させます(結合セルが失われます)。 - 行・列の座標(
table.cell(2, 1)など)ではなく、左側のラベルテキストでセルを照合してください。 テンプレートは変更されるため、座標による照合は気づかないうちに機能しなくなります。 - 入力したすべての行に
cantSplitを適用し、ページをまたいで行が分割されないようにしてください。 - CJK 言語では、
run.font.nameだけでなく、eastAsiaフォント属性を設定してください。 そうしないと、ハングル・漢字・漢字が代替フォントで表示されます。 - 入力操作をすべて検証してください。 入力済みフォームを提出する前に、すべての
[MISS]行とすべてのWARN:行([TABLE-MISS]、[SECTION-MISS]、[RAW-NEWLINE])を解決してください。
依存関係
Python パッケージの docxtpl python-docx pyyaml は常に必要です。LibreOffice が必要なのは、レガシーな .doc テンプレートを扱う場合のみです(macOS では約 700 MB)。同梱の setup.sh が不足しているものを検出します。
bash ${CLAUDE_SKILL_DIR}/setup.sh check # report what's installed (read-only)
bash ${CLAUDE_SKILL_DIR}/setup.sh install # install missing pieces (asks before each)
ユーザーに代わってこのスキルを実行する場合:
- テンプレートがすでに
.docxの場合は、LibreOffice を完全にスキップしてください。 doc_to_docx.pyを呼び出す前に、setup.sh checkを実行してください。LibreOffice が見つからない場合、インストールする前にユーザーに確認してください。cask のサイズは約 700 MB です。- このセッションでユーザーが無人インストールを明示的に許可していない限り、
setup.sh installに--yesを絶対に渡さないでください。渡すと確認なしでインストールされます。 - ユーザーがインストールを拒否した場合は、
.docを手動で変換するよう依頼してください(Word/LibreOffice/Pages → 別名で保存 → .docx)。その後、変換したファイルを使って再実行してください。
ワークフロー
ステップ 1 — レガシーな .doc を .docx に変換する(必要な場合)
python3 ${CLAUDE_SKILL_DIR}/scripts/doc_to_docx.py path/to/template.doc path/to/template.docx
ステップ 2 — テンプレートの構造を確認する
python3 ${CLAUDE_SKILL_DIR}/scripts/inspect_template.py path/to/template.docx
テーブル、各セル(座標と内容のプレビュー)、最上位の各段落がすべて一覧表示されます。この出力から YAML に使用するラベルを正確に取得してください。
ステップ 3 — コンテンツ YAML を作成する
${CLAUDE_SKILL_DIR}/examples/example_irb_template.yaml をベースにしてください。入力モードは 3 種類あり、すべてのキーは省略可能です。
protections:
korean_font: "맑은 고딕" # CJK font (set to "Noto Sans CJK KR", "SimSun",
# "MS Mincho", etc. for other locales)
cant_split: true # Apply <w:cantSplit/> to every filled row
# Readability options (defaults shown)
blank_between_paragraphs: true # Enter between \n\n chunks
blank_around_section_header: true # Enter above/below filled sections
blank_around_all_section_headers: false # opt-in; also touches untouched sections
normalize_page_breaks: true # empty page-break paragraphs -> pageBreakBefore
# Mode 1 — table key/value (left-label cell → right value cell)
table_kv:
"Study Title": "Multi-center prospective validation of ..."
"Principal Investigator": "Last, First (Department)"
"연구 목적": "본 연구는 ..."
# Mode 2 — section replacement (find numbered header, replace until next header)
section_replace:
"1. Background":
"Hepatocellular carcinoma is the third leading cause of ..."
"4. 연구 배경 및 이론적 근거":
"..."
# Mode 3 — single paragraph in-place text replacement
paragraph_replace:
"Title:":
"Title: Multi-center prospective validation of ..."
デフォルト値から読みやすさのオプションを変更する前に、${CLAUDE_SKILL_DIR}/references/best_practices.md(読みやすさの調整項目)を読んでください。
コンテンツのルール:/search-lit で DOI または PMID を確認できた場合のみ、参考文献を記載してください。確認できない場合は [UNVERIFIED - NEEDS MANUAL CHECK] と記してください。未確認の臨床的定義、診断基準、ガイドラインに関する主張には [VERIFY] と記し、ユーザーに確認してください。
ステップ 4 — 入力を実行する
python3 ${CLAUDE_SKILL_DIR}/scripts/fill_form.py \
--template path/to/template.docx \
--content content.yaml \
--output path/to/filled.docx
CLI は各入力操作について [OK]/[MISS] を出力し、概要の後に WARN: 行を出力します。提出前に、すべての [MISS] と WARN: を調査してください(原則 6)。
table_kv、section_replace、paragraph_replace の各値は、入力したとおりに書き込まれます(012345、12:30、1.10、No はテキストとして保持されます)。値が空の場合、またはリスト/マッピング値の場合、実行は終了コード 2 で停止し、該当するラベルが表示されます。意図的にフィールドを空欄にするには、'' と入力してください。後続に番号付きの見出しがない見出しに対して section_replace を行うと、ドキュメント末尾まですべて置き換わり、置き換えた段落数が [OK] 行に表示されます。署名/日付欄など、最後のセクションの後に続く内容を残すには、section_end を指定して範囲を区切ってください(見出し → 残すブロックの先頭段落に照合する正規表現)。
section_end:
"18. References": "^Investigator signature"
ステップ 5 — 目視確認
soffice --headless --convert-to pdf path/to/filled.docx
LibreOffice を利用できない場合(.docx テンプレートでは LibreOffice を使用しません)は、代わりに Word から PDF をエクスポートします。PDF を開き、ページ数が適切であること、表の行がページをまたいで分割されていないこと、フォントが Times New Roman にフォールバックしていないこと、必須フィールドがすべて入力されていることを確認します。
ラベルやセクション見出しが一致しない場合、テンプレートに番号付きセクション見出し(section_end)がない場合、セルに複数行の内容が必要な場合、またはセルが結合されている場合は、${CLAUDE_SKILL_DIR}/references/best_practices.md を参照してください。
既知の制限事項
- HWP / HWPX 入力には直接対応していません — 先に
.docxに変換してください。 - 結合セル:垂直方向に結合されたセルに含まれるラベルセルに入力すると、結合領域の内容が上書きされることがあります。まずコピー上でテストしてください。
- 埋め込みフォームフィールド(Word のコンテンツコントロール):対応していません。通常の段落と表のセルの内容のみが対象です。
- 右から左に記述する文字体系(アラビア語、ヘブライ語):未テストです。
- 後続の見出しがない最後のセクション:
section_endパターンを指定しない場合、ドキュメントの末尾まで置き換えられます。フィラーでは、セクション本文と後続のブロックを判別できません。