@panda-agent/panda-cli 0.1.29 → 0.1.31

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 (168) hide show
  1. package/bin/pandacli.mjs +6 -1
  2. package/bundled-preset-skills/.gitkeep +0 -0
  3. package/bundled-preset-skills/README.md +17 -0
  4. package/bundled-preset-skills/docx/.skill-metadata.yaml +173 -0
  5. package/bundled-preset-skills/docx/LICENSE.txt +30 -0
  6. package/bundled-preset-skills/docx/SKILL.md +589 -0
  7. package/bundled-preset-skills/docx/scripts/__init__.py +1 -0
  8. package/bundled-preset-skills/docx/scripts/accept_changes.py +206 -0
  9. package/bundled-preset-skills/docx/scripts/comment.py +442 -0
  10. package/bundled-preset-skills/docx/scripts/office/helpers/__init__.py +1 -0
  11. package/bundled-preset-skills/docx/scripts/office/helpers/merge_runs.py +190 -0
  12. package/bundled-preset-skills/docx/scripts/office/helpers/simplify_redlines.py +185 -0
  13. package/bundled-preset-skills/docx/scripts/office/pack.py +167 -0
  14. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  15. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  16. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  17. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  18. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  19. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  20. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  21. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  22. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  23. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  24. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  25. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  26. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  27. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  28. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  29. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  30. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  31. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  32. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  33. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  34. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  35. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  36. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  37. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  38. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  39. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  40. package/bundled-preset-skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  41. package/bundled-preset-skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  42. package/bundled-preset-skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  43. package/bundled-preset-skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  44. package/bundled-preset-skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  45. package/bundled-preset-skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
  46. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  47. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  48. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  49. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  50. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  51. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  52. package/bundled-preset-skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  53. package/bundled-preset-skills/docx/scripts/office/soffice.py +194 -0
  54. package/bundled-preset-skills/docx/scripts/office/unpack.py +145 -0
  55. package/bundled-preset-skills/docx/scripts/office/validate.py +114 -0
  56. package/bundled-preset-skills/docx/scripts/office/validators/__init__.py +16 -0
  57. package/bundled-preset-skills/docx/scripts/office/validators/base.py +733 -0
  58. package/bundled-preset-skills/docx/scripts/office/validators/docx.py +354 -0
  59. package/bundled-preset-skills/docx/scripts/office/validators/pptx.py +230 -0
  60. package/bundled-preset-skills/docx/scripts/office/validators/redlining.py +212 -0
  61. package/bundled-preset-skills/docx/scripts/templates/comments.xml +3 -0
  62. package/bundled-preset-skills/docx/scripts/templates/commentsExtended.xml +3 -0
  63. package/bundled-preset-skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  64. package/bundled-preset-skills/docx/scripts/templates/commentsIds.xml +3 -0
  65. package/bundled-preset-skills/docx/scripts/templates/people.xml +3 -0
  66. package/bundled-preset-skills/frontend-design/LICENSE.txt +177 -0
  67. package/bundled-preset-skills/frontend-design/SKILL.md +42 -0
  68. package/bundled-preset-skills/pdf/.skill-metadata.yaml +273 -0
  69. package/bundled-preset-skills/pdf/LICENSE.txt +30 -0
  70. package/bundled-preset-skills/pdf/SKILL.md +324 -0
  71. package/bundled-preset-skills/pdf/advanced-reference.md +609 -0
  72. package/bundled-preset-skills/pdf/form-filling-guide.md +318 -0
  73. package/bundled-preset-skills/pdf/forms.md +294 -0
  74. package/bundled-preset-skills/pdf/reference.md +612 -0
  75. package/bundled-preset-skills/pdf/scripts/check_bounding_boxes.py +198 -0
  76. package/bundled-preset-skills/pdf/scripts/check_fillable_fields.py +64 -0
  77. package/bundled-preset-skills/pdf/scripts/convert_pdf_to_images.py +102 -0
  78. package/bundled-preset-skills/pdf/scripts/create_validation_image.py +125 -0
  79. package/bundled-preset-skills/pdf/scripts/extract_form_field_info.py +220 -0
  80. package/bundled-preset-skills/pdf/scripts/extract_form_structure.py +202 -0
  81. package/bundled-preset-skills/pdf/scripts/fill_fillable_fields.py +205 -0
  82. package/bundled-preset-skills/pdf/scripts/fill_pdf_form_with_annotations.py +193 -0
  83. package/bundled-preset-skills/pptx-generator/SKILL.md +204 -0
  84. package/bundled-preset-skills/pptx-generator/assets/styles/business.json +8 -0
  85. package/bundled-preset-skills/pptx-generator/assets/styles/minimal.json +8 -0
  86. package/bundled-preset-skills/pptx-generator/assets/styles/modern.json +8 -0
  87. package/bundled-preset-skills/pptx-generator/assets/templates/ppt_data_template.json +40 -0
  88. package/bundled-preset-skills/pptx-generator/references/collaboration_guide.md +381 -0
  89. package/bundled-preset-skills/pptx-generator/references/json_format_spec.md +215 -0
  90. package/bundled-preset-skills/pptx-generator/references/layout_guide.md +290 -0
  91. package/bundled-preset-skills/pptx-generator/scripts/json_validator.py +194 -0
  92. package/bundled-preset-skills/pptx-generator/scripts/pptx_builder.py +340 -0
  93. package/bundled-preset-skills/pptx-generator/scripts/pptx_validator.py +162 -0
  94. package/bundled-preset-skills/skill-creator/LICENSE.txt +202 -0
  95. package/bundled-preset-skills/skill-creator/SKILL.md +479 -0
  96. package/bundled-preset-skills/skill-creator/agents/analyzer.md +274 -0
  97. package/bundled-preset-skills/skill-creator/agents/comparator.md +202 -0
  98. package/bundled-preset-skills/skill-creator/agents/grader.md +223 -0
  99. package/bundled-preset-skills/skill-creator/assets/eval_review.html +146 -0
  100. package/bundled-preset-skills/skill-creator/eval-viewer/generate_review.py +471 -0
  101. package/bundled-preset-skills/skill-creator/eval-viewer/viewer.html +1325 -0
  102. package/bundled-preset-skills/skill-creator/references/schemas.md +430 -0
  103. package/bundled-preset-skills/skill-creator/scripts/__init__.py +0 -0
  104. package/bundled-preset-skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  105. package/bundled-preset-skills/skill-creator/scripts/generate_report.py +326 -0
  106. package/bundled-preset-skills/skill-creator/scripts/improve_description.py +248 -0
  107. package/bundled-preset-skills/skill-creator/scripts/package_skill.py +136 -0
  108. package/bundled-preset-skills/skill-creator/scripts/quick_validate.py +103 -0
  109. package/bundled-preset-skills/skill-creator/scripts/run_eval.py +310 -0
  110. package/bundled-preset-skills/skill-creator/scripts/run_loop.py +332 -0
  111. package/bundled-preset-skills/skill-creator/scripts/utils.py +47 -0
  112. package/bundled-preset-skills/xlsx/.skill-metadata.yaml +185 -0
  113. package/bundled-preset-skills/xlsx/LICENSE.txt +30 -0
  114. package/bundled-preset-skills/xlsx/SKILL.md +233 -0
  115. package/bundled-preset-skills/xlsx/scripts/office/helpers/__init__.py +1 -0
  116. package/bundled-preset-skills/xlsx/scripts/office/helpers/merge_runs.py +226 -0
  117. package/bundled-preset-skills/xlsx/scripts/office/helpers/simplify_redlines.py +198 -0
  118. package/bundled-preset-skills/xlsx/scripts/office/pack.py +162 -0
  119. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  120. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  121. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  122. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  123. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  124. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  125. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  126. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  127. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  128. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  129. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  130. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  131. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  132. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  133. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  134. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  135. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  136. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  137. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  138. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  139. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  140. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  141. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  142. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  143. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  144. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  145. package/bundled-preset-skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  146. package/bundled-preset-skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  147. package/bundled-preset-skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  148. package/bundled-preset-skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  149. package/bundled-preset-skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  150. package/bundled-preset-skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
  151. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  152. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  153. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  154. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  155. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  156. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  157. package/bundled-preset-skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  158. package/bundled-preset-skills/xlsx/scripts/office/soffice.py +185 -0
  159. package/bundled-preset-skills/xlsx/scripts/office/unpack.py +146 -0
  160. package/bundled-preset-skills/xlsx/scripts/office/validate.py +108 -0
  161. package/bundled-preset-skills/xlsx/scripts/office/validators/__init__.py +13 -0
  162. package/bundled-preset-skills/xlsx/scripts/office/validators/base.py +800 -0
  163. package/bundled-preset-skills/xlsx/scripts/office/validators/docx.py +383 -0
  164. package/bundled-preset-skills/xlsx/scripts/office/validators/pptx.py +250 -0
  165. package/bundled-preset-skills/xlsx/scripts/office/validators/redlining.py +229 -0
  166. package/bundled-preset-skills/xlsx/scripts/recalc.py +296 -0
  167. package/dist/panda-cli-ink.bundle.mjs +276 -342
  168. package/package.json +6 -4
@@ -0,0 +1,162 @@
1
+ #!/usr/bin/env python3
2
+ # ──────────────────────────────────────────────────────────────────
3
+ # Assembles an unpacked directory back into a DOCX / PPTX / XLSX archive.
4
+ #
5
+ # Optionally validates (with auto-repair) before packing and minifies
6
+ # all XML / .rels content by stripping cosmetic whitespace.
7
+ #
8
+ # python pack.py <src_dir> <dest_file> [--original <ref>] [--validate true|false]
9
+ # ──────────────────────────────────────────────────────────────────
10
+
11
+ import argparse
12
+ import shutil
13
+ import sys
14
+ import tempfile
15
+ import zipfile
16
+ from pathlib import Path
17
+
18
+ import defusedxml.minidom
19
+
20
+ from validators import DOCXSchemaValidator, PPTXSchemaValidator, RedliningValidator
21
+
22
+ _ALLOWED_EXTENSIONS = {".docx", ".pptx", ".xlsx"}
23
+ _XML_GLOB_PATTERNS = ("*.xml", "*.rels")
24
+
25
+
26
+ def pack(
27
+ src_dir: str,
28
+ dest_file: str,
29
+ ref_file: str | None = None,
30
+ run_validation: bool = True,
31
+ author_resolver=None,
32
+ ) -> tuple[None, str]:
33
+ """Create an Office ZIP archive from *src_dir* → *dest_file*."""
34
+ src = Path(src_dir)
35
+ dest = Path(dest_file)
36
+ ext = dest.suffix.lower()
37
+
38
+ if not src.is_dir():
39
+ return None, "Error: {} is not a directory".format(src)
40
+
41
+ if ext not in _ALLOWED_EXTENSIONS:
42
+ return None, "Error: {} must be a .docx, .pptx, or .xlsx file".format(dest_file)
43
+
44
+ # ── optional validation pass ──
45
+ if run_validation and ref_file:
46
+ ref = Path(ref_file)
47
+ if ref.exists():
48
+ ok, report = _do_validation(src, ref, ext, author_resolver)
49
+ if report:
50
+ print(report)
51
+ if not ok:
52
+ return None, "Error: Validation failed for {}".format(src)
53
+
54
+ # ── minify XML then zip ──
55
+ with tempfile.TemporaryDirectory() as staging:
56
+ staging_root = Path(staging) / "content"
57
+ shutil.copytree(src, staging_root)
58
+
59
+ for pat in _XML_GLOB_PATTERNS:
60
+ for xf in staging_root.rglob(pat):
61
+ _strip_xml_whitespace(xf)
62
+
63
+ dest.parent.mkdir(parents=True, exist_ok=True)
64
+ with zipfile.ZipFile(dest, "w", zipfile.ZIP_DEFLATED) as zf:
65
+ for entry in staging_root.rglob("*"):
66
+ if entry.is_file():
67
+ zf.write(entry, entry.relative_to(staging_root))
68
+
69
+ return None, "Successfully packed {} to {}".format(src, dest_file)
70
+
71
+
72
+ # ──────────────────────────────────────────────────────────────────
73
+
74
+ def _do_validation(folder, original, ext, author_resolver):
75
+ """Run format-specific validators and return (success, message|None)."""
76
+ lines = []
77
+ checkers = []
78
+
79
+ if ext == ".docx":
80
+ writer = "Claude"
81
+ if author_resolver is not None:
82
+ try:
83
+ writer = author_resolver(folder, original)
84
+ except ValueError as exc:
85
+ print("Warning: {} Using default author 'Claude'.".format(exc), file=sys.stderr)
86
+
87
+ checkers = [
88
+ DOCXSchemaValidator(folder, original),
89
+ RedliningValidator(folder, original, author=writer),
90
+ ]
91
+ elif ext == ".pptx":
92
+ checkers = [PPTXSchemaValidator(folder, original)]
93
+
94
+ if not checkers:
95
+ return True, None
96
+
97
+ n_repairs = sum(v.repair() for v in checkers)
98
+ if n_repairs:
99
+ lines.append("Auto-repaired {} issue(s)".format(n_repairs))
100
+
101
+ passed = all(v.validate() for v in checkers)
102
+ if passed:
103
+ lines.append("All validations PASSED!")
104
+
105
+ return passed, "\n".join(lines) if lines else None
106
+
107
+
108
+ def _strip_xml_whitespace(xml_path: Path) -> None:
109
+ """Parse then re-serialise an XML file, dropping cosmetic text nodes."""
110
+ try:
111
+ with open(xml_path, encoding="utf-8") as fh:
112
+ tree = defusedxml.minidom.parse(fh)
113
+
114
+ for node in tree.getElementsByTagName("*"):
115
+ # Preserve literal text inside <w:t>, <a:t>, etc.
116
+ if node.tagName.endswith(":t"):
117
+ continue
118
+ for kid in list(node.childNodes):
119
+ is_blank_text = (
120
+ kid.nodeType == kid.TEXT_NODE
121
+ and kid.nodeValue is not None
122
+ and kid.nodeValue.strip() == ""
123
+ )
124
+ if is_blank_text or kid.nodeType == kid.COMMENT_NODE:
125
+ node.removeChild(kid)
126
+
127
+ xml_path.write_bytes(tree.toxml(encoding="UTF-8"))
128
+ except Exception as err:
129
+ print("ERROR: Failed to parse {}: {}".format(xml_path.name, err), file=sys.stderr)
130
+ raise
131
+
132
+
133
+ # ──────────────────────────────────────────────────────────────────
134
+ # CLI entry-point
135
+ # ──────────────────────────────────────────────────────────────────
136
+
137
+ if __name__ == "__main__":
138
+ ap = argparse.ArgumentParser(
139
+ description="Pack a directory into a DOCX, PPTX, or XLSX file"
140
+ )
141
+ ap.add_argument("input_directory", help="Unpacked Office document directory")
142
+ ap.add_argument("output_file", help="Output Office file (.docx/.pptx/.xlsx)")
143
+ ap.add_argument("--original", help="Original file for validation comparison")
144
+ ap.add_argument(
145
+ "--validate",
146
+ type=lambda v: v.lower() == "true",
147
+ default=True,
148
+ metavar="true|false",
149
+ help="Run validation with auto-repair (default: true)",
150
+ )
151
+ ns = ap.parse_args()
152
+
153
+ _, msg = pack(
154
+ ns.input_directory,
155
+ ns.output_file,
156
+ ref_file=ns.original,
157
+ run_validation=ns.validate,
158
+ )
159
+ print(msg)
160
+
161
+ if "Error" in msg:
162
+ sys.exit(1)