@panda-agent/panda-cli 0.1.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/README.md +192 -0
  2. package/bin/pandacli.mjs +85 -0
  3. package/bundled-preset-commands/README.md +3 -0
  4. package/bundled-preset-commands/init.md +78 -0
  5. package/bundled-preset-skills/.gitkeep +0 -0
  6. package/bundled-preset-skills/README.md +17 -0
  7. package/bundled-preset-skills/docx/.skill-metadata.yaml +208 -0
  8. package/bundled-preset-skills/docx/LICENSE.txt +30 -0
  9. package/bundled-preset-skills/docx/SKILL.md +663 -0
  10. package/bundled-preset-skills/docx/scripts/__init__.py +1 -0
  11. package/bundled-preset-skills/docx/scripts/accept_changes.py +206 -0
  12. package/bundled-preset-skills/docx/scripts/comment.py +442 -0
  13. package/bundled-preset-skills/docx/scripts/office/helpers/__init__.py +1 -0
  14. package/bundled-preset-skills/docx/scripts/office/helpers/merge_runs.py +190 -0
  15. package/bundled-preset-skills/docx/scripts/office/helpers/simplify_redlines.py +185 -0
  16. package/bundled-preset-skills/docx/scripts/office/pack.py +167 -0
  17. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  18. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  19. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  20. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  21. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  22. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  23. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  24. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  25. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  26. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  27. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  28. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  29. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  30. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  31. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  32. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  33. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  34. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  35. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  36. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  37. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  38. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  39. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  40. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  41. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  42. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  43. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  44. package/bundled-preset-skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  45. package/bundled-preset-skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  46. package/bundled-preset-skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  47. package/bundled-preset-skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  48. package/bundled-preset-skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
  49. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  50. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  51. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  52. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  53. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  54. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  55. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  56. package/bundled-preset-skills/docx/scripts/office/soffice.py +194 -0
  57. package/bundled-preset-skills/docx/scripts/office/unpack.py +145 -0
  58. package/bundled-preset-skills/docx/scripts/office/validate.py +114 -0
  59. package/bundled-preset-skills/docx/scripts/office/validators/__init__.py +16 -0
  60. package/bundled-preset-skills/docx/scripts/office/validators/base.py +733 -0
  61. package/bundled-preset-skills/docx/scripts/office/validators/docx.py +354 -0
  62. package/bundled-preset-skills/docx/scripts/office/validators/pptx.py +230 -0
  63. package/bundled-preset-skills/docx/scripts/office/validators/redlining.py +212 -0
  64. package/bundled-preset-skills/docx/scripts/templates/comments.xml +3 -0
  65. package/bundled-preset-skills/docx/scripts/templates/commentsExtended.xml +3 -0
  66. package/bundled-preset-skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  67. package/bundled-preset-skills/docx/scripts/templates/commentsIds.xml +3 -0
  68. package/bundled-preset-skills/docx/scripts/templates/people.xml +3 -0
  69. package/bundled-preset-skills/frontend-design/LICENSE.txt +177 -0
  70. package/bundled-preset-skills/frontend-design/SKILL.md +42 -0
  71. package/bundled-preset-skills/pdf/.skill-metadata.yaml +273 -0
  72. package/bundled-preset-skills/pdf/LICENSE.txt +30 -0
  73. package/bundled-preset-skills/pdf/SKILL.md +324 -0
  74. package/bundled-preset-skills/pdf/advanced-reference.md +609 -0
  75. package/bundled-preset-skills/pdf/form-filling-guide.md +318 -0
  76. package/bundled-preset-skills/pdf/forms.md +294 -0
  77. package/bundled-preset-skills/pdf/reference.md +612 -0
  78. package/bundled-preset-skills/pdf/scripts/check_bounding_boxes.py +198 -0
  79. package/bundled-preset-skills/pdf/scripts/check_fillable_fields.py +64 -0
  80. package/bundled-preset-skills/pdf/scripts/convert_pdf_to_images.py +102 -0
  81. package/bundled-preset-skills/pdf/scripts/create_validation_image.py +125 -0
  82. package/bundled-preset-skills/pdf/scripts/extract_form_field_info.py +220 -0
  83. package/bundled-preset-skills/pdf/scripts/extract_form_structure.py +202 -0
  84. package/bundled-preset-skills/pdf/scripts/fill_fillable_fields.py +205 -0
  85. package/bundled-preset-skills/pdf/scripts/fill_pdf_form_with_annotations.py +193 -0
  86. package/bundled-preset-skills/pptx-generator/SKILL.md +204 -0
  87. package/bundled-preset-skills/pptx-generator/assets/styles/business.json +8 -0
  88. package/bundled-preset-skills/pptx-generator/assets/styles/minimal.json +8 -0
  89. package/bundled-preset-skills/pptx-generator/assets/styles/modern.json +8 -0
  90. package/bundled-preset-skills/pptx-generator/assets/templates/ppt_data_template.json +40 -0
  91. package/bundled-preset-skills/pptx-generator/references/collaboration_guide.md +381 -0
  92. package/bundled-preset-skills/pptx-generator/references/json_format_spec.md +215 -0
  93. package/bundled-preset-skills/pptx-generator/references/layout_guide.md +290 -0
  94. package/bundled-preset-skills/pptx-generator/scripts/json_validator.py +194 -0
  95. package/bundled-preset-skills/pptx-generator/scripts/pptx_builder.py +340 -0
  96. package/bundled-preset-skills/pptx-generator/scripts/pptx_validator.py +162 -0
  97. package/bundled-preset-skills/skill-creator/LICENSE.txt +202 -0
  98. package/bundled-preset-skills/skill-creator/SKILL.md +479 -0
  99. package/bundled-preset-skills/skill-creator/agents/analyzer.md +274 -0
  100. package/bundled-preset-skills/skill-creator/agents/comparator.md +202 -0
  101. package/bundled-preset-skills/skill-creator/agents/grader.md +223 -0
  102. package/bundled-preset-skills/skill-creator/assets/eval_review.html +146 -0
  103. package/bundled-preset-skills/skill-creator/eval-viewer/generate_review.py +471 -0
  104. package/bundled-preset-skills/skill-creator/eval-viewer/viewer.html +1325 -0
  105. package/bundled-preset-skills/skill-creator/references/schemas.md +430 -0
  106. package/bundled-preset-skills/skill-creator/scripts/__init__.py +0 -0
  107. package/bundled-preset-skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  108. package/bundled-preset-skills/skill-creator/scripts/generate_report.py +326 -0
  109. package/bundled-preset-skills/skill-creator/scripts/improve_description.py +248 -0
  110. package/bundled-preset-skills/skill-creator/scripts/package_skill.py +136 -0
  111. package/bundled-preset-skills/skill-creator/scripts/quick_validate.py +103 -0
  112. package/bundled-preset-skills/skill-creator/scripts/run_eval.py +310 -0
  113. package/bundled-preset-skills/skill-creator/scripts/run_loop.py +332 -0
  114. package/bundled-preset-skills/skill-creator/scripts/utils.py +47 -0
  115. package/bundled-preset-skills/update-config/SKILL.md +71 -0
  116. package/bundled-preset-skills/xlsx/.skill-metadata.yaml +185 -0
  117. package/bundled-preset-skills/xlsx/LICENSE.txt +30 -0
  118. package/bundled-preset-skills/xlsx/SKILL.md +233 -0
  119. package/bundled-preset-skills/xlsx/scripts/office/helpers/__init__.py +1 -0
  120. package/bundled-preset-skills/xlsx/scripts/office/helpers/merge_runs.py +226 -0
  121. package/bundled-preset-skills/xlsx/scripts/office/helpers/simplify_redlines.py +198 -0
  122. package/bundled-preset-skills/xlsx/scripts/office/pack.py +162 -0
  123. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  124. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  125. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  126. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  127. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  128. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  129. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  130. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  131. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  132. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  133. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  134. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  135. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  136. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  137. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  138. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  139. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  140. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  141. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  142. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  143. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  144. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  145. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  146. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  147. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  148. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  149. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  150. package/bundled-preset-skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  151. package/bundled-preset-skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  152. package/bundled-preset-skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  153. package/bundled-preset-skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  154. package/bundled-preset-skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
  155. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  156. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  157. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  158. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  159. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  160. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  161. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  162. package/bundled-preset-skills/xlsx/scripts/office/soffice.py +185 -0
  163. package/bundled-preset-skills/xlsx/scripts/office/unpack.py +146 -0
  164. package/bundled-preset-skills/xlsx/scripts/office/validate.py +108 -0
  165. package/bundled-preset-skills/xlsx/scripts/office/validators/__init__.py +13 -0
  166. package/bundled-preset-skills/xlsx/scripts/office/validators/base.py +800 -0
  167. package/bundled-preset-skills/xlsx/scripts/office/validators/docx.py +383 -0
  168. package/bundled-preset-skills/xlsx/scripts/office/validators/pptx.py +250 -0
  169. package/bundled-preset-skills/xlsx/scripts/office/validators/redlining.py +229 -0
  170. package/bundled-preset-skills/xlsx/scripts/recalc.py +296 -0
  171. package/dist/panda-cli-ink.bundle.mjs +1 -0
  172. package/package.json +149 -0
  173. package/scripts/dedupe-react-for-cli.mjs +29 -0
  174. package/vendor/panda-ink/dist/devtools-CY9bUfXJ.js +9 -0
  175. package/vendor/panda-ink/dist/index.js +8603 -0
  176. package/vendor/panda-ink/package.json +56 -0
@@ -0,0 +1,663 @@
1
+ ---
2
+ name: docx
3
+ version: 1.0.2
4
+ description: "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 document', '.docx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use for Chinese official documents (公文、快文、机关公文) including 决定、通知、通报、纪要、报告、请示、批复、函、意见 — apply §公司公文/快文 formatting (仿宋_GB2312 三号、结构层次序数等). Also use when extracting or reorganizing content from .docx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation."
5
+ description_zh: "当用户需要创建、读取、编辑或操作 Word 文档(.docx 文件)时使用此技能。触发条件包括:任何提及 'Word 文档'、'.docx'、'公文'、'快文'、'机关公文' 的情况,或要求生成带有目录、标题、页码或信头等格式的专业文档;撰写或排版公司公文(决定、通知、通报、纪要、报告、请示、批复、函、意见)时须遵循下文 §公司公文/快文 的字体与结构层次要求。也适用于:从 .docx 文件中提取或重组内容、在文档中插入或替换图片、在 Word 文件中执行查找替换、处理修订标记或批注,或将内容转换为精美的 Word 文档。当用户要求以 Word 或 .docx 文件形式交付'报告'、'备忘录'、'信函'、'模板'或类似文档时使用此技能。不适用于 PDF、电子表格、Google Docs 或与文档生成无关的编程任务。"
6
+ license: Proprietary. LICENSE.txt has complete terms
7
+ ---
8
+
9
+ # Working with DOCX: Creation, Modification, and Inspection
10
+
11
+ A `.docx` file is a ZIP container holding a tree of XML files conforming to the OOXML standard.
12
+
13
+ ## Task Decision Matrix
14
+
15
+ | Goal | Approach |
16
+ |------|----------|
17
+ | Inspect / extract text | `pandoc` or unpack to browse raw XML |
18
+ | Build a new document | `docx-js` (see §Generating Documents) |
19
+ | Modify an existing file | Unpack → edit XML → repack (see §Patching Existing Documents) |
20
+ | 公司公文 / 快文 | Follow §公司公文/快文 below (overrides default Arial styles) |
21
+
22
+ ---
23
+
24
+ ## 公司公文 / 快文
25
+
26
+ 当用户要求撰写、排版或修改**公文**、**快文**及同类机关/企业正式文书时,优先遵循本节;本节优先于下文 §Heading Styles 中的 Arial 默认样式。
27
+
28
+ ### 适用范围与原则
29
+
30
+ 1. **适用范围**:适用于公司各部门、中心的公文处理工作。
31
+ 2. **处理原则**:公文处理应当坚持**实事求是、准确规范、精简高效、安全保密**。
32
+
33
+ ### 公文种类
34
+
35
+ 公司通用公文种类主要有:**决定、通知、通报、纪要、报告、请示、批复、函、意见**。生成或修改文档时,文种标题、行文语气与结构须与所选文种相符。
36
+
37
+ ### 正文
38
+
39
+ 正文是公文的主体,用来表述公文的内容。
40
+
41
+ **字体与段落(正文默认)**
42
+
43
+ | 项目 | 要求 |
44
+ |------|------|
45
+ | 字体 | **仿宋**(`仿宋_GB2312` / `FangSong_GB2312`) |
46
+ | 字号 | **三号**(16 磅;docx-js `size: 32`) |
47
+ | 位置 | 编排于**主送单位名称**下一行起 |
48
+ | 段首 | 每个自然段**左空二字**(首行缩进 2 个三号字宽,约 640 TWIP) |
49
+ | 回行 | **顶格**(换行后不再额外缩进) |
50
+ | 数字与年份 | **不得回行**(同一数字、年份须在同一行内,避免在中间断行) |
51
+
52
+ **结构层次序数**(原则上**不超过四层**):
53
+
54
+ | 层次 | 序数形式 | 字体 |
55
+ |------|----------|------|
56
+ | 第一层 | `一、` `二、` … | **黑体**(`黑体` / `SimHei`) |
57
+ | 第二层 | `(一)` `(二)` … | **楷体**(`楷体` / `楷体_GB2312` / `KaiTi`) |
58
+ | 第三层 | `1.` `2.` … | **仿宋**(与正文同,仿宋_GB2312) |
59
+ | 第四层 | `(1)` `(2)` … | **仿宋**(与正文同,仿宋_GB2312) |
60
+
61
+ - 序数后的标点须与上表一致(如第一层用顿号 `、`,第二层用全角括号)。
62
+ - 不得使用 Word 默认多级列表符号替代上述序数形式;须按层次分别设置对应字体。
63
+
64
+ ### docx-js 示例(公文正文)
65
+
66
+ ```javascript
67
+ // 三号 = 16pt → size: 32 (half-points). 2-char indent ≈ 640 TWIP.
68
+ const bodyFont = "仿宋_GB2312";
69
+ const bodySize = 32;
70
+
71
+ const bodyParagraph = (text) => new Paragraph({
72
+ indent: { firstLine: 640 },
73
+ children: [new TextRun({ text, font: bodyFont, size: bodySize })],
74
+ });
75
+
76
+ // 结构层次示例(同一段内可用多个 TextRun 区分字体)
77
+ new Paragraph({
78
+ indent: { firstLine: 640 },
79
+ children: [
80
+ new TextRun({ text: "一、", font: "黑体", size: bodySize }),
81
+ new TextRun({ text: "总体要求", font: "黑体", size: bodySize }),
82
+ ],
83
+ });
84
+ new Paragraph({
85
+ indent: { firstLine: 640 },
86
+ children: [
87
+ new TextRun({ text: "(一)", font: "楷体", size: bodySize }),
88
+ new TextRun({ text: "加强组织领导。", font: bodyFont, size: bodySize }),
89
+ ],
90
+ });
91
+ ```
92
+
93
+ 编辑已有公文时,在 `unpacked/word/document.xml` 中为各 `<w:r>` 设置对应的 `<w:rFonts w:eastAsia="…"/>` 与 `<w:sz w:val="32"/>`,并校验段落的 `<w:ind w:firstLine="640"/>`。
94
+
95
+ ---
96
+
97
+ ## Common Operations
98
+
99
+ ### Converting legacy .doc to .docx
100
+
101
+ ```bash
102
+ python ${PANDA_SKILL_DIR}/scripts/office/soffice.py --headless --convert-to docx document.doc
103
+ ```
104
+
105
+ ### Extracting text
106
+
107
+ ```bash
108
+ # Markdown output preserving tracked-change information
109
+ pandoc --track-changes=all document.docx -o output.md
110
+
111
+ # Direct XML access for fine-grained inspection
112
+ python ${PANDA_SKILL_DIR}/scripts/office/unpack.py document.docx unpacked/
113
+ ```
114
+
115
+ ### Rendering pages as images
116
+
117
+ ```bash
118
+ python ${PANDA_SKILL_DIR}/scripts/office/soffice.py --headless --convert-to pdf document.docx
119
+ pdftoppm -jpeg -r 150 document.pdf page
120
+ ```
121
+
122
+ ### Accepting all tracked changes
123
+
124
+ Produces a pristine copy with all revisions resolved (LibreOffice required):
125
+
126
+ ```bash
127
+ python ${PANDA_SKILL_DIR}/scripts/accept_changes.py input.docx output.docx
128
+ ```
129
+
130
+ ---
131
+
132
+ ## Generating Documents from Scratch
133
+
134
+ Produce `.docx` files via JavaScript. Install: `npm install -g docx`
135
+
136
+ ### Bootstrap
137
+
138
+ ```javascript
139
+ const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, ImageRun,
140
+ Header, Footer, AlignmentType, PageOrientation, LevelFormat, ExternalHyperlink,
141
+ InternalHyperlink, Bookmark, FootnoteReferenceRun, PositionalTab,
142
+ PositionalTabAlignment, PositionalTabRelativeTo, PositionalTabLeader,
143
+ TabStopType, TabStopPosition, Column, SectionType,
144
+ TableOfContents, HeadingLevel, BorderStyle, WidthType, ShadingType,
145
+ VerticalAlign, PageNumber, PageBreak } = require('docx');
146
+
147
+ const doc = new Document({ sections: [{ children: [/* content */] }] });
148
+ Packer.toBuffer(doc).then(buf => fs.writeFileSync("doc.docx", buf));
149
+ ```
150
+
151
+ ### Validation
152
+
153
+ ```bash
154
+ python ${PANDA_SKILL_DIR}/scripts/office/validate.py doc.docx
155
+ ```
156
+
157
+ If the validator reports issues, unpack, repair the XML, and repackage.
158
+
159
+ ### Page Dimensions
160
+
161
+ ```javascript
162
+ // docx-js defaults to A4; US Letter must be set explicitly.
163
+ sections: [{
164
+ properties: {
165
+ page: {
166
+ size: { width: 12240, height: 15840 }, // 8.5 × 11 in (DXA)
167
+ margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } // 1-inch
168
+ }
169
+ },
170
+ children: [/* body content */]
171
+ }]
172
+ ```
173
+
174
+ **Paper sizes (DXA; 1440 DXA = 1 inch):**
175
+
176
+ | Format | Width | Height | Usable width (1 in margins) |
177
+ |--------|-------|--------|-----------------------------|
178
+ | US Letter | 12 240 | 15 840 | 9 360 |
179
+ | A4 (default) | 11 906 | 16 838 | 9 026 |
180
+
181
+ **Landscape:** Always supply portrait dimensions — docx-js internally transposes them:
182
+
183
+ ```javascript
184
+ size: {
185
+ width: 12240, // short edge
186
+ height: 15840, // long edge
187
+ orientation: PageOrientation.LANDSCAPE
188
+ },
189
+ // Effective content width = 15840 − left − right (long edge becomes horizontal)
190
+ ```
191
+
192
+ ### Heading Styles
193
+
194
+ Default to Arial for broad compatibility. Keep heading text black. **Exception:** for 公文 / 快文, use §公司公文/快文 instead of this section.
195
+
196
+ ```javascript
197
+ const doc = new Document({
198
+ styles: {
199
+ default: { document: { run: { font: "Arial", size: 24 } } }, // 12 pt base
200
+ paragraphStyles: [
201
+ { id: "Heading1", name: "Heading 1", basedOn: "Normal", next: "Normal", quickFormat: true,
202
+ run: { size: 32, bold: true, font: "Arial" },
203
+ paragraph: { spacing: { before: 240, after: 240 }, outlineLevel: 0 } },
204
+ { id: "Heading2", name: "Heading 2", basedOn: "Normal", next: "Normal", quickFormat: true,
205
+ run: { size: 28, bold: true, font: "Arial" },
206
+ paragraph: { spacing: { before: 180, after: 180 }, outlineLevel: 1 } },
207
+ ]
208
+ },
209
+ sections: [{
210
+ children: [
211
+ new Paragraph({ heading: HeadingLevel.HEADING_1, children: [new TextRun("Title")] }),
212
+ ]
213
+ }]
214
+ });
215
+ ```
216
+
217
+ ### Lists (NEVER use Unicode bullet characters)
218
+
219
+ ```javascript
220
+ // ❌ WRONG — literal bullet glyphs produce broken output
221
+ new Paragraph({ children: [new TextRun("• Item")] }) // BAD
222
+ new Paragraph({ children: [new TextRun("\u2022 Item")] }) // BAD
223
+
224
+ // ✅ CORRECT — use LevelFormat.BULLET via numbering configuration
225
+ const doc = new Document({
226
+ numbering: {
227
+ config: [
228
+ { reference: "bullets",
229
+ levels: [{ level: 0, format: LevelFormat.BULLET, text: "•", alignment: AlignmentType.LEFT,
230
+ style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
231
+ { reference: "numbers",
232
+ levels: [{ level: 0, format: LevelFormat.DECIMAL, text: "%1.", alignment: AlignmentType.LEFT,
233
+ style: { paragraph: { indent: { left: 720, hanging: 360 } } } }] },
234
+ ]
235
+ },
236
+ sections: [{
237
+ children: [
238
+ new Paragraph({ numbering: { reference: "bullets", level: 0 },
239
+ children: [new TextRun("Bullet item")] }),
240
+ new Paragraph({ numbering: { reference: "numbers", level: 0 },
241
+ children: [new TextRun("Numbered item")] }),
242
+ ]
243
+ }]
244
+ });
245
+
246
+ // ⚠️ Same reference → continuous (1,2,3…4,5,6); different references → restart (1,2,3…1,2,3)
247
+ ```
248
+
249
+ ### Tables
250
+
251
+ **Both `columnWidths` on Table AND `width` on every TableCell are required.**
252
+
253
+ ```javascript
254
+ const borderDef = { style: BorderStyle.SINGLE, size: 1, color: "CCCCCC" };
255
+ const allBorders = { top: borderDef, bottom: borderDef, left: borderDef, right: borderDef };
256
+
257
+ new Table({
258
+ width: { size: 9360, type: WidthType.DXA }, // always DXA, never PERCENTAGE
259
+ columnWidths: [4680, 4680], // must sum to table width
260
+ rows: [
261
+ new TableRow({
262
+ children: [
263
+ new TableCell({
264
+ borders: allBorders,
265
+ width: { size: 4680, type: WidthType.DXA }, // must match columnWidths entry
266
+ shading: { fill: "D5E8F0", type: ShadingType.CLEAR }, // CLEAR, never SOLID
267
+ margins: { top: 80, bottom: 80, left: 120, right: 120 },
268
+ children: [new Paragraph({ children: [new TextRun("Cell")] })]
269
+ })
270
+ ]
271
+ })
272
+ ]
273
+ })
274
+ ```
275
+
276
+ **Width computation:**
277
+
278
+ ```javascript
279
+ // table width = Σ columnWidths = page width − both margins
280
+ // US Letter + 1 in margins: 12240 − 2880 = 9360 DXA
281
+ width: { size: 9360, type: WidthType.DXA },
282
+ columnWidths: [7000, 2360] // must sum to 9360
283
+ ```
284
+
285
+ **Table rules:**
286
+ - Always `WidthType.DXA` — `PERCENTAGE` breaks in Google Docs
287
+ - Cell `width` must equal its corresponding `columnWidths` entry
288
+ - Cell `margins` are inward padding (shrink content area, don't add to cell width)
289
+ - Full-width: set width to page width minus both lateral margins
290
+
291
+ ### Images
292
+
293
+ ```javascript
294
+ new Paragraph({
295
+ children: [new ImageRun({
296
+ type: "png", // required; accepted: png, jpg, jpeg, gif, bmp, svg
297
+ data: fs.readFileSync("image.png"),
298
+ transformation: { width: 200, height: 150 },
299
+ altText: { title: "Title", description: "Desc", name: "Name" } // all three required
300
+ })]
301
+ })
302
+ ```
303
+
304
+ ### Page Breaks
305
+
306
+ ```javascript
307
+ // PageBreak MUST live inside a Paragraph
308
+ new Paragraph({ children: [new PageBreak()] })
309
+
310
+ // Alternative: pageBreakBefore
311
+ new Paragraph({ pageBreakBefore: true, children: [new TextRun("New page")] })
312
+ ```
313
+
314
+ ### Hyperlinks
315
+
316
+ ```javascript
317
+ // External URL
318
+ new Paragraph({
319
+ children: [new ExternalHyperlink({
320
+ children: [new TextRun({ text: "Click here", style: "Hyperlink" })],
321
+ link: "https://example.com",
322
+ })]
323
+ })
324
+
325
+ // In-document cross-reference
326
+ // 1. Place bookmark at destination
327
+ new Paragraph({ heading: HeadingLevel.HEADING_1, children: [
328
+ new Bookmark({ id: "chapter1", children: [new TextRun("Chapter 1")] }),
329
+ ]})
330
+ // 2. Link to it
331
+ new Paragraph({ children: [new InternalHyperlink({
332
+ children: [new TextRun({ text: "See Chapter 1", style: "Hyperlink" })],
333
+ anchor: "chapter1",
334
+ })]})
335
+ ```
336
+
337
+ ### Footnotes
338
+
339
+ ```javascript
340
+ const doc = new Document({
341
+ footnotes: {
342
+ 1: { children: [new Paragraph("Source: Annual Report 2024")] },
343
+ 2: { children: [new Paragraph("See appendix for methodology")] },
344
+ },
345
+ sections: [{
346
+ children: [new Paragraph({
347
+ children: [
348
+ new TextRun("Revenue grew 15%"),
349
+ new FootnoteReferenceRun(1),
350
+ new TextRun(" using adjusted metrics"),
351
+ new FootnoteReferenceRun(2),
352
+ ],
353
+ })]
354
+ }]
355
+ });
356
+ ```
357
+
358
+ ### Tab Stops
359
+
360
+ ```javascript
361
+ // Right-aligned text on the same line
362
+ new Paragraph({
363
+ children: [new TextRun("Company Name"), new TextRun("\tJanuary 2025")],
364
+ tabStops: [{ type: TabStopType.RIGHT, position: TabStopPosition.MAX }],
365
+ })
366
+
367
+ // Dot-leader (TOC-style)
368
+ new Paragraph({
369
+ children: [
370
+ new TextRun("Introduction"),
371
+ new TextRun({ children: [
372
+ new PositionalTab({
373
+ alignment: PositionalTabAlignment.RIGHT,
374
+ relativeTo: PositionalTabRelativeTo.MARGIN,
375
+ leader: PositionalTabLeader.DOT,
376
+ }),
377
+ "3",
378
+ ]}),
379
+ ],
380
+ })
381
+ ```
382
+
383
+ ### Multi-column Layouts
384
+
385
+ ```javascript
386
+ // Evenly spaced columns
387
+ sections: [{
388
+ properties: {
389
+ column: { count: 2, space: 720, equalWidth: true, separate: true },
390
+ },
391
+ children: [/* text flows across columns automatically */]
392
+ }]
393
+
394
+ // Custom widths
395
+ sections: [{
396
+ properties: {
397
+ column: {
398
+ equalWidth: false,
399
+ children: [new Column({ width: 5400, space: 720 }), new Column({ width: 3240 })],
400
+ },
401
+ },
402
+ children: [/* content */]
403
+ }]
404
+ ```
405
+
406
+ Explicit column break: add a new section with `type: SectionType.NEXT_COLUMN`.
407
+
408
+ ### Table of Contents
409
+
410
+ ```javascript
411
+ // Headings MUST use HeadingLevel — custom paragraph styles are invisible to the TOC.
412
+ new TableOfContents("Table of Contents", { hyperlink: true, headingStyleRange: "1-3" })
413
+ ```
414
+
415
+ ### Headers and Footers
416
+
417
+ ```javascript
418
+ sections: [{
419
+ properties: {
420
+ page: { margin: { top: 1440, right: 1440, bottom: 1440, left: 1440 } }
421
+ },
422
+ headers: {
423
+ default: new Header({ children: [new Paragraph({ children: [new TextRun("Header")] })] })
424
+ },
425
+ footers: {
426
+ default: new Footer({ children: [new Paragraph({
427
+ children: [new TextRun("Page "), new TextRun({ children: [PageNumber.CURRENT] })]
428
+ })] })
429
+ },
430
+ children: [/* body */]
431
+ }]
432
+ ```
433
+
434
+ ### Essential docx-js Rules
435
+
436
+ - **Page size:** defaults to A4; US Letter = 12 240 × 15 840 DXA
437
+ - **Landscape:** supply portrait dimensions + `PageOrientation.LANDSCAPE`
438
+ - **No `\n`:** create separate Paragraph objects
439
+ - **No Unicode bullets:** use `LevelFormat.BULLET` via numbering API
440
+ - **PageBreak inside Paragraph only**
441
+ - **ImageRun requires `type`**
442
+ - **Table `width` must use DXA** — `PERCENTAGE` breaks in Google Docs
443
+ - **Dual-width rule:** set `columnWidths` on table AND `width` on every cell
444
+ - **Table width = Σ columnWidths**
445
+ - **Cell margins:** `{ top: 80, bottom: 80, left: 120, right: 120 }` for readable padding
446
+ - **Use `ShadingType.CLEAR`** — never SOLID for cell fills
447
+ - **Avoid tables as dividers:** use border on Paragraph instead; for side-by-side footer content use tab stops
448
+ - **TOC only with HeadingLevel**
449
+ - **Override styles by ID:** "Heading1", "Heading2", etc.
450
+ - **Provide `outlineLevel`** for TOC (0 = H1, 1 = H2 …)
451
+
452
+ ---
453
+
454
+ ## Patching Existing Documents
455
+
456
+ Execute all three stages in order.
457
+
458
+ ### Stage 1 — Unpack
459
+
460
+ ```bash
461
+ python ${PANDA_SKILL_DIR}/scripts/office/unpack.py document.docx unpacked/
462
+ ```
463
+
464
+ Inflates the archive, pretty-prints XML, coalesces adjacent runs, and encodes typographic quotes as XML entities (`&#x201C;` etc.). Pass `--merge-runs false` to skip run coalescing.
465
+
466
+ ### Stage 2 — Edit the XML
467
+
468
+ Work inside `unpacked/word/`. Refer to §XML Patterns below.
469
+
470
+ **Use "Claude" as the author** for tracked changes and comments, unless the user specifies otherwise.
471
+
472
+ **Use the Edit tool for string replacements — do not write Python scripts.** The Edit tool makes every replacement visible and auditable.
473
+
474
+ **Use typographic (smart) quotes for new text:**
475
+
476
+ ```xml
477
+ <w:t>Here&#x2019;s a quote: &#x201C;Hello&#x201D;</w:t>
478
+ ```
479
+
480
+ | Entity | Character |
481
+ |--------|-----------|
482
+ | `&#x2018;` | ' (left single) |
483
+ | `&#x2019;` | ' (right single / apostrophe) |
484
+ | `&#x201C;` | " (left double) |
485
+ | `&#x201D;` | " (right double) |
486
+
487
+ **Inserting comments** — `comment.py` handles the multi-file boilerplate (text must be XML-escaped):
488
+
489
+ ```bash
490
+ python ${PANDA_SKILL_DIR}/scripts/comment.py unpacked/ 0 "Comment text with &amp; and &#x2019;"
491
+ python ${PANDA_SKILL_DIR}/scripts/comment.py unpacked/ 1 "Reply text" --parent 0
492
+ python ${PANDA_SKILL_DIR}/scripts/comment.py unpacked/ 0 "Text" --author "Custom Author"
493
+ ```
494
+
495
+ Then wire markers into document.xml (see §Comments below).
496
+
497
+ ### Stage 3 — Repack
498
+
499
+ ```bash
500
+ python ${PANDA_SKILL_DIR}/scripts/office/pack.py unpacked/ output.docx --original document.docx
501
+ ```
502
+
503
+ Validates with automatic repair, condenses XML, produces the final DOCX. Pass `--validate false` to bypass.
504
+
505
+ **Auto-repair corrects:**
506
+ - `durableId` values ≥ 0x7FFFFFFF (replaced with fresh IDs)
507
+ - Missing `xml:space="preserve"` on `<w:t>` with leading/trailing whitespace
508
+
509
+ **Does NOT fix:** malformed XML, illegal nesting, broken relationships, schema violations.
510
+
511
+ ### Gotchas
512
+
513
+ - **Swap whole `<w:r>` blocks:** when introducing tracked changes, replace the entire run — never splice change-tracking tags inside an existing run.
514
+ - **Carry forward `<w:rPr>`:** copy original formatting properties into new tracked-change runs.
515
+
516
+ ---
517
+
518
+ ## XML Patterns
519
+
520
+ ### Schema Ordering
521
+
522
+ - **`<w:pPr>` child order:** `<w:pStyle>` → `<w:numPr>` → `<w:spacing>` → `<w:ind>` → `<w:jc>` → `<w:rPr>` last
523
+ - **Whitespace:** attach `xml:space="preserve"` to any `<w:t>` with leading/trailing spaces
524
+ - **RSIDs:** 8-character hexadecimal (e.g. `00AB1234`)
525
+
526
+ ### Tracked Changes
527
+
528
+ **Insertion:**
529
+
530
+ ```xml
531
+ <w:ins w:id="1" w:author="Claude" w:date="2025-01-01T00:00:00Z">
532
+ <w:r><w:t>inserted text</w:t></w:r>
533
+ </w:ins>
534
+ ```
535
+
536
+ **Deletion:**
537
+
538
+ ```xml
539
+ <w:del w:id="2" w:author="Claude" w:date="2025-01-01T00:00:00Z">
540
+ <w:r><w:delText>deleted text</w:delText></w:r>
541
+ </w:del>
542
+ ```
543
+
544
+ Inside `<w:del>`: use `<w:delText>` instead of `<w:t>`, `<w:delInstrText>` instead of `<w:instrText>`.
545
+
546
+ **Minimal-footprint edit (change "30 days" to "60 days"):**
547
+
548
+ ```xml
549
+ <w:r><w:t>The term is </w:t></w:r>
550
+ <w:del w:id="1" w:author="Claude" w:date="...">
551
+ <w:r><w:delText>30</w:delText></w:r>
552
+ </w:del>
553
+ <w:ins w:id="2" w:author="Claude" w:date="...">
554
+ <w:r><w:t>60</w:t></w:r>
555
+ </w:ins>
556
+ <w:r><w:t> days.</w:t></w:r>
557
+ ```
558
+
559
+ **Deleting a complete paragraph** — flag the paragraph mark so the empty shell merges with the next paragraph:
560
+
561
+ ```xml
562
+ <w:p>
563
+ <w:pPr>
564
+ <w:numPr>...</w:numPr>
565
+ <w:rPr>
566
+ <w:del w:id="1" w:author="Claude" w:date="2025-01-01T00:00:00Z"/>
567
+ </w:rPr>
568
+ </w:pPr>
569
+ <w:del w:id="2" w:author="Claude" w:date="2025-01-01T00:00:00Z">
570
+ <w:r><w:delText>Entire paragraph content being deleted...</w:delText></w:r>
571
+ </w:del>
572
+ </w:p>
573
+ ```
574
+
575
+ Without the `<w:del/>` in `<w:pPr><w:rPr>`, accepting leaves a blank paragraph.
576
+
577
+ **Rejecting another author's insertion:**
578
+
579
+ ```xml
580
+ <w:ins w:author="Jane" w:id="5">
581
+ <w:del w:author="Claude" w:id="10">
582
+ <w:r><w:delText>their inserted text</w:delText></w:r>
583
+ </w:del>
584
+ </w:ins>
585
+ ```
586
+
587
+ **Restoring another author's deletion:**
588
+
589
+ ```xml
590
+ <w:del w:author="Jane" w:id="5">
591
+ <w:r><w:delText>deleted text</w:delText></w:r>
592
+ </w:del>
593
+ <w:ins w:author="Claude" w:id="10">
594
+ <w:r><w:t>deleted text</w:t></w:r>
595
+ </w:ins>
596
+ ```
597
+
598
+ ### Comments
599
+
600
+ After calling `comment.py`, add range markers in document.xml. For replies, use `--parent` and nest child markers inside the parent's range.
601
+
602
+ **Rule: `<w:commentRangeStart>` and `<w:commentRangeEnd>` are siblings of `<w:r>` — never inside a run.**
603
+
604
+ ```xml
605
+ <!-- Standalone comment -->
606
+ <w:commentRangeStart w:id="0"/>
607
+ <w:del w:id="1" w:author="Claude" w:date="2025-01-01T00:00:00Z">
608
+ <w:r><w:delText>deleted</w:delText></w:r>
609
+ </w:del>
610
+ <w:r><w:t> more text</w:t></w:r>
611
+ <w:commentRangeEnd w:id="0"/>
612
+ <w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="0"/></w:r>
613
+
614
+ <!-- Comment 0 with nested reply 1 -->
615
+ <w:commentRangeStart w:id="0"/>
616
+ <w:commentRangeStart w:id="1"/>
617
+ <w:r><w:t>text</w:t></w:r>
618
+ <w:commentRangeEnd w:id="1"/>
619
+ <w:commentRangeEnd w:id="0"/>
620
+ <w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="0"/></w:r>
621
+ <w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="1"/></w:r>
622
+ ```
623
+
624
+ ### Images
625
+
626
+ 1. Drop file into `word/media/`
627
+ 2. Register relationship in `word/_rels/document.xml.rels`:
628
+
629
+ ```xml
630
+ <Relationship Id="rId5" Type=".../image" Target="media/image1.png"/>
631
+ ```
632
+
633
+ 3. Declare content type in `[Content_Types].xml`:
634
+
635
+ ```xml
636
+ <Default Extension="png" ContentType="image/png"/>
637
+ ```
638
+
639
+ 4. Reference from document.xml:
640
+
641
+ ```xml
642
+ <w:drawing>
643
+ <wp:inline>
644
+ <wp:extent cx="914400" cy="914400"/> <!-- EMUs: 914 400 = 1 inch -->
645
+ <a:graphic>
646
+ <a:graphicData uri=".../picture">
647
+ <pic:pic>
648
+ <pic:blipFill><a:blip r:embed="rId5"/></pic:blipFill>
649
+ </pic:pic>
650
+ </a:graphicData>
651
+ </a:graphic>
652
+ </wp:inline>
653
+ </w:drawing>
654
+ ```
655
+
656
+ ---
657
+
658
+ ## External Dependencies
659
+
660
+ - **pandoc** — text extraction and format conversion
661
+ - **docx** — `npm install -g docx` (new-document generation)
662
+ - **LibreOffice** — PDF conversion (auto-configured via `${PANDA_SKILL_DIR}/scripts/office/soffice.py`)
663
+ - **Poppler** — `pdftoppm` for rasterising PDF pages
@@ -0,0 +1 @@
1
+ # Package marker — no public API exposed at this level.