بنقرة واحدة
docx
Word DOCX create, read, edit, review. Triggers: Word doc, .docx, reports, memos, letters, templates.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
Word DOCX create, read, edit, review. Triggers: Word doc, .docx, reports, memos, letters, templates.
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
MUST USE for cli-jaw PABCD orchestration workflows — orchestrate, phase, attest/attestation, interview mode, goal mode, checkpoints, and multi-phase development. Triggers: orchestrate, phase, attest, attestation, interview, goal mode, checkpoint, PABCD, 요구사항 정리, 인터뷰, 스펙 정리. Operate state transitions only when the user explicitly requests orchestration or an active PABCD phase is injected — do not transition state merely because a document mentions phases, goals, or checkpoints.
MUST USE for every coding task — classifies work depth (C0-C5), task_tags overlays, modular limits, pre-write search, verification-before-completion, and safety rules. Triggers: develop, implement, refactor, feature, bug fix, test, review, code quality, scaffolding.
Use only on the Codex CLI for native image generation or image editing without an API key. Save final PNG files under ~/.cli-jaw/uploads, report web-ready absolute-path markdown, and send to Telegram or Discord only when explicitly requested.
MUST USE for any real runtime debugging in any language — crashes, silent failures, wrong output, build/test failures, flaky tests, performance regressions, and integration bugs. A 5-phase root-cause method: architecture check → investigate → analyze → hypothesize → implement. Triggers: debug this, why is X failing, flaky test, fix the crash, root cause, error, stack trace, regression, 왜 안 돼, 디버깅, 원인 분석.
MUST USE for code review and review-readiness — review process, quality thresholds, antipattern detection, review verdicts, and giving/receiving feedback. Triggers: review this, code review, PR review, check my diff, before merge, antipattern, review-readiness, 리뷰, 코드 리뷰, 머지 전에 확인.
MUST USE for any frontend, web UI, or visual implementation work — building, styling, or redesigning pages/components, responsive layouts, motion, component architecture, and production-surface polish. Triggers: frontend, UI, component, CSS, responsive, animation, React, Vue, Svelte, Tailwind, layout, styling, redesign, mockup, anti-slop, 프론트엔드, UI 작업, 반응형, 디자인 수정.
| name | docx |
| description | Word DOCX create, read, edit, review. Triggers: Word doc, .docx, reports, memos, letters, templates. |
Use this skill for any .docx task: create, read, edit, review, template-fill, or QA verification.
Triggers: "Word doc", ".docx", reports, memos, letters, templates.
OfficeCLI routing and consent rule:
officecli is available with command -v officecli.https://github.com/lidge-jun/OfficeCLI via bash "$(npm root -g)/cli-jaw/scripts/install-officecli.sh".iOfficeAI/OfficeCLI only when the user explicitly asks for upstream behavior.OfficeCLI is the recommended advanced backend for add/set/remove, validate, query, and track-change accept/reject workflows.
Lightweight fallback: Python OOXML scripts (scripts/*.py) for what OfficeCLI cannot do, or when the user chooses lightweight mode: tracked-change creation, OMML equations, bulk pattern matching, unpack/edit/repack. See §3.
DOCX only. Do NOT use this skill for PDFs, spreadsheets, HWPX, Google Docs, or any other format.
OfficeCLI discovery rule: before guessing paths, element names, or properties, ask the installed CLI. Use officecli --help for workflow entry points and officecli help docx ... --json for machine-readable schema.
Same-file execution rule: run OfficeCLI commands against the same .docx sequentially. Do not run officecli view, officecli validate, officecli query, or officecli get in parallel against one package. If a file lock occurs, stop and report the exact command and path before making a copy or retrying.
| Task | Tool | Command pattern | Notes |
|---|---|---|---|
| Format like existing doc | shell + officecli | cp source.docx target.docx && officecli open target.docx | Inherit styles/headers/footers. See §2. |
| Create blank DOCX | officecli | officecli create report.docx | Start from real Office file |
| Add paragraph | officecli | officecli add FILE /body --type paragraph --prop text="..." | Primary write path |
| Edit paragraph/run | officecli | officecli set FILE /body/p[N] --prop ... | Exact path targeting |
| Read text/outline/stats | officecli | officecli view FILE text | Modes: text, annotated, outline, stats, issues, html |
| Query document | officecli | officecli query FILE "p[style=Heading1]" | CSS-like selectors |
| Template-safe replacement | officecli | officecli set FILE / --prop find="{{X}}" --prop replace="Y" | Preserves template structure |
| Validation / issue scan | officecli | officecli validate FILE | Pair with view FILE issues |
| Accept/reject tracked changes | officecli | officecli set FILE / --prop accept-changes=all | Also reject-changes=all |
| CREATE tracked changes | officecli (native) | add ... --prop revision.type=ins --prop revision.author=... | Native create + accept/reject (v1.0.115); Python only for bulk redline diffs |
| OMML equations | Python (L4) | Unpack → inject <m:oMath> → repack | officecli cannot generate OMML |
| Complex anchored comments | Python (L3) | python3 scripts/comment.py IN OUT --text "..." --anchor "..." | For comments beyond officecli |
| PDF conversion / visual QA | soffice | soffice --headless --convert-to pdf FILE | Screenshot-based QA |
| Edit existing document | -- | Read editing.md | Detailed editing guides |
| Create from scratch | -- | Read creating.md | Detailed creation recipes |
When the user says "format like X.docx", "match existing style", "based on template", or provides a source file — start from the source file. Don't rebuild from scratch.
cp source.docx target.docx — inherits all styles, margins, numbering, headers, footersofficecli open target.docx — daemon starts; command returns immediately (do NOT run as run_in_background shell)/styles, /numbering, /header, /footer--prop style=Heading1) — they auto-applyPandoc-generated and Word-generated documents have specific style IDs (e.g. Heading1, BodyText, FirstParagraph) unique to that document. Adding a new style with the same name causes:
officecli validate errors about duplicate style IDstests/fixtures/*.docx — pre-built working examples shipped with this skillofficecli create blank — only when nothing else applies# CORRECT: inherit Pandoc styles
cp Assignment1.docx Assignment2.docx
officecli open Assignment2.docx
officecli remove Assignment2.docx "/body/p[1]" # remove old body (keep styles/headers/footers)
# ... remove more paragraphs ...
officecli add Assignment2.docx /body --type paragraph --prop text="New title" --prop style=Heading1
officecli close Assignment2.docx
# WRONG: recreate styles that already exist — validate fails
officecli add doc.docx /styles --type style --prop name=Heading1 --prop size=20pt ...
officecli covers most DOCX tasks. For the rest, use these reference docs + Python scripts.
references/)| File | Read when | Contains |
|---|---|---|
references/cjk-handling.md | Korean text / East Asian font / wrapping issues | rFonts East Asian fonts, lang tags, accessibility |
references/tracked-changes.md | Track changes / comments / redline work | w:ins, w:del, comments XML, script usage examples |
references/docx-js-api.md | DEPRECATED — npm docx library API, not applicable to officecli ecosystem | Ignore — kept for historical reference only |
scripts/) — Python OOXML Toolkit| Script | Run when | Command |
|---|---|---|
scripts/docx_cli.py | Unified Python CLI — unpack, save, validate, repair, search, TOC, chunk, comment, accept-changes, merge-runs | python3 scripts/docx_cli.py {open|save|validate|repair|text|search|toc|chunk|comment|accept-changes|merge-runs} |
scripts/accept_changes.py | Accept all tracked changes (alternative to officecli) | python3 scripts/accept_changes.py IN.docx OUT.docx |
scripts/comment.py | Add W3C-compliant OOXML comments anchored to text | python3 scripts/comment.py IN.docx OUT.docx --text "..." --anchor "..." |
scripts/ooxml/merge_runs.py | Merge adjacent runs with identical formatting (post-edit cleanup) | python3 scripts/ooxml/merge_runs.py unpacked/ |
scripts/ooxml/redline_diff.py | Validate tracked-change correctness vs original | python3 scripts/ooxml/redline_diff.py unpacked/ original.docx |
scripts/ooxml/simplify_tracked.py | Simplify same-author adjacent tracked changes | python3 scripts/ooxml/simplify_tracked.py unpacked/ |
When officecli can't do the job, escalate in this order:
| Level | When | Tool |
|---|---|---|
| L1 officecli high-level | Typical add/set/remove operations | officecli add/set/remove/query/view |
L2 officecli raw-set | XML injection — PAGE field, fldChar, hyperlink anchor, custom attributes | officecli raw-set FILE PATH --xpath X --action A --xml ... |
| L3 Python script | Bulk tracked-change ops, comment add, merge runs, redline validation | python3 scripts/*.py |
| L4 Unpack → edit XML → repack | OMML equations, custom style injection, pattern-match editing, anything L1-L3 can't reach | scripts/docx_cli.py open FILE work/ → edit work/word/*.xml → scripts/docx_cli.py save work/ OUT.docx |
Escalation signals:
<m:oMath> XML — officecli cannot generate these)docx_cli.py search/replace)references/*.md BEFORE giving upAdditional detail lives in companion files. Load only the one you need.
| Subskill | Path | When to use |
|---|---|---|
| officecli-academic-paper | ./officecli-academic-paper/SKILL.md | Academic papers, citations, bibliography, TOC for papers |
| creating.md | ./creating.md | Detailed creation recipes (new documents from scratch) |
| editing.md | ./editing.md | Detailed editing guides (modify existing documents) |
Is the document an academic paper (thesis, journal, conference)?
YES --> read officecli-academic-paper/SKILL.md
NO --> continue with this file
User provided a source file to match?
YES --> §2 Reference-Based Editing + ./editing.md
NO --> ./creating.md
Intent discovery (before building): ask audience (board / exec / internal team / public), formality register (formal report · memo · whitepaper · proposal), and density (dense reference vs spacious) — then match the type scale, palette restraint, and whitespace. If the user names a target ("McKinsey-style", "academic", "startup memo"), map to it.
Named document anti-slop (AI-tells — pattern → fix):
Named palettes + font pairings + personality→doc-type map:
references/design-system.md.
# Verify heading hierarchy
officecli view report.docx outline
Use professional, muted tones only:
| Purpose | Allowed colors | Hex examples |
|---|---|---|
| Headings, emphasis | Navy | #003366, #1B2A4A |
| Body accents, borders | Charcoal | #333333, #4A4A4A |
| Highlights, callouts | Forest green | #2E5E3F, #1A4731 |
NEVER use rainbow colors, bright primary colors, or more than 3 accent colors in a single document.
| Script | Primary font | Fallback |
|---|---|---|
| Korean | Malgun Gothic | Pretendard |
| English / Latin | Calibri | Aptos |
The CJK fork auto-applies East Asian fonts, but verify with:
officecli raw report.docx /document | grep rFonts
Choose a readable body font (Calibri, Cambria, Georgia, Times New Roman). Keep body at 11-12pt. Headings should step up: H1=18pt minimum (20pt preferred for long documents), H2=14pt bold, H3=12pt bold.
Use paragraph spacing (spaceBefore/spaceAfter) instead of empty paragraphs. Line spacing of 1.15x-1.5x for body text.
Always set margins explicitly. US Letter default: pageWidth=12240, pageHeight=15840, margins=1440 (1 inch).
TOC generation depends entirely on heading styles. Before inserting TOC:
officecli view FILE outline to verify hierarchy.Alternate row shading for readability. Header row with contrasting background. Consistent cell padding. Use color sparingly -- accent color for headings or table headers, not rainbow formatting.
| Content Type | Recommended Element(s) | Why |
|---|---|---|
| Sequential items | Bulleted list (listStyle=bullet) | Scanning is faster than inline commas |
| Step-by-step process | Numbered list (listStyle=ordered) | Numbers communicate order |
| Comparative data | Table with header row | Columns enable side-by-side comparison |
| Trend data | Embedded chart (chartType=line/column) | Visual pattern recognition |
| Key definition | Hanging indent paragraph | Offset term from definition |
| Legal/contract clause | Numbered list with bookmarks | Cross-referencing via bookmarks |
| Mathematical content | Equation element (formula=LaTeX) | Proper OMML rendering |
| Citation/reference | Footnote or endnote | Keeps body text clean |
| Pull quote / callout | Paragraph with border + shading | Visual distinction from body |
| Multi-section layout | Section breaks with columns | Column control per section |
Delivery Gate — treat verification as a gate, not a confirmation. Any failure = REJECT, do not deliver. Fix → re-run the checks → repeat until a pass finds zero new issues. After 3 rounds without convergence, STOP and report the likely root cause for the user to decide.
After ANY DOCX creation or edit, ALWAYS execute both steps:
# Step 1: Structural validation
officecli validate output.docx
# Step 2: Visual PDF verification
soffice --headless --convert-to pdf --outdir /tmp output.docx
# Open/inspect PDF to confirm: formatting, tables, images, headers/footers
validate reports errors, fix them before delivering the file.# Required
python3 -c "import docx, lxml" || echo "MISSING: pip install python-docx lxml"
# LibreOffice: check only; ask before installing when PDF conversion is needed.
which soffice >/dev/null 2>&1 || echo "ASK USER: LibreOffice is not installed; install it for PDF conversion or skip PDF output."
# OfficeCLI: check only; do not auto-install from a skill.
if ! command -v officecli >/dev/null 2>&1; then
echo "ASK USER: install forked OfficeCLI from https://github.com/lidge-jun/OfficeCLI, continue lightweight, or stop."
echo "Install command after approval: bash \"\$(npm root -g)/cli-jaw/scripts/install-officecli.sh\""
fi
Always confirm syntax from help before guessing:
officecli --help
officecli help docx
officecli help docx add
officecli help docx set
officecli help docx query
officecli help docx add paragraph --json
officecli help docx set run --json
Drill into a specific area:
officecli help docx add paragraph
officecli help docx add picture
officecli help docx set run
officecli help docx set style
officecli help all --jsonl | grep '"format":"docx"'
| Binary | Path | Notes |
|---|---|---|
| officecli | officecli (PATH) | Optional advanced backend; ask before install. Supported fork: https://github.com/lidge-jun/OfficeCLI, with CjkHelper.cs for CJK font/language behavior |
Run commands one at a time. Do not write all commands into a shell script and execute it as a single block.
OfficeCLI is incremental: every add, set, and remove immediately modifies the file and returns output.
get or validate before building on top of it.officecli view doc.docx text # Full text extraction
officecli view doc.docx text --max-lines 200 # Truncated extraction
officecli view doc.docx text --start 1 --end 50 # Range extraction
officecli view doc.docx outline # Structure: stats, headings, headers/footers
officecli view doc.docx annotated # Style/font/size per run, equations as LaTeX
officecli view doc.docx stats # Paragraph count, style/font distribution
officecli get doc.docx / # Document root (metadata, page setup)
officecli get doc.docx /body --depth 1 # List body children
officecli get doc.docx "/body/p[1]" # Specific paragraph
officecli get doc.docx "/body/p[1]/r[1]" # Specific run
officecli get doc.docx "/body/tbl[1]" --depth 3 # Table structure
officecli get doc.docx /styles # Style definitions
officecli get doc.docx "/styles/Heading1" # Specific style
officecli get doc.docx "/header[1]" # Header/footer
officecli get doc.docx /numbering # Numbering definitions
officecli get doc.docx "/body/p[1]" --json # JSON output for scripting
officecli query doc.docx 'paragraph[style=Heading1]' # By style
officecli query doc.docx 'p:contains("quarterly")' # By text content
officecli query doc.docx 'p:empty' # Empty paragraphs
officecli query doc.docx 'image:no-alt' # Images without alt text
officecli query doc.docx 'p[align=center] > r[bold=true]' # Compound selectors
officecli query doc.docx 'paragraph[size>=24pt]' # By size
officecli query doc.docx 'field[fieldType!=page]' # Fields by type
Standard footer setup (always use this pattern for documents with a cover page):
--prop field=pageworks (verified v1.0.115) —add --type footer --prop field=pageinjects a live PAGE field directly. The oldraw-set <w:fldChar>workaround is no longer needed.
# Step 1. Empty footer for the cover page (auto-enables a title-page footer)
officecli add doc.docx / --type footer --prop type=first --prop text=""
# Step 2. Default footer with a live PAGE field — no raw-set needed
officecli add doc.docx / --type footer --prop field=page --prop type=default --prop align=center --prop size=9pt --prop font=Calibri
# Verify: officecli get doc.docx "/footer[2]" --depth 3 # shows the fldChar PAGE field
Footer index rule: When both a first-page footer and a default footer are added, the default footer is
/footer[2]. If there is no first-page footer, the default footer is/footer[1]. Always verify withofficecli get doc.docx "/footer[2]"(or"/footer[1]") to confirm the<w:fldChar>element is present.
LibreOffice rendering note: Page number fields may display as static "Page" in LibreOffice PDF preview -- this is a LibreOffice limitation. Open in Microsoft Word to see actual page numbers. Confirm the field with
officecli get doc.docx "/footer[2]"-- output must showfldCharchildren.
Always use open/close -- it is the smart default. Every command benefits: no repeated file I/O.
officecli open doc.docx # Load once into memory (returns IMMEDIATELY; daemon in bg)
officecli add doc.docx ... # All commands run in memory -- fast
officecli set doc.docx ...
officecli close doc.docx # Write once to disk
Do NOT run
officecli openas a background shell job (e.g. viarun_in_background). It returns immediately and the daemon lives in the background automatically. Running it as a monitored shell creates zombies and file locks. If stuck:pkill -9 -f "officecli.*resident"then retry.
Execute multiple operations in a single open/save cycle:
cat <<'EOF' | officecli batch doc.docx
[
{"command":"add","parent":"/body","type":"paragraph","props":{"text":"Introduction","style":"Heading1"}},
{"command":"add","parent":"/body","type":"paragraph","props":{"text":"This report covers Q4 results.","font":"Calibri","size":"11pt"}}
]
EOF
Batch supports: add, set, get, query, remove, move, swap, view, raw, raw-set, validate.
Batch fields: command, path, parent, type, from, to, index, after, before, props (dict), selector, mode, depth, part, xpath, action, xml.
parent = container to add into (for add). path = element to modify (for set, get, remove, move, swap).
Error decoding:
'X' is an invalid start of a value= shell syntax leaked into JSON (unquoted$, stray shell metachar). Use heredoccat <<'EOF' | officecli batch FILEwith single-quoted'EOF'delimiter — prevents shell expansion.
| Pitfall | Correct Approach |
|---|---|
--name "foo" | Use --prop name="foo" -- all attributes go through --prop |
| Guessing property names | Run officecli help docx set paragraph --json to see exact names |
\n in shell strings | Use \\n for newlines in --prop text="line1\\nline2" |
| Modifying an open file | Close the file in Word first |
Hex colors with # | Use FF0000 not #FF0000 -- no hash prefix |
| Paths are 1-based | /body/p[1], /body/tbl[1] -- XPath convention |
--index is 0-based | --index 0 = first position -- array convention |
Unquoted [N] in zsh/bash | Shell glob-expands /body/p[1] -- always quote paths: "/body/p[1]" |
| Spacing in raw numbers | Use unit-qualified values: '12pt', '0.5cm', '1.5x' not raw twips |
| Empty paragraphs for spacing | Use spaceBefore/spaceAfter properties on paragraphs |
$ in --prop text= (shell) | Use single quotes: --prop text='$50M' |
$ and ' in batch JSON | Use heredoc: cat <<'EOF' | officecli batch |
| Wrong border format | Use style;size;color;space format: single;4;FF0000;1 |
| listStyle on run | listStyle is a paragraph property, not a run property |
| Row-level bold/color/shd | Row set only supports height, header, and c1/c2/c3 text shortcuts. Use cell-level set for formatting |
| Section property names | Canonical is camelCase pageWidth/pageHeight/marginTop (lowercase pagewidth etc. are accepted aliases — no real dichotomy) |
--prop field=page in footer | Works (v1.0.115) — add --type footer --prop field=page injects a live PAGE field; no raw-set needed. See §9.5 |
| Suppress page number on cover | set /section[N] --prop titlePage=true (works v1.0.115) + a type=first empty footer. There is no differentFirstPage prop — titlePage is the lever |
| TOC skipped for multi-heading docs | Any document with 3+ headings requires a TOC. Add with --type toc --index 0 after cover page break |
| Code block indentation via spaces | Use ind.left paragraph property (e.g. --prop ind.left=720) -- consecutive spaces produce warnings |
| Recreating styles that exist in template | cp source.docx target.docx first. Don't add styles with existing IDs — validate fails. See §2 |
officecli open as background shell | Run foreground — open returns immediately, daemon runs in bg automatically. Background shell spawn creates zombies + file locks |
Batch JSON 'X' is an invalid start of a value | Shell syntax leaked into JSON. Use heredoc: cat <<'EOF' | officecli batch FILE.docx |
| OMML equation creation | officecli cannot generate OMML. Options: (a) inline text, or (b) L4 — scripts/docx_cli.py open FILE work/ → inject <m:oMath> into work/word/document.xml → scripts/docx_cli.py save. No dedicated OMML guide; author XML by hand or port from an existing equation-containing fixture in tests/fixtures/ |
| Issue | Workaround |
|---|---|
| No visual preview | Unlike pptx (SVG/HTML), docx has no built-in rendering. Use view text/outline/annotated/issues for verification. Users must open in Word for visual check. |
| Track changes — native create | OfficeCLI creates tracked changes natively (v1.0.115): --prop revision.type=ins|del|moveTo|moveFrom|format with revision.author/revision.date on the host element; accept/reject via set /revision --prop revision.action=accept|reject. (scripts/docx_cli.py no longer required for creation.) |
| Tab stops may require raw XML | Tab stop creation is not exposed in high-level commands. Use raw-set to add tab stop definitions. |
| Chart series cannot be added after creation | set --prop data= can only update existing series, not add new ones. Delete and recreate the chart. |
| Complex numbering definitions | listStyle=bullet/ordered (canonical) covers simple cases. For multi-level lists, use numId/numLevel properties. |
| Shell quoting in batch with echo | Use heredoc: cat <<'EOF' | officecli batch doc.docx. |
| Batch intermittent failure | ~1-in-15 batch operations may fail with "Failed to send to resident". Retry or close/reopen file. Split large batches into 10-15 operation chunks. |
Table-level padding produces invalid XML | Do not use set tbl[N] --prop padding=N. Use cell-level padding.top/padding.bottom. If already applied, remove with raw-set --xpath "//w:tbl[N]/w:tblPr/w:tblCellMar" --action remove. |
| Internal hyperlinks not supported | hyperlink only accepts absolute URIs. For #bookmark links, use raw-set with <w:hyperlink w:anchor="bookmarkName">. |
Table --index positioning unreliable | --index N on add /body --type table may be ignored. Add content in desired order, or remove/re-add elements. |
\mathcal in equations causes validation errors | Use \mathit or plain letters instead. |
view text shows "1." for all numbered items | Display-only limitation. Rendered output in Word/LibreOffice shows correct auto-incrementing numbers. |
chartType=pie/doughnut in LibreOffice PDF | Do NOT use these chart types when LibreOffice PDF delivery is required. Slices are invisible. Use chartType=column or bar instead. |
| OMML equation creation via officecli | officecli has no high-level OMML generator. Escalate to L4: scripts/docx_cli.py open FILE work/ → inject <m:oMath> into work/word/document.xml → scripts/docx_cli.py save. Copy OMML from a reference fixture (tests/fixtures/) rather than authoring from scratch. |
Assume there are problems. Your job is to find them.
officecli view doc.docx issues
officecli view doc.docx issues --type format
officecli view doc.docx issues --type content
officecli view doc.docx issues --type structure
officecli view doc.docx text
officecli view doc.docx outline
officecli query doc.docx 'p:empty'
officecli query doc.docx 'image:no-alt'
# Check for leftover placeholders
officecli query doc.docx 'p:contains("lorem")'
officecli query doc.docx 'p:contains("xxxx")'
officecli query doc.docx 'p:contains("placeholder")'
add --type footer --prop field=page (works v1.0.115); verify with officecli get doc.docx "/footer[2]" --depth 3 (shows fldChar). If no first-page footer, use "/footer[1]".--prop type=first --prop text="") if document has a cover page--type toc --prop levels="1-3" --prop title="Table of Contents" --prop hyperlinks=true --prop pagenumbers=true --index 0)officecli validateview issues + view outline + view text + validateDo not declare success until you've completed at least one fix-and-verify cycle.
QA display notes:
view text shows "1." for ALL numbered list items regardless of actual rendered number. This is a display limitation -- not a defect.view issues flags "body paragraph missing first-line indent" on cover page paragraphs, centered headings, list items, callout boxes, etc. These warnings are expected. First-line indent is only required in APA/academic body text.raw-set, the XML structure must be exact. See the Headers & Footers section for the correct fldChar/instrText/fldChar sequence.spacing-after properties.listStyle=bullet or listStyle=number.--prop font=... when it suffices.references/*.md + check scripts/*.py (§3) BEFORE giving up or falling back to inline text. The Pre-officecli OOXML workflow is still available via scripts.| Tool | Purpose | Status |
|---|---|---|
officecli (PATH) | Recommended advanced DOCX backend; fork source is https://github.com/lidge-jun/OfficeCLI | Optional; ask before install |
dotnet | Runtime/build for OfficeCLI fork builds | Optional; required only after user approves fork install/build |
python3 | Fallback scripts (scripts/*.py) | Required for L3/L4 |
lxml | Python XML processing for scripts/ooxml/* | Required for L3/L4 (pip install lxml) |
soffice | PDF conversion / .doc migration / macro workflows | Optional fallback |
pdftoppm | Image-based QA after PDF render | Optional fallback |
dotnet publish -c Release -o build-local