← 返回 Skills 市场
pupuking723

Docx Anthropic

作者 pupuking723 · GitHub ↗ · v1.0.0 · MIT-0
cross-platform ⚠ suspicious
380
总下载
0
收藏
2
当前安装
1
版本数
在 OpenClaw 中安装
/install docx-anthropic
功能描述
Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files). Triggers include: any mention of 'Word doc', 'word...
使用说明 (SKILL.md)

DOCX creation, editing, and analysis

Overview

A .docx file is a ZIP archive containing XML files.

Quick Reference

Task Approach
Read/analyze content pandoc or unpack for raw XML
Create new document Use docx-js - see Creating New Documents below
Edit existing document Unpack → edit XML → repack - see Editing Existing Documents below

Converting .doc to .docx

Legacy .doc files must be converted before editing:

python scripts/office/soffice.py --headless --convert-to docx document.doc

Reading Content

# Text extraction with tracked changes
pandoc --track-changes=all document.docx -o output.md

# Raw XML access
python scripts/office/unpack.py document.docx unpacked/

Converting to Images

python scripts/office/soffice.py --headless --convert-to pdf document.docx
pdftoppm -jpeg -r 150 document.pdf page

Accepting Tracked Changes

To produce a clean document with all tracked changes accepted (requires LibreOffice):

python scripts/accept_changes.py input.docx output.docx

Creating New Documents

Generate .docx files with JavaScript, then validate. Install: npm install -g docx

Setup

const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, ImageRun,
        Header, Footer, AlignmentType, PageOrientation, LevelFormat, ExternalHyperlink,
        InternalHyperlink, Bookmark, FootnoteReferenceRun, PositionalTab,
        PositionalTabAlignment, PositionalTabRelativeTo, PositionalTabLeader,
        TabStopType, TabStopPosition, Column, SectionType,
        TableOfContents, HeadingLevel, BorderStyle, WidthType, ShadingType,
        VerticalAlign, PageNumber, PageBreak } = require('docx');

const doc = new Document({ sections: [{ children: [/* content */] }] });
Packer.toBuffer(doc).then(buffer => fs.writeFileSync("doc.docx", buffer));

Validation

After creating the file, validate it. If validation fails, unpack, fix the XML, and repack.

python scripts/office/validate.py doc.docx

Page Size

// CRITICAL: docx-js defaults to A4, not US Letter
// Always set page size explicitly for consistent results
sections: [{
  properties: {
    page: {
      size: {
        width: 12240,   // 8.5 inches in DXA
        height: 15840   // 11 inches in DXA
      },
      margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } // 1 inch margins
    }
  },
  children: [/* content */]
}]

Common page sizes (DXA units, 1440 DXA = 1 inch):

Paper Width Height Content Width (1" margins)
US Letter 12,240 15,840 9,360
A4 (default) 11,906 16,838 9,026

Landscape orientation: docx-js swaps width/height internally, so pass portrait dimensions and let it handle the swap:

size: {
  width: 12240,   // Pass SHORT edge as width
  height: 15840,  // Pass LONG edge as height
  orientation: PageOrientation.LANDSCAPE  // docx-js swaps them in the XML
},
// Content width = 15840 - left margin - right margin (uses the long edge)

Styles (Override Built-in Headings)

Use Arial as the default font (universally supported). Keep titles black for readability.

const doc = new Document({
  styles: {
    default: { document: { run: { font: "Arial", size: 24 } } }, // 12pt default
    paragraphStyles: [
      // IMPORTANT: Use exact IDs to override built-in styles
      { id: "Heading1", name: "Heading 1", basedOn: "Normal", next: "Normal", quickFormat: true,
        run: { size: 32, bold: true, font: "Arial" },
        paragraph: { spacing: { before: 240, after: 240 }, outlineLevel: 0 } }, // outlineLevel required for TOC
      { id: "Heading2", name: "Heading 2", basedOn: "Normal", next: "Normal", quickFormat: true,
        run: { size: 28, bold: true, font: "Arial" },
        paragraph: { spacing: { before: 180, after: 180 }, outlineLevel: 1 } },
    ]
  },
  sections: [{
    children: [
      new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("Title")] }),
    ]
  }]
});

Lists (NEVER use unicode bullets)

// ❌ WRONG - never manually insert bullet characters
new Paragraph({ children: [new TextRun("• Item")] })  // BAD
new Paragraph({ children: [new TextRun("\u2022 Item")] })  // BAD

// ✅ CORRECT - use numbering config with LevelFormat.BULLET
const doc = new Document({
  numbering: {
    config: [
      { reference: "bullets",
        levels: [{ level: 0, format: LevelFormat.BULLET, text: "•", alignment: AlignmentType.LEFT,
          style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
      { reference: "numbers",
        levels: [{ level: 0, format: LevelFormat.DECIMAL, text: "%1.", alignment: AlignmentType.LEFT,
          style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
    ]
  },
  sections: [{
    children: [
      new Paragraph({ numbering: { reference: "bullets", level: 0 },
        children: [new TextRun("Bullet item")] }),
      new Paragraph({ numbering: { reference: "numbers", level: 0 },
        children: [new TextRun("Numbered item")] }),
    ]
  }]
});

// ⚠️ Each reference creates INDEPENDENT numbering
// Same reference = continues (1,2,3 then 4,5,6)
// Different reference = restarts (1,2,3 then 1,2,3)

Tables

CRITICAL: Tables need dual widths - set both columnWidths on the table AND width on each cell. Without both, tables render incorrectly on some platforms.

// CRITICAL: Always set table width for consistent rendering
// CRITICAL: Use ShadingType.CLEAR (not SOLID) to prevent black backgrounds
const border = { style: BorderStyle.SINGLE, size: 1, color: "CCCCCC" };
const borders = { top: border, bottom: border, left: border, right: border };

new Table({
  width: { size: 9360, type: WidthType.DXA }, // Always use DXA (percentages break in Google Docs)
  columnWidths: [4680, 4680], // Must sum to table width (DXA: 1440 = 1 inch)
  rows: [
    new TableRow({
      children: [
        new TableCell({
          borders,
          width: { size: 4680, type: WidthType.DXA }, // Also set on each cell
          shading: { fill: "D5E8F0", type: ShadingType.CLEAR }, // CLEAR not SOLID
          margins: { top: 80, bottom: 80, left: 120, right: 120 }, // Cell padding (internal, not added to width)
          children: [new Paragraph({ children: [new TextRun("Cell")] })]
        })
      ]
    })
  ]
})

Table width calculation:

Always use WidthType.DXAWidthType.PERCENTAGE breaks in Google Docs.

// Table width = sum of columnWidths = content width
// US Letter with 1" margins: 12240 - 2880 = 9360 DXA
width: { size: 9360, type: WidthType.DXA },
columnWidths: [7000, 2360]  // Must sum to table width

Width rules:

  • Always use WidthType.DXA — never WidthType.PERCENTAGE (incompatible with Google Docs)
  • Table width must equal the sum of columnWidths
  • Cell width must match corresponding columnWidth
  • Cell margins are internal padding - they reduce content area, not add to cell width
  • For full-width tables: use content width (page width minus left and right margins)

Images

// CRITICAL: type parameter is REQUIRED
new Paragraph({
  children: [new ImageRun({
    type: "png", // Required: png, jpg, jpeg, gif, bmp, svg
    data: fs.readFileSync("image.png"),
    transformation: { width: 200, height: 150 },
    altText: { title: "Title", description: "Desc", name: "Name" } // All three required
  })]
})

Page Breaks

// CRITICAL: PageBreak must be inside a Paragraph
new Paragraph({ children: [new PageBreak()] })

// Or use pageBreakBefore
new Paragraph({ pageBreakBefore: true, children: [new TextRun("New page")] })

Hyperlinks

// External link
new Paragraph({
  children: [new ExternalHyperlink({
    children: [new TextRun({ text: "Click here", style: "Hyperlink" })],
    link: "https://example.com",
  })]
})

// Internal link (bookmark + reference)
// 1. Create bookmark at destination
new Paragraph({ heading: HeadingLevel.HEADING_1, children: [
  new Bookmark({ id: "chapter1", children: [new TextRun("Chapter 1")] }),
]})
// 2. Link to it
new Paragraph({ children: [new InternalHyperlink({
  children: [new TextRun({ text: "See Chapter 1", style: "Hyperlink" })],
  anchor: "chapter1",
})]})

Footnotes

const doc = new Document({
  footnotes: {
    1: { children: [new Paragraph("Source: Annual Report 2024")] },
    2: { children: [new Paragraph("See appendix for methodology")] },
  },
  sections: [{
    children: [new Paragraph({
      children: [
        new TextRun("Revenue grew 15%"),
        new FootnoteReferenceRun(1),
        new TextRun(" using adjusted metrics"),
        new FootnoteReferenceRun(2),
      ],
    })]
  }]
});

Tab Stops

// Right-align text on same line (e.g., date opposite a title)
new Paragraph({
  children: [
    new TextRun("Company Name"),
    new TextRun("	January 2025"),
  ],
  tabStops: [{ type: TabStopType.RIGHT, position: TabStopPosition.MAX }],
})

// Dot leader (e.g., TOC-style)
new Paragraph({
  children: [
    new TextRun("Introduction"),
    new TextRun({ children: [
      new PositionalTab({
        alignment: PositionalTabAlignment.RIGHT,
        relativeTo: PositionalTabRelativeTo.MARGIN,
        leader: PositionalTabLeader.DOT,
      }),
      "3",
    ]}),
  ],
})

Multi-Column Layouts

// Equal-width columns
sections: [{
  properties: {
    column: {
      count: 2,          // number of columns
      space: 720,        // gap between columns in DXA (720 = 0.5 inch)
      equalWidth: true,
      separate: true,    // vertical line between columns
    },
  },
  children: [/* content flows naturally across columns */]
}]

// Custom-width columns (equalWidth must be false)
sections: [{
  properties: {
    column: {
      equalWidth: false,
      children: [
        new Column({ width: 5400, space: 720 }),
        new Column({ width: 3240 }),
      ],
    },
  },
  children: [/* content */]
}]

Force a column break with a new section using type: SectionType.NEXT_COLUMN.

Table of Contents

// CRITICAL: Headings must use HeadingLevel ONLY - no custom styles
new TableOfContents("Table of Contents", { hyperlink: true, headingStyleRange: "1-3" })

Headers/Footers

sections: [{
  properties: {
    page: { margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } } // 1440 = 1 inch
  },
  headers: {
    default: new Header({ children: [new Paragraph({ children: [new TextRun("Header")] })] })
  },
  footers: {
    default: new Footer({ children: [new Paragraph({
      children: [new TextRun("Page "), new TextRun({ children: [PageNumber.CURRENT] })]
    })] })
  },
  children: [/* content */]
}]

Critical Rules for docx-js

  • Set page size explicitly - docx-js defaults to A4; use US Letter (12240 x 15840 DXA) for US documents
  • Landscape: pass portrait dimensions - docx-js swaps width/height internally; pass short edge as width, long edge as height, and set orientation: PageOrientation.LANDSCAPE
  • Never use \ - use separate Paragraph elements
  • Never use unicode bullets - use LevelFormat.BULLET with numbering config
  • PageBreak must be in Paragraph - standalone creates invalid XML
  • ImageRun requires type - always specify png/jpg/etc
  • Always set table width with DXA - never use WidthType.PERCENTAGE (breaks in Google Docs)
  • Tables need dual widths - columnWidths array AND cell width, both must match
  • Table width = sum of columnWidths - for DXA, ensure they add up exactly
  • Always add cell margins - use margins: { top: 80, bottom: 80, left: 120, right: 120 } for readable padding
  • Use ShadingType.CLEAR - never SOLID for table shading
  • Never use tables as dividers/rules - cells have minimum height and render as empty boxes (including in headers/footers); use border: { bottom: { style: BorderStyle.SINGLE, size: 6, color: "2E75B6", space: 1 } } on a Paragraph instead. For two-column footers, use tab stops (see Tab Stops section), not tables
  • TOC requires HeadingLevel only - no custom styles on heading paragraphs
  • Override built-in styles - use exact IDs: "Heading1", "Heading2", etc.
  • Include outlineLevel - required for TOC (0 for H1, 1 for H2, etc.)

Editing Existing Documents

Follow all 3 steps in order.

Step 1: Unpack

python scripts/office/unpack.py document.docx unpacked/

Extracts XML, pretty-prints, merges adjacent runs, and converts smart quotes to XML entities (“ etc.) so they survive editing. Use --merge-runs false to skip run merging.

Step 2: Edit XML

Edit files in unpacked/word/. See XML Reference below for patterns.

Use "Claude" as the author for tracked changes and comments, unless the user explicitly requests use of a different name.

Use the Edit tool directly for string replacement. Do not write Python scripts. Scripts introduce unnecessary complexity. The Edit tool shows exactly what is being replaced.

CRITICAL: Use smart quotes for new content. When adding text with apostrophes or quotes, use XML entities to produce smart quotes:

\x3C!-- Use these entities for professional typography -->
\x3Cw:t>Here’s a quote: “Hello”\x3C/w:t>
Entity Character
‘ ‘ (left single)
’ ’ (right single / apostrophe)
“ “ (left double)
” ” (right double)

Adding comments: Use comment.py to handle boilerplate across multiple XML files (text must be pre-escaped XML):

python scripts/comment.py unpacked/ 0 "Comment text with & and ’"
python scripts/comment.py unpacked/ 1 "Reply text" --parent 0  # reply to comment 0
python scripts/comment.py unpacked/ 0 "Text" --author "Custom Author"  # custom author name

Then add markers to document.xml (see Comments in XML Reference).

Step 3: Pack

python scripts/office/pack.py unpacked/ output.docx --original document.docx

Validates with auto-repair, condenses XML, and creates DOCX. Use --validate false to skip.

Auto-repair will fix:

  • durableId >= 0x7FFFFFFF (regenerates valid ID)
  • Missing xml:space="preserve" on \x3Cw:t> with whitespace

Auto-repair won't fix:

  • Malformed XML, invalid element nesting, missing relationships, schema violations

Common Pitfalls

  • Replace entire \x3Cw:r> elements: When adding tracked changes, replace the whole \x3Cw:r>...\x3C/w:r> block with \x3Cw:del>...\x3Cw:ins>... as siblings. Don't inject tracked change tags inside a run.
  • Preserve \x3Cw:rPr> formatting: Copy the original run's \x3Cw:rPr> block into your tracked change runs to maintain bold, font size, etc.

XML Reference

Schema Compliance

  • Element order in \x3Cw:pPr>: \x3Cw:pStyle>, \x3Cw:numPr>, \x3Cw:spacing>, \x3Cw:ind>, \x3Cw:jc>, \x3Cw:rPr> last
  • Whitespace: Add xml:space="preserve" to \x3Cw:t> with leading/trailing spaces
  • RSIDs: Must be 8-digit hex (e.g., 00AB1234)

Tracked Changes

Insertion:

\x3Cw:ins w:id="1" w:author="Claude" w:date="2025-01-01T00:00:00Z">
  \x3Cw:r>\x3Cw:t>inserted text\x3C/w:t>\x3C/w:r>
\x3C/w:ins>

Deletion:

\x3Cw:del w:id="2" w:author="Claude" w:date="2025-01-01T00:00:00Z">
  \x3Cw:r>\x3Cw:delText>deleted text\x3C/w:delText>\x3C/w:r>
\x3C/w:del>

Inside \x3Cw:del>: Use \x3Cw:delText> instead of \x3Cw:t>, and \x3Cw:delInstrText> instead of \x3Cw:instrText>.

Minimal edits - only mark what changes:

\x3C!-- Change "30 days" to "60 days" -->
\x3Cw:r>\x3Cw:t>The term is \x3C/w:t>\x3C/w:r>
\x3Cw:del w:id="1" w:author="Claude" w:date="...">
  \x3Cw:r>\x3Cw:delText>30\x3C/w:delText>\x3C/w:r>
\x3C/w:del>
\x3Cw:ins w:id="2" w:author="Claude" w:date="...">
  \x3Cw:r>\x3Cw:t>60\x3C/w:t>\x3C/w:r>
\x3C/w:ins>
\x3Cw:r>\x3Cw:t> days.\x3C/w:t>\x3C/w:r>

Deleting entire paragraphs/list items - when removing ALL content from a paragraph, also mark the paragraph mark as deleted so it merges with the next paragraph. Add \x3Cw:del/> inside \x3Cw:pPr>\x3Cw:rPr>:

\x3Cw:p>
  \x3Cw:pPr>
    \x3Cw:numPr>...\x3C/w:numPr>  \x3C!-- list numbering if present -->
    \x3Cw:rPr>
      \x3Cw:del w:id="1" w:author="Claude" w:date="2025-01-01T00:00:00Z"/>
    \x3C/w:rPr>
  \x3C/w:pPr>
  \x3Cw:del w:id="2" w:author="Claude" w:date="2025-01-01T00:00:00Z">
    \x3Cw:r>\x3Cw:delText>Entire paragraph content being deleted...\x3C/w:delText>\x3C/w:r>
  \x3C/w:del>
\x3C/w:p>

Without the \x3Cw:del/> in \x3Cw:pPr>\x3Cw:rPr>, accepting changes leaves an empty paragraph/list item.

Rejecting another author's insertion - nest deletion inside their insertion:

\x3Cw:ins w:author="Jane" w:id="5">
  \x3Cw:del w:author="Claude" w:id="10">
    \x3Cw:r>\x3Cw:delText>their inserted text\x3C/w:delText>\x3C/w:r>
  \x3C/w:del>
\x3C/w:ins>

Restoring another author's deletion - add insertion after (don't modify their deletion):

\x3Cw:del w:author="Jane" w:id="5">
  \x3Cw:r>\x3Cw:delText>deleted text\x3C/w:delText>\x3C/w:r>
\x3C/w:del>
\x3Cw:ins w:author="Claude" w:id="10">
  \x3Cw:r>\x3Cw:t>deleted text\x3C/w:t>\x3C/w:r>
\x3C/w:ins>

Comments

After running comment.py (see Step 2), add markers to document.xml. For replies, use --parent flag and nest markers inside the parent's.

CRITICAL: \x3Cw:commentRangeStart> and \x3Cw:commentRangeEnd> are siblings of \x3Cw:r>, never inside \x3Cw:r>.

\x3C!-- Comment markers are direct children of w:p, never inside w:r -->
\x3Cw:commentRangeStart w:id="0"/>
\x3Cw:del w:id="1" w:author="Claude" w:date="2025-01-01T00:00:00Z">
  \x3Cw:r>\x3Cw:delText>deleted\x3C/w:delText>\x3C/w:r>
\x3C/w:del>
\x3Cw:r>\x3Cw:t> more text\x3C/w:t>\x3C/w:r>
\x3Cw:commentRangeEnd w:id="0"/>
\x3Cw:r>\x3Cw:rPr>\x3Cw:rStyle w:val="CommentReference"/>\x3C/w:rPr>\x3Cw:commentReference w:id="0"/>\x3C/w:r>

\x3C!-- Comment 0 with reply 1 nested inside -->
\x3Cw:commentRangeStart w:id="0"/>
  \x3Cw:commentRangeStart w:id="1"/>
  \x3Cw:r>\x3Cw:t>text\x3C/w:t>\x3C/w:r>
  \x3Cw:commentRangeEnd w:id="1"/>
\x3Cw:commentRangeEnd w:id="0"/>
\x3Cw:r>\x3Cw:rPr>\x3Cw:rStyle w:val="CommentReference"/>\x3C/w:rPr>\x3Cw:commentReference w:id="0"/>\x3C/w:r>
\x3Cw:r>\x3Cw:rPr>\x3Cw:rStyle w:val="CommentReference"/>\x3C/w:rPr>\x3Cw:commentReference w:id="1"/>\x3C/w:r>

Images

  1. Add image file to word/media/
  2. Add relationship to word/_rels/document.xml.rels:
\x3CRelationship Id="rId5" Type=".../image" Target="media/image1.png"/>
  1. Add content type to [Content_Types].xml:
\x3CDefault Extension="png" ContentType="image/png"/>
  1. Reference in document.xml:
\x3Cw:drawing>
  \x3Cwp:inline>
    \x3Cwp:extent cx="914400" cy="914400"/>  \x3C!-- EMUs: 914400 = 1 inch -->
    \x3Ca:graphic>
      \x3Ca:graphicData uri=".../picture">
        \x3Cpic:pic>
          \x3Cpic:blipFill>\x3Ca:blip r:embed="rId5"/>\x3C/pic:blipFill>
        \x3C/pic:pic>
      \x3C/a:graphicData>
    \x3C/a:graphic>
  \x3C/wp:inline>
\x3C/w:drawing>

Dependencies

  • pandoc: Text extraction
  • docx: npm install -g docx (new documents)
  • LibreOffice: PDF conversion (auto-configured for sandboxed environments via scripts/office/soffice.py)
  • Poppler: pdftoppm for images
安全使用建议
This package provides substantial docx-processing utilities and the code appears to implement the advertised features, but there are several practical and security concerns you should consider before installing or running it: - Undeclared dependencies: The code expects LibreOffice (soffice), pandoc, pdftoppm, a system C compiler (gcc), npm/node (for docx-js examples), and Python libraries (defusedxml, lxml). If those are missing the scripts may fail or behave unexpectedly. - Native compilation & LD_PRELOAD: The soffice helper will write C source to /tmp and call gcc to build a shared object, then set LD_PRELOAD for soffice. Compiling and preloading native code is powerful and can change process behavior; only run this in environments you control and trust (or disable the shim if not needed). - Persistent side-effects: The accept_changes flow installs a LibreOffice macro into a profile path under /tmp and then invokes soffice to execute it. Macros can be executables in the LibreOffice context and the macro/profile persists until removed. Review the macro content and be comfortable with these modifications. - Legal/license note: The LICENSE.txt claims proprietary Anthropic terms and includes restrictive clauses about extracting or retaining materials. Ensure you are permitted to use and retain this code under that license before copying it into other systems. - Mitigations: Run the skill in a sandboxed VM or container, inspect/validate the C shim and macro source before allowing execution, install required dependencies deliberately, or disable the shim/helper that compiles native code if your environment doesn't need it. If you need to trust this skill, ask the publisher for a clear dependency/install manifest and rationale for the native shim and macro usage. If you want, I can: 1) produce a checklist of required dependencies and commands to run safely in a container; 2) summarize the exact files that will be written/created at runtime; or 3) point out the exact lines that perform compilation and macro installation for easier review.
功能分析
Type: OpenClaw Skill Name: docx-anthropic Version: 1.0.0 The bundle contains a high-risk script in `scripts/office/soffice.py` that compiles a C shim at runtime and utilizes `LD_PRELOAD` to intercept system calls (socket, listen, accept, close). While the code appears designed to bypass sandbox restrictions on Unix sockets to allow LibreOffice to function, the use of library preloading and runtime compilation of system-level shims is a classic indicator of potential evasion or interception techniques. No evidence of intentional data exfiltration or malicious command-and-control was found, but the capability is significantly more privileged than typical document processing logic.
能力评估
Purpose & Capability
The skill's stated purpose (create/read/edit .docx) aligns with the included Python scripts for unpacking/packing/validation/comments/accepting changes. However the SKILL metadata declares no required binaries or env vars while the code expects/uses many external tools (soffice/LibreOffice, pandoc, pdftoppm, npm 'docx' package, gcc) and Python packages (defusedxml, lxml). Those undeclared runtime dependencies are inconsistent with the simple description and increase runtime risk.
Instruction Scope
SKILL.md instructions are focused on .docx tasks and reference commands (pandoc, soffice, npm docx) that are coherent with the purpose. The runtime scripts however will read and modify document files and write to temp locations and a LibreOffice user profile (/tmp/libreoffice_docx_profile), and one script installs a LibreOffice macro into that profile — behavior that is within document-editing scope but has side effects on the host environment that the description doesn't call out.
Install Mechanism
There is no install spec, yet the package contains code which at runtime will attempt to compile native C (writes lo_socket_shim.c to /tmp and invokes gcc to build lo_socket_shim.so) and then set LD_PRELOAD when running soffice. Compiling and loading native code at runtime is a high-risk operation; it's not documented in SKILL.md's dependency list and requires a C toolchain and permissions to execute gcc and write to /tmp.
Credentials
The skill does not request credentials or environment variables in metadata. The scripts use and copy environment variables (e.g., env copy for get_soffice_env) and set LD_PRELOAD, but they do not require secrets. The number and sensitivity of requested env/config items is proportionate, although the skill will create files under /tmp and modify a LibreOffice profile directory.
Persistence & Privilege
always:false (no forced inclusion). The skill modifies local state: it writes a LibreOffice macro into /tmp/libreoffice_docx_profile and creates a compiled shim in the temp dir (lo_socket_shim.so). These artifacts persist in the filesystem (temporary directory) and can affect subsequent LibreOffice runs via the UserInstallation path and LD_PRELOAD. This is a meaningful system-level side effect and should be evaluated before use.
如何使用
  1. 确保已安装 OpenClaw(本地或 Docker 部署)
  2. 在对话框中输入安装命令:/install docx-anthropic
  3. 安装完成后,直接呼叫该 Skill 的名称或使用 /docx-anthropic 触发
  4. 根据 Skill 的参数说明提供必要输入,即可获得结构化输出
版本历史
v1.0.0
Initial release of the docx skill for working with Word documents: - Create, read, edit, and manipulate .docx files, including formatting, comments, images, and tracked changes. - Comprehensive usage guide for common tasks: extraction, conversion, and validation of Word documents. - Provides code and command-line examples for document generation (JavaScript, Bash, Python). - Details on setting page size, styles, lists, and critically correct ways to create tables for cross-platform compatibility. - Strict triggers: only activates on .docx/Word document requests, not for PDFs, Google Docs, or spreadsheets.
元数据
Slug docx-anthropic
版本 1.0.0
许可证 MIT-0
累计安装 2
当前安装数 2
历史版本数 1
常见问题

Docx Anthropic 是什么?

Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files). Triggers include: any mention of 'Word doc', 'word... 它是一个面向 Claude Code / OpenClaw 的 AI Agent Skill 插件,目前累计下载 380 次。

如何安装 Docx Anthropic?

在 OpenClaw 或 Claude Code 对话框中运行命令「/install docx-anthropic」即可一键安装,无需额外配置。

Docx Anthropic 是免费的吗?

是的,Docx Anthropic 完全免费,采用 MIT-0 许可证,可自由下载、安装和使用。

Docx Anthropic 支持哪些平台?

Docx Anthropic 跨平台运行,可在任意部署了 OpenClaw / Claude Code 的环境中使用(cross-platform)。

谁开发了 Docx Anthropic?

由 pupuking723(@pupuking723)开发并维护,当前版本 v1.0.0。

💬 留言讨论