Files
Magnus HedemarkGitHubfactory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
c49666e29a feat(skill): add documents family skill (PDF / Word / Excel / PowerPoint) (#262)
* feat(skill): add documents family skill (PDF / Word / Excel / PowerPoint)

One family skill for PDF, Word (.docx), Excel (.xlsx), and PowerPoint
(.pptx) per the family-skill rule (epub precedent): shared workflow in
SKILL.md (scope, content model, template, render, validate, deliver) with
per-format load-on-demand references, generation templates per format, a
stdlib validation script (--json, structural sanity + render check with
graceful degradation), one fixture per format, a unittest suite, six
output-quality eval cases spanning all four formats, a human README, the
README.md index entry, and regenerated catalogs.

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* fix(skill): dispatch PDF renderer args per binary in documents validation

The render check passed pdftoppm-only flags (-png/-r/-f/-l) to mutool and
ghostscript, which reject them, so a machine with only mutool or gs would
false-FAIL valid PDFs. Dispatch per-renderer argument sets (pdftoppm -png;
mutool draw -o; gs -sDEVICE=png16m) and cover the dispatch with a unit test.
Also: count PDF pages via the /Count page-tree fallback (page objects can
hide in compressed ObjStm streams), drop the stale "unsupported input" exit-2
claim from the docstring, and stop labeling skipped files with a FAIL check.

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

* style(skill): drop redundant local tempfile import in renderer dispatch test

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>

---------

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2026-08-03 17:36:00 -04:00

1.8 KiB

Word (.docx) Generation Template

Fill every [fill: ...] marker with content from the content model, then generate the .docx (python-docx, pandoc, or raw OPC). Delete this instruction block after filling.

Document metadata

  • Title: [fill: document title]
  • Author / owner: [fill: author or team]
  • Audience: [fill: who reads this]
  • Date: [fill: YYYY-MM-DD]
  • Version: [fill: 1.0]

Scope contract

  • Purpose: [fill: one sentence on what this document is for]
  • Style base: [fill: template or style set to build on]
  • Source of truth: [fill: path to the content model]

Content outline (styles, not ad-hoc formatting)

Heading 1 — [fill: section title]

  • Paragraph(s): [fill: body text, one paragraph per bullet]
  • Style to apply: [fill: Heading 2 / Normal / List Bullet]
  • Table needed: [fill: yes/no; if yes, headers and row content]

Heading 2 — [fill: section title]

  • Paragraph(s): [fill: body text, one paragraph per bullet]
  • Style to apply: [fill: Heading 2 / Normal / List Bullet]
  • Table needed: [fill: yes/no; if yes, headers and row content]

Tables

Table name Header row Rows
[fill: name] [fill: column headers] [fill: row content or source path]

Assets

  • Images: [fill: image paths; confirm they will be embedded in word/media]
  • Header/footer: [fill: page numbers, running title]
  • Metadata fields: [fill: title/author for docProps]

Validation gate

python3 scripts/validate-documents.py --render-check --json output.docx
  • Structure passed: [fill: script exit code and status]
  • Render check: [fill: ok or unavailable, with renderer used]
  • Headings check: [fill: all headings use heading styles, confirmed]