Generate and manipulate Word DOCX files programmatically. Supports template-based generation with branding compliance and from-scratch creation. Analyze templates, replace placeholders, extract content.
How this skill is triggered — by the user, by Claude, or both
Slash command
/jwynia-agent-skills-1:docx-generatorThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Use this skill when:
Use this skill when:
{{TITLE}} or ${author}Do NOT use this skill when:
Template Mode: Modify existing branded templates
{{PLACEHOLDERS}} with actual contentScratch Mode: Create documents from nothing using JSON specifications
Extract text inventory to understand what can be replaced:
deno run --allow-read scripts/analyze-template.ts corporate-template.docx > inventory.json
Output (inventory.json):
{
"filename": "corporate-template.docx",
"paragraphCount": 25,
"tableCount": 2,
"imageCount": 1,
"paragraphs": [
{
"index": 0,
"style": "Title",
"fullText": "{{DOCUMENT_TITLE}}",
"runs": [
{ "text": "{{DOCUMENT_TITLE}}", "bold": true, "fontSize": 28 }
]
}
],
"placeholders": [
{ "tag": "{{DOCUMENT_TITLE}}", "location": "paragraph", "paragraphIndex": 0 },
{ "tag": "{{AUTHOR}}", "location": "footer-default", "paragraphIndex": 0 },
{ "tag": "${date}", "location": "table", "tableIndex": 0, "cellLocation": "R1C2" }
]
}
Create replacements.json:
{
"textReplacements": [
{ "tag": "{{DOCUMENT_TITLE}}", "value": "Q4 2024 Financial Report" },
{ "tag": "{{AUTHOR}}", "value": "Finance Department" },
{ "tag": "${date}", "value": "December 15, 2024" },
{ "tag": "{{COMPANY}}", "value": "Acme Corporation" }
],
"includeHeaders": true,
"includeFooters": true
}
deno run --allow-read --allow-write scripts/generate-from-template.ts \
corporate-template.docx replacements.json output.docx
Create spec.json:
{
"title": "Quarterly Report",
"creator": "Finance Team",
"styles": {
"defaultFont": "Calibri",
"defaultFontSize": 11
},
"sections": [
{
"header": {
"paragraphs": [
{ "text": "Acme Corporation", "alignment": "right" }
]
},
"footer": {
"paragraphs": [
{ "text": "Confidential", "alignment": "center" }
]
},
"content": [
{
"text": "Q4 2024 Financial Report",
"heading": 1,
"alignment": "center"
},
{
"runs": [
{ "text": "Executive Summary: ", "bold": true },
{ "text": "This report provides an overview of our financial performance for Q4 2024." }
]
},
{ "pageBreak": true },
{
"text": "Revenue Breakdown",
"heading": 2
},
{
"rows": [
{
"cells": [
{ "content": [{ "text": "Category" }], "shading": "DDDDDD" },
{ "content": [{ "text": "Amount" }], "shading": "DDDDDD" },
{ "content": [{ "text": "Change" }], "shading": "DDDDDD" }
],
"isHeader": true
},
{
"cells": [
{ "content": [{ "text": "Product Sales" }] },
{ "content": [{ "text": "$1,250,000" }] },
{ "content": [{ "text": "+15%" }] }
]
},
{
"cells": [
{ "content": [{ "text": "Services" }] },
{ "content": [{ "text": "$750,000" }] },
{ "content": [{ "text": "+8%" }] }
]
}
],
"width": 100,
"borders": true
}
]
}
]
}
deno run --allow-read --allow-write scripts/generate-scratch.ts spec.json output.docx
Scenario: Generate contracts from a branded template.
Steps:
# 1. Analyze template for replaceable content
deno run --allow-read scripts/analyze-template.ts contract-template.docx --pretty
# 2. Create replacements.json with client data
# 3. Generate contract
deno run --allow-read --allow-write scripts/generate-from-template.ts \
contract-template.docx replacements.json acme-contract.docx
Scenario: Generate a data report with tables and formatting.
spec.json:
{
"title": "Sales Report",
"sections": [{
"content": [
{ "text": "Monthly Sales Report", "heading": 1 },
{ "text": "January 2025", "heading": 2 },
{
"runs": [
{ "text": "Total Sales: ", "bold": true },
{ "text": "$125,000", "color": "2E7D32" }
]
}
]
}]
}
Scenario: Create a formal letter with letterhead.
spec.json:
{
"sections": [{
"header": {
"paragraphs": [
{ "text": "ACME CORPORATION", "alignment": "center", "runs": [{"text": "ACME CORPORATION", "bold": true, "fontSize": 16}] },
{ "text": "123 Business Ave, City, ST 12345", "alignment": "center" }
]
},
"content": [
{ "text": "December 15, 2024", "alignment": "right" },
{ "text": "" },
{ "text": "Dear Valued Customer," },
{ "text": "" },
{ "text": "Thank you for your continued business..." },
{ "text": "" },
{ "text": "Sincerely," },
{ "text": "John Smith" },
{ "runs": [{ "text": "CEO", "italic": true }] }
],
"footer": {
"paragraphs": [
{ "text": "www.acme.com | [email protected]", "alignment": "center" }
]
}
}]
}
| Script | Purpose | Permissions |
|---|---|---|
analyze-template.ts | Extract text, tables, placeholders from DOCX | --allow-read |
generate-from-template.ts | Replace placeholders in templates | --allow-read --allow-write |
generate-scratch.ts | Create DOCX from JSON specification | --allow-read --allow-write |
| Property | Type | Description |
|---|---|---|
text | string | Simple text content |
runs | array | Formatted text runs (for mixed formatting) |
heading | 1-6 | Heading level |
alignment | string | left, center, right, justify |
bullet | boolean | Bulleted list item |
numbering | boolean | Numbered list item |
spacing | object | before, after, line spacing |
indent | object | left, right, firstLine indentation |
pageBreakBefore | boolean | Insert page break before paragraph |
| Property | Type | Description |
|---|---|---|
text | string | Text content |
bold | boolean | Bold formatting |
italic | boolean | Italic formatting |
underline | boolean | Underline formatting |
strike | boolean | Strikethrough |
fontSize | number | Font size in points |
font | string | Font family name |
color | string | Text color (hex, no #) |
highlight | string | Highlight color |
superScript | boolean | Superscript |
subScript | boolean | Subscript |
| Property | Type | Description |
|---|---|---|
rows | array | Array of row specifications |
width | number | Table width as percentage |
borders | boolean | Show table borders |
| Property | Type | Description |
|---|---|---|
text | string | Link text |
url | string | Target URL |
bold | boolean | Bold formatting |
italic | boolean | Italic formatting |
Symptoms: Output DOCX still contains {{PLACEHOLDER}} tags.
Solution:
analyze-template.ts to verify exact tag textincludeHeaders and includeFooters are true if placeholders are thereSymptoms: Replaced text doesn't match original formatting.
Solution:
Symptoms: Image elements are blank in output.
Solution:
Symptoms: Table cells have wrong content or formatting.
Solution:
content must be an array of paragraph specificationsshading for background color, verticalAlign for alignmentnpx claudepluginhub jwynia/agent-skillsCreates, reads, edits, and manipulates Word documents (.docx) with formatting, tracked changes, tables, images, and templates. Activates on mentions of reports, memos, letters, or .docx files.
Creates, reads, edits, and analyzes .docx files using docx-js for generation, pandoc/Python for extraction, XML editing, tracked changes, and LibreOffice conversions.