<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Agent Skill on KnightLi Blog</title>
        <link>https://www.knightli.com/en/tags/agent-skill/</link>
        <description>Recent content in Agent Skill on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Mon, 06 Apr 2026 10:00:00 +0800</lastBuildDate><atom:link href="https://www.knightli.com/en/tags/agent-skill/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Using AI Agent Skills to Maintain a Hugo Multilingual Blog</title>
        <link>https://www.knightli.com/en/2026/04/06/agent-skill-sync-post-translations-guide/</link>
        <pubDate>Mon, 06 Apr 2026 10:00:00 +0800</pubDate>
        
        <guid>https://www.knightli.com/en/2026/04/06/agent-skill-sync-post-translations-guide/</guid>
        <description>&lt;p&gt;If you maintain a Hugo multilingual blog, you probably run into a frequent pain point:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After finishing Chinese content, you still need synchronized English and Traditional Chinese versions&lt;/li&gt;
&lt;li&gt;All language files must keep the same structure&lt;/li&gt;
&lt;li&gt;Front matter must be translated while still following Hugo format rules&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;sync-post-translations&lt;/code&gt; is built for exactly this scenario.&lt;/p&gt;
&lt;h2 id=&#34;what-problem-this-skill-solves&#34;&gt;What Problem This Skill Solves
&lt;/h2&gt;&lt;p&gt;The positioning of &lt;code&gt;sync-post-translations&lt;/code&gt; is straightforward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use &lt;code&gt;index.zh-cn.md&lt;/code&gt; as the source file&lt;/li&gt;
&lt;li&gt;Generate or update &lt;code&gt;index.en.md&lt;/code&gt; and &lt;code&gt;index.zh-tw.md&lt;/code&gt; in the same directory&lt;/li&gt;
&lt;li&gt;Keep Markdown structure consistent&lt;/li&gt;
&lt;li&gt;Apply explicit front matter rules (especially &lt;code&gt;date&lt;/code&gt; and &lt;code&gt;slug&lt;/code&gt;)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Example trigger phrases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Sync translation to English and Traditional Chinese&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Translate this post to English and Traditional Chinese&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;skill-directory-structure&#34;&gt;Skill Directory Structure
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.\sync-post-translations\
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;├─ SKILL.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;└─ agents\
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   └─ openai.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;core-code-1-skillmd&#34;&gt;Core Code 1: SKILL.md
&lt;/h2&gt;&lt;p&gt;Below is the core rules file of this skill:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;name: sync-post-translations
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;description: 将 Hugo 文章从简体中文源文件（&lt;span class=&#34;sb&#34;&gt;`index.zh-cn.md`&lt;/span&gt;）同步翻译为英文（&lt;span class=&#34;sb&#34;&gt;`index.en.md`&lt;/span&gt;）和繁体中文（&lt;span class=&#34;sb&#34;&gt;`index.zh-tw.md`&lt;/span&gt;）。当用户提出“en 繁体”“同步翻译英文繁体”或要求同时生成/更新两种语言版本且需保持 front matter 与 Markdown 结构一致时使用。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;# 同步文章翻译
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;使用此技能为同一篇文章生成或更新多语言版本。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## 工作流程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;1.&lt;/span&gt; 在目标文章目录中定位源文件 &lt;span class=&#34;sb&#34;&gt;`index.zh-cn.md`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;2.&lt;/span&gt; 读取完整 front matter 与正文内容。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;3.&lt;/span&gt; 在同目录创建或更新 &lt;span class=&#34;sb&#34;&gt;`index.en.md`&lt;/span&gt; 与 &lt;span class=&#34;sb&#34;&gt;`index.zh-tw.md`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;4.&lt;/span&gt; 确保三语结构对齐后执行 Hugo 构建检查。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## 翻译规则
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;1.&lt;/span&gt; 严格保留 &lt;span class=&#34;sb&#34;&gt;`slug`&lt;/span&gt; 原值。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;2.&lt;/span&gt; &lt;span class=&#34;sb&#34;&gt;`date`&lt;/span&gt; 统一规范为 Hugo 常用带时间格式（RFC3339），示例：&lt;span class=&#34;sb&#34;&gt;`2026-04-05T10:00:00+08:00`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;3.&lt;/span&gt; 自然翻译以下 front matter 字段：&lt;span class=&#34;sb&#34;&gt;`title`&lt;/span&gt;、&lt;span class=&#34;sb&#34;&gt;`description`&lt;/span&gt;、&lt;span class=&#34;sb&#34;&gt;`tags`&lt;/span&gt;、&lt;span class=&#34;sb&#34;&gt;`categories`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;4.&lt;/span&gt; 保持 Markdown 结构不变：标题层级、列表形态、代码块、链接与命令行示例。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;5.&lt;/span&gt; 技术标识符保持原样：文件名、CLI 参数、模型名、设备名、URL、包名等。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;6.&lt;/span&gt; 若 YAML 的 &lt;span class=&#34;sb&#34;&gt;`title`&lt;/span&gt; 含有 &lt;span class=&#34;sb&#34;&gt;`:`&lt;/span&gt;，必须加引号，避免解析报错。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;7.&lt;/span&gt; 在不改变语义前提下，使用目标语言自然标点与表达习惯（&lt;span class=&#34;sb&#34;&gt;`en`&lt;/span&gt;、&lt;span class=&#34;sb&#34;&gt;`zh-tw`&lt;/span&gt;）。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## 输出约定
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;1.&lt;/span&gt; 仅在源文章同目录写入目标文件。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;2.&lt;/span&gt; 汇报变更的文件路径。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;3.&lt;/span&gt; 条件允许时执行 &lt;span class=&#34;sb&#34;&gt;`hugo --source . --destination public`&lt;/span&gt;，并反馈通过/失败；失败时给出关键报错行。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## 质量标准
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;1.&lt;/span&gt; 全文术语前后一致。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;2.&lt;/span&gt; 避免机器直译感，优先可发布文风。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;3.&lt;/span&gt; 章节内容完整，不省略示例、注意点与总结。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;core-code-2-agentsopenaiyaml&#34;&gt;Core Code 2: agents/openai.yaml
&lt;/h2&gt;&lt;p&gt;This file defines how the skill is presented and prompted on the agent side:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;display_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;同步文章翻译&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;short_description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;生成或更新 EN + ZH-TW 翻译稿&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;default_prompt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;使用该技能在同一 Hugo 文章目录中，从 `index.zh-cn.md` 生成或同步 `index.en.md` 与 `index.zh-tw.md`，保留 `date` 与 `slug`，保持 Markdown 结构一致，并执行 Hugo 构建校验。&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;practical-usage-example&#34;&gt;Practical Usage Example
&lt;/h2&gt;&lt;h3 id=&#34;1-natural-language-trigger&#34;&gt;1) Natural language trigger
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;请把 content/post/2026/04/06/index.zh-cn.md 同步翻译成英文和繁体，
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;要求 date 用 RFC3339，slug 不变，最后跑 hugo 校验。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;2-expected-output&#34;&gt;2) Expected output
&lt;/h3&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;已更新：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- content/post/2026/04/06/index.en.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- content/post/2026/04/06/index.zh-tw.md
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;构建校验：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- hugo --source . --destination public
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 结果：PASS
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;why-these-rules-matter&#34;&gt;Why These Rules Matter
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Keeping &lt;code&gt;slug&lt;/code&gt; unchanged preserves stable URLs and historical backlinks.&lt;/li&gt;
&lt;li&gt;Normalizing &lt;code&gt;date&lt;/code&gt; to RFC3339 with timezone avoids Hugo/theme parsing ambiguity.&lt;/li&gt;
&lt;li&gt;Keeping Markdown structure unchanged prevents TOC, code block, and shortcode rendering issues.&lt;/li&gt;
&lt;li&gt;Not translating technical identifiers significantly reduces broken command/file mismatches.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;common-pitfalls-and-how-to-avoid-them&#34;&gt;Common Pitfalls and How to Avoid Them
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;If &lt;code&gt;title&lt;/code&gt; contains &lt;code&gt;:&lt;/code&gt; without quotes, YAML parsing can fail.&lt;/li&gt;
&lt;li&gt;Translating &lt;code&gt;--flags&lt;/code&gt;, URLs, or package names will break command examples.&lt;/li&gt;
&lt;li&gt;If heading levels differ across languages (for example, &lt;code&gt;##&lt;/code&gt; becoming &lt;code&gt;###&lt;/code&gt;), anchors can become inconsistent.&lt;/li&gt;
&lt;li&gt;Translating only body content but not front matter can break list pages and SEO metadata.&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>Analyzing Anthropic&#39;s docx Agent Skill: Features, Code Structure, Usage, and Caveats</title>
        <link>https://www.knightli.com/en/2026/04/04/analyze-docx-agent-skill/</link>
        <pubDate>Sat, 04 Apr 2026 11:00:00 +0800</pubDate>
        
        <guid>https://www.knightli.com/en/2026/04/04/analyze-docx-agent-skill/</guid>
        <description>&lt;p&gt;Anthropic&amp;rsquo;s &lt;code&gt;skills/docx&lt;/code&gt; is essentially a workflow spec plus a script toolkit for handling Word documents more reliably with AI.&lt;br&gt;
It does not just tell a model to &amp;ldquo;generate a &lt;code&gt;.docx&lt;/code&gt;.&amp;rdquo; Instead, it breaks document work into explicit paths: create, read, edit existing files, handle tracked changes, add comments, convert formats, and validate OOXML structure.&lt;/p&gt;
&lt;p&gt;If we reduce it to one line:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It treats &lt;code&gt;.docx&lt;/code&gt; as ZIP + XML + Office compatibility constraints, not as a black box.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;what-this-skill-solves&#34;&gt;What this skill solves
&lt;/h2&gt;&lt;p&gt;When general-purpose models handle Word files, we often see the same failure patterns:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;They output text, but not a structurally valid &lt;code&gt;.docx&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;They break OOXML while editing existing documents.&lt;/li&gt;
&lt;li&gt;They do not know which XML parts to update for comments or tracked changes.&lt;/li&gt;
&lt;li&gt;Output opens in one app but behaves inconsistently across Word, LibreOffice, and Google Docs.&lt;/li&gt;
&lt;li&gt;They lack clear routing for when to use &lt;code&gt;pandoc&lt;/code&gt; vs. unpack/edit/repack.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The value of this skill is that it front-loads those decisions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;pandoc&lt;/code&gt; or unpacking for reading and analysis.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;docx-js&lt;/code&gt; for creating new &lt;code&gt;.docx&lt;/code&gt; files.&lt;/li&gt;
&lt;li&gt;Use &amp;ldquo;unpack -&amp;gt; edit XML -&amp;gt; repack -&amp;gt; validate&amp;rdquo; for existing documents.&lt;/li&gt;
&lt;li&gt;Use dedicated scripts for tracked changes/comments/schema-sensitive operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That approach works because Word problems are usually not about wording quality. They are about structural correctness and compatibility.&lt;/p&gt;
&lt;h2 id=&#34;directory-and-code-structure&#34;&gt;Directory and code structure
&lt;/h2&gt;&lt;p&gt;This skill can be understood in four layers.&lt;/p&gt;
&lt;h3 id=&#34;1-guidance-layer-skillmd&#34;&gt;1. Guidance layer: &lt;code&gt;SKILL.md&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; does two important jobs:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It defines trigger conditions.&lt;br&gt;
If a request mentions Word, &lt;code&gt;.docx&lt;/code&gt;, comments, tracked changes, TOC, page numbers, or polished document formatting, this skill should be activated.&lt;/li&gt;
&lt;li&gt;It defines execution routes.&lt;br&gt;
Different task types map to different toolchains, instead of improvising every run.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It also captures practical compatibility rules, for example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docx-js&lt;/code&gt; defaults to A4, not US Letter.&lt;/li&gt;
&lt;li&gt;Landscape page sizing must follow &lt;code&gt;docx-js&lt;/code&gt; internals.&lt;/li&gt;
&lt;li&gt;Lists should not be built from manual Unicode bullets.&lt;/li&gt;
&lt;li&gt;Table width needs coordinated settings at table and cell levels.&lt;/li&gt;
&lt;li&gt;Image &lt;code&gt;type&lt;/code&gt; is required.&lt;/li&gt;
&lt;li&gt;Generated files should be validated.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That is a strong signal that the goal is not just &amp;ldquo;generate something,&amp;rdquo; but &amp;ldquo;generate something that is robust.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;2-office-package-layer-scriptsoffice&#34;&gt;2. Office package layer: &lt;code&gt;scripts/office/*&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;This layer treats &lt;code&gt;.docx/.pptx/.xlsx&lt;/code&gt; as Open XML packages.&lt;/p&gt;
&lt;h3 id=&#34;unpackpy&#34;&gt;&lt;code&gt;unpack.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;This script unpacks files and prepares XML for safer editing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extracts ZIP package content&lt;/li&gt;
&lt;li&gt;Pretty-prints XML and &lt;code&gt;.rels&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Optionally runs &lt;code&gt;merge_runs&lt;/code&gt; for DOCX&lt;/li&gt;
&lt;li&gt;Optionally runs &lt;code&gt;simplify_redlines&lt;/code&gt; for DOCX&lt;/li&gt;
&lt;li&gt;Escapes smart quotes into XML entities&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So it is not just decompression. It normalizes content into an editing-friendly shape.&lt;/p&gt;
&lt;h3 id=&#34;packpy&#34;&gt;&lt;code&gt;pack.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;This script repacks a directory into &lt;code&gt;.docx/.pptx/.xlsx&lt;/code&gt;.&lt;br&gt;
Before packaging, it can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Run validation and auto-repair&lt;/li&gt;
&lt;li&gt;Condense XML formatting safely&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If &lt;code&gt;--original&lt;/code&gt; is provided, it compares and validates against the source context.&lt;br&gt;
That matters because &amp;ldquo;repacked successfully&amp;rdquo; is not equal to &amp;ldquo;semantically safe.&amp;rdquo;&lt;/p&gt;
&lt;h3 id=&#34;validatepy&#34;&gt;&lt;code&gt;validate.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;This is the quality gate. It checks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XML well-formedness&lt;/li&gt;
&lt;li&gt;Namespace correctness&lt;/li&gt;
&lt;li&gt;Unique ID constraints&lt;/li&gt;
&lt;li&gt;Relationship/content type consistency&lt;/li&gt;
&lt;li&gt;XSD compliance&lt;/li&gt;
&lt;li&gt;Whitespace preservation rules&lt;/li&gt;
&lt;li&gt;Insertion/deletion/comment marker constraints&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For DOCX work, this is a core component, not an optional extra.&lt;/p&gt;
&lt;h3 id=&#34;sofficepy&#34;&gt;&lt;code&gt;soffice.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;This helper wraps LibreOffice execution for restricted/sandboxed environments.&lt;br&gt;
It configures &lt;code&gt;SAL_USE_VCLPLUGIN=svp&lt;/code&gt; and can apply a shim for AF_UNIX socket limitations when needed.&lt;/p&gt;
&lt;p&gt;That tells us the skill is designed for automated agent workflows, not only local manual usage.&lt;/p&gt;
&lt;h2 id=&#34;3-word-specific-layer-comments-revisions-and-redlines&#34;&gt;3. Word-specific layer: comments, revisions, and redlines
&lt;/h2&gt;&lt;h3 id=&#34;commentpy&#34;&gt;&lt;code&gt;comment.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;This script adds comments to DOCX, including required package plumbing across multiple parts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;word/comments.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentsExtended.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentsIds.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentsExtensible.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;comment range markers in &lt;code&gt;document.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;declarations in &lt;code&gt;[Content_Types].xml&lt;/code&gt; and &lt;code&gt;document.xml.rels&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If comment parts do not exist yet, it can initialize templates and required relationships/content types.&lt;/p&gt;
&lt;h3 id=&#34;accept_changespy&#34;&gt;&lt;code&gt;accept_changes.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;This script accepts all tracked changes via LibreOffice headless + macro (&lt;code&gt;.uno:AcceptAllTrackedChanges&lt;/code&gt;) rather than fragile raw XML surgery.&lt;/p&gt;
&lt;p&gt;That is a pragmatic choice because accepting revisions is a behavior-level operation, not just deleting &lt;code&gt;&amp;lt;w:ins&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;lt;w:del&amp;gt;&lt;/code&gt; tags.&lt;/p&gt;
&lt;h3 id=&#34;validatorsredliningpy&#34;&gt;&lt;code&gt;validators/redlining.py&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;This is one of the most valuable pieces.&lt;br&gt;
It removes tracked changes for a specific author in both original and modified documents, then compares resulting text to verify that changes are properly represented in revision markup.&lt;/p&gt;
&lt;p&gt;So it validates revision semantics, not only XML syntax.&lt;/p&gt;
&lt;h2 id=&#34;4-schema-and-support-layer-schemas-helpers-templates&#34;&gt;4. Schema and support layer: &lt;code&gt;schemas/&lt;/code&gt;, &lt;code&gt;helpers/&lt;/code&gt;, &lt;code&gt;templates/&lt;/code&gt;
&lt;/h2&gt;&lt;h3 id=&#34;schemas&#34;&gt;&lt;code&gt;schemas/&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Contains OOXML/ECMA/Microsoft-related XSD files used by validators.&lt;br&gt;
Validation is therefore grounded in formal schema constraints.&lt;/p&gt;
&lt;h3 id=&#34;helpers&#34;&gt;&lt;code&gt;helpers/&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Includes utilities such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;merge_runs.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;simplify_redlines.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These stabilize XML structure for clearer edits and diffs.&lt;/p&gt;
&lt;h3 id=&#34;templates&#34;&gt;&lt;code&gt;templates/&lt;/code&gt;
&lt;/h3&gt;&lt;p&gt;Contains XML templates needed for comment support, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;comments.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentsExtended.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentsIds.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commentsExtensible.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;people.xml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These templates help avoid package-level inconsistencies when creating comment-related parts.&lt;/p&gt;
&lt;h2 id=&#34;typical-usage-patterns&#34;&gt;Typical usage patterns
&lt;/h2&gt;&lt;p&gt;From &lt;code&gt;SKILL.md&lt;/code&gt;, the most common workflows are:&lt;/p&gt;
&lt;h2 id=&#34;scenario-1-readanalyze-an-existing-docx&#34;&gt;Scenario 1: Read/analyze an existing DOCX
&lt;/h2&gt;&lt;p&gt;Use &lt;code&gt;pandoc&lt;/code&gt; for text-level extraction with tracked changes:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pandoc --track-changes&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;all document.docx -o output.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Use unpacking for raw XML inspection:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python scripts/office/unpack.py document.docx unpacked/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;scenario-2-create-a-new-docx&#34;&gt;Scenario 2: Create a new DOCX
&lt;/h2&gt;&lt;p&gt;Use &lt;code&gt;docx-js&lt;/code&gt; for generation:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g docx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then validate:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python scripts/office/validate.py doc.docx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;scenario-3-edit-an-existing-docx&#34;&gt;Scenario 3: Edit an existing DOCX
&lt;/h2&gt;&lt;p&gt;Core workflow:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python scripts/office/unpack.py document.docx unpacked/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# edit XML under unpacked/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python scripts/office/pack.py unpacked/ output.docx --original document.docx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;--original&lt;/code&gt; is the critical part because it enables stronger structural and revision-aware checks.&lt;/p&gt;
&lt;h2 id=&#34;scenario-4-accept-all-tracked-changes&#34;&gt;Scenario 4: Accept all tracked changes
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python scripts/accept_changes.py input.docx output.docx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Requires LibreOffice; useful for producing a clean post-review file.&lt;/p&gt;
&lt;h2 id=&#34;scenario-5-add-comments&#34;&gt;Scenario 5: Add comments
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python comment.py unpacked/ &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Comment text&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python comment.py unpacked/ &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Reply text&amp;#34;&lt;/span&gt; --parent &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You still need to place comment range markers in &lt;code&gt;document.xml&lt;/code&gt; where the comment should attach.&lt;/p&gt;
&lt;h2 id=&#34;key-caveats-to-remember&#34;&gt;Key caveats to remember
&lt;/h2&gt;&lt;h3 id=&#34;1-docx-is-not-a-plain-text-file&#34;&gt;1. &lt;code&gt;.docx&lt;/code&gt; is not a plain text file
&lt;/h3&gt;&lt;p&gt;A single edit may involve body XML, relationships, content types, comment parts, IDs, and schema constraints.&lt;/p&gt;
&lt;h3 id=&#34;2-docx-js-generation-still-needs-explicit-guardrails&#34;&gt;2. &lt;code&gt;docx-js&lt;/code&gt; generation still needs explicit guardrails
&lt;/h3&gt;&lt;p&gt;Defaults can be wrong for your target layout and compatibility goals.&lt;/p&gt;
&lt;h3 id=&#34;3-comments-and-tracked-changes-are-multi-part-operations&#34;&gt;3. Comments and tracked changes are multi-part operations
&lt;/h3&gt;&lt;p&gt;They are package-level features, not single-tag edits.&lt;/p&gt;
&lt;h3 id=&#34;4-opens-successfully-does-not-mean-correctly-modified&#34;&gt;4. &amp;ldquo;Opens successfully&amp;rdquo; does not mean &amp;ldquo;correctly modified&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;Many issues only surface later during editing, reviewing, cross-app opening, or acceptance of changes.&lt;/p&gt;
&lt;h3 id=&#34;5-environment-readiness-matters&#34;&gt;5. Environment readiness matters
&lt;/h3&gt;&lt;p&gt;You need tools such as &lt;code&gt;pandoc&lt;/code&gt;, &lt;code&gt;LibreOffice/soffice&lt;/code&gt;, &lt;code&gt;docx-js&lt;/code&gt;, and Python deps (&lt;code&gt;defusedxml&lt;/code&gt;, &lt;code&gt;lxml&lt;/code&gt;) available.&lt;/p&gt;
&lt;h2 id=&#34;what-this-skill-is-good-for-and-not&#34;&gt;What this skill is good for (and not)
&lt;/h2&gt;&lt;h3 id=&#34;good-fit&#34;&gt;Good fit
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Batch Word report generation&lt;/li&gt;
&lt;li&gt;Structured formal document production&lt;/li&gt;
&lt;li&gt;Automated edits to existing &lt;code&gt;.docx&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Tracked-changes aware workflows&lt;/li&gt;
&lt;li&gt;Automated comment insertion&lt;/li&gt;
&lt;li&gt;Agent/script-driven document pipelines&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;not-ideal&#34;&gt;Not ideal
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;Very simple PDF-only output cases&lt;/li&gt;
&lt;li&gt;Pure text extraction with no document fidelity requirement&lt;/li&gt;
&lt;li&gt;Fully manual visual editing workflows&lt;/li&gt;
&lt;li&gt;Zero-dependency expectations for end-to-end Word automation&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;Anthropic&amp;rsquo;s &lt;code&gt;skills/docx&lt;/code&gt; is strong not because it can &amp;ldquo;generate Word files,&amp;rdquo; but because it encodes why Word automation fails and how to handle those failure modes systematically.&lt;br&gt;
It combines generation, low-level XML editing, revision semantics, schema validation, and cross-app compatibility into one executable workflow.&lt;/p&gt;
&lt;p&gt;If your use case includes existing DOCX edits, comments, tracked changes, or compatibility-sensitive automation, this design is very practical and high value.&lt;/p&gt;
&lt;p&gt;Code location: &lt;a class=&#34;link&#34; href=&#34;https://github.com/anthropics/skills/tree/main/skills/docx&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/anthropics/skills/tree/main/skills/docx&lt;/a&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
