@preapexis/piexis 0.1.2

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 (348) hide show
  1. package/.github/workflows/npm-publish.yml +63 -0
  2. package/AGENTS.md +58 -0
  3. package/PERMISSION_MODES_PLAN.md +279 -0
  4. package/README.md +207 -0
  5. package/WHAT_YOU_GET.md +153 -0
  6. package/eval/README.md +72 -0
  7. package/eval/permission-cases.json +28 -0
  8. package/eval/permissions.mjs +103 -0
  9. package/extensions/ask-question.ts +111 -0
  10. package/extensions/background-tasks.ts +433 -0
  11. package/extensions/background-worker.ts +50 -0
  12. package/extensions/glob.ts +32 -0
  13. package/extensions/mode.ts +397 -0
  14. package/extensions/ui.ts +134 -0
  15. package/lib/bash-approvals.ts +113 -0
  16. package/lib/bash-policy.ts +164 -0
  17. package/lib/mode-policy.ts +174 -0
  18. package/lib/path-policy.ts +182 -0
  19. package/lib/permission-classifier.ts +128 -0
  20. package/lib/permission-config.ts +91 -0
  21. package/lib/permission-denials.ts +32 -0
  22. package/lib/permission-intent.ts +128 -0
  23. package/lib/permission-taxonomy.ts +15 -0
  24. package/lib/task-broker.ts +65 -0
  25. package/lib/task-checkout.ts +39 -0
  26. package/lib/task-git.ts +44 -0
  27. package/lib/task-patch.ts +106 -0
  28. package/lib/task-permissions.ts +51 -0
  29. package/lib/task-report.ts +62 -0
  30. package/lib/task-worktree-policy.ts +56 -0
  31. package/package.json +51 -0
  32. package/prompts/commit.md +7 -0
  33. package/prompts/init.md +66 -0
  34. package/prompts/summary.md +14 -0
  35. package/skills/claude-api/LICENSE.txt +202 -0
  36. package/skills/claude-api/SKILL.md +572 -0
  37. package/skills/claude-api/csharp/claude-api/README.md +362 -0
  38. package/skills/claude-api/csharp/claude-api/batches.md +14 -0
  39. package/skills/claude-api/csharp/claude-api/files-api.md +25 -0
  40. package/skills/claude-api/csharp/claude-api/streaming.md +28 -0
  41. package/skills/claude-api/csharp/claude-api/tool-use.md +164 -0
  42. package/skills/claude-api/curl/examples.md +256 -0
  43. package/skills/claude-api/curl/managed-agents.md +371 -0
  44. package/skills/claude-api/go/claude-api/README.md +188 -0
  45. package/skills/claude-api/go/claude-api/files-api.md +23 -0
  46. package/skills/claude-api/go/claude-api/streaming.md +43 -0
  47. package/skills/claude-api/go/claude-api/tool-use.md +220 -0
  48. package/skills/claude-api/go/managed-agents/README.md +564 -0
  49. package/skills/claude-api/java/claude-api/README.md +238 -0
  50. package/skills/claude-api/java/claude-api/files-api.md +27 -0
  51. package/skills/claude-api/java/claude-api/streaming.md +24 -0
  52. package/skills/claude-api/java/claude-api/tool-use.md +228 -0
  53. package/skills/claude-api/java/managed-agents/README.md +443 -0
  54. package/skills/claude-api/php/claude-api/README.md +174 -0
  55. package/skills/claude-api/php/claude-api/batches.md +15 -0
  56. package/skills/claude-api/php/claude-api/files-api.md +13 -0
  57. package/skills/claude-api/php/claude-api/streaming.md +27 -0
  58. package/skills/claude-api/php/claude-api/tool-use.md +253 -0
  59. package/skills/claude-api/php/managed-agents/README.md +443 -0
  60. package/skills/claude-api/python/claude-api/README.md +565 -0
  61. package/skills/claude-api/python/claude-api/batches.md +198 -0
  62. package/skills/claude-api/python/claude-api/files-api.md +170 -0
  63. package/skills/claude-api/python/claude-api/sdk-upgrade.md +286 -0
  64. package/skills/claude-api/python/claude-api/streaming.md +179 -0
  65. package/skills/claude-api/python/claude-api/tool-use.md +627 -0
  66. package/skills/claude-api/python/managed-agents/README.md +335 -0
  67. package/skills/claude-api/ruby/claude-api/README.md +134 -0
  68. package/skills/claude-api/ruby/claude-api/streaming.md +16 -0
  69. package/skills/claude-api/ruby/claude-api/tool-use.md +41 -0
  70. package/skills/claude-api/ruby/managed-agents/README.md +394 -0
  71. package/skills/claude-api/shared/admin-api.md +179 -0
  72. package/skills/claude-api/shared/agent-design.md +101 -0
  73. package/skills/claude-api/shared/anthropic-cli.md +269 -0
  74. package/skills/claude-api/shared/claude-platform-on-aws.md +59 -0
  75. package/skills/claude-api/shared/cost-optimization.md +233 -0
  76. package/skills/claude-api/shared/error-codes.md +262 -0
  77. package/skills/claude-api/shared/live-sources.md +166 -0
  78. package/skills/claude-api/shared/managed-agents-api-reference.md +455 -0
  79. package/skills/claude-api/shared/managed-agents-client-patterns.md +220 -0
  80. package/skills/claude-api/shared/managed-agents-core.md +359 -0
  81. package/skills/claude-api/shared/managed-agents-environments.md +226 -0
  82. package/skills/claude-api/shared/managed-agents-events.md +290 -0
  83. package/skills/claude-api/shared/managed-agents-memory.md +201 -0
  84. package/skills/claude-api/shared/managed-agents-multiagent.md +260 -0
  85. package/skills/claude-api/shared/managed-agents-onboarding.md +82 -0
  86. package/skills/claude-api/shared/managed-agents-outcomes.md +108 -0
  87. package/skills/claude-api/shared/managed-agents-overview.md +77 -0
  88. package/skills/claude-api/shared/managed-agents-scheduled-deployments.md +156 -0
  89. package/skills/claude-api/shared/managed-agents-self-hosted-sandboxes.md +282 -0
  90. package/skills/claude-api/shared/managed-agents-tools.md +504 -0
  91. package/skills/claude-api/shared/managed-agents-webhooks.md +143 -0
  92. package/skills/claude-api/shared/model-migration.md +1872 -0
  93. package/skills/claude-api/shared/models.md +142 -0
  94. package/skills/claude-api/shared/platform-availability.md +53 -0
  95. package/skills/claude-api/shared/prompt-audit.md +223 -0
  96. package/skills/claude-api/shared/prompt-caching.md +292 -0
  97. package/skills/claude-api/shared/token-counting.md +56 -0
  98. package/skills/claude-api/shared/tool-use-concepts.md +526 -0
  99. package/skills/claude-api/typescript/claude-api/README.md +405 -0
  100. package/skills/claude-api/typescript/claude-api/batches.md +106 -0
  101. package/skills/claude-api/typescript/claude-api/files-api.md +98 -0
  102. package/skills/claude-api/typescript/claude-api/streaming.md +178 -0
  103. package/skills/claude-api/typescript/claude-api/tool-use.md +586 -0
  104. package/skills/claude-api/typescript/managed-agents/README.md +359 -0
  105. package/skills/code-review/SKILL.md +34 -0
  106. package/skills/code-review/agents/openai.yaml +3 -0
  107. package/skills/codebase-design/DEEPENING.md +37 -0
  108. package/skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
  109. package/skills/codebase-design/SKILL.md +40 -0
  110. package/skills/diagnosing-bugs/SKILL.md +38 -0
  111. package/skills/diagnosing-bugs/agents/openai.yaml +3 -0
  112. package/skills/diagnosing-bugs/scripts/hitl-loop.template.sh +44 -0
  113. package/skills/docx/LICENSE.txt +30 -0
  114. package/skills/docx/SKILL.md +93 -0
  115. package/skills/docx/scripts/__init__.py +1 -0
  116. package/skills/docx/scripts/accept_changes.py +135 -0
  117. package/skills/docx/scripts/comment.py +368 -0
  118. package/skills/docx/scripts/merge_runs.py +310 -0
  119. package/skills/docx/scripts/office/helpers/__init__.py +111 -0
  120. package/skills/docx/scripts/office/helpers/pptx_chart.py +170 -0
  121. package/skills/docx/scripts/office/helpers/pptx_slide.py +60 -0
  122. package/skills/docx/scripts/office/helpers/pptx_theme.py +114 -0
  123. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  124. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  125. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  126. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  127. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  128. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  129. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  130. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  131. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  132. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  133. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  134. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  135. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  136. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  137. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  138. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  139. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  140. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  141. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  142. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  143. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  144. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  145. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  146. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  147. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  148. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  149. package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  150. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  151. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  152. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  153. package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  154. package/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
  155. package/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  156. package/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  157. package/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  158. package/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  159. package/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  160. package/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  161. package/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  162. package/skills/docx/scripts/office/soffice.py +192 -0
  163. package/skills/docx/scripts/office/validate.py +173 -0
  164. package/skills/docx/scripts/office/validators/__init__.py +15 -0
  165. package/skills/docx/scripts/office/validators/base.py +875 -0
  166. package/skills/docx/scripts/office/validators/docx.py +466 -0
  167. package/skills/docx/scripts/office/validators/pptx.py +441 -0
  168. package/skills/docx/scripts/office/validators/redlining.py +299 -0
  169. package/skills/docx/scripts/templates/comments.xml +3 -0
  170. package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  171. package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  172. package/skills/docx/scripts/templates/commentsIds.xml +3 -0
  173. package/skills/docx/scripts/templates/people.xml +3 -0
  174. package/skills/frontend-design/LICENSE.txt +177 -0
  175. package/skills/frontend-design/SKILL.md +27 -0
  176. package/skills/grilling/SKILL.md +41 -0
  177. package/skills/lean-build/SKILL.md +22 -0
  178. package/skills/lean-build/agents/openai.yaml +4 -0
  179. package/skills/mcp-builder/LICENSE.txt +202 -0
  180. package/skills/mcp-builder/SKILL.md +235 -0
  181. package/skills/mcp-builder/reference/evaluation.md +602 -0
  182. package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
  183. package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
  184. package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
  185. package/skills/mcp-builder/scripts/connections.py +151 -0
  186. package/skills/mcp-builder/scripts/evaluation.py +373 -0
  187. package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  188. package/skills/mcp-builder/scripts/requirements.txt +2 -0
  189. package/skills/migration/SKILL.md +17 -0
  190. package/skills/migration/agents/openai.yaml +4 -0
  191. package/skills/pdf/LICENSE.txt +30 -0
  192. package/skills/pdf/SKILL.md +27 -0
  193. package/skills/pdf/forms.md +294 -0
  194. package/skills/pdf/reference.md +612 -0
  195. package/skills/pdf/scripts/check_bounding_boxes.py +65 -0
  196. package/skills/pdf/scripts/check_fillable_fields.py +11 -0
  197. package/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
  198. package/skills/pdf/scripts/create_validation_image.py +37 -0
  199. package/skills/pdf/scripts/extract_form_field_info.py +122 -0
  200. package/skills/pdf/scripts/extract_form_structure.py +115 -0
  201. package/skills/pdf/scripts/fill_fillable_fields.py +98 -0
  202. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
  203. package/skills/pptx/LICENSE.txt +30 -0
  204. package/skills/pptx/SKILL.md +240 -0
  205. package/skills/pptx/scripts/__init__.py +0 -0
  206. package/skills/pptx/scripts/add_slide.py +367 -0
  207. package/skills/pptx/scripts/clean.py +309 -0
  208. package/skills/pptx/scripts/office/helpers/__init__.py +111 -0
  209. package/skills/pptx/scripts/office/helpers/pptx_chart.py +170 -0
  210. package/skills/pptx/scripts/office/helpers/pptx_slide.py +60 -0
  211. package/skills/pptx/scripts/office/helpers/pptx_theme.py +114 -0
  212. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  213. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  214. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  215. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  216. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  217. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  218. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  219. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  220. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  221. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  222. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  223. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  224. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  225. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  226. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  227. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  228. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  229. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  230. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  231. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  232. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  233. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  234. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  235. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  236. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  237. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  238. package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  239. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  240. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  241. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  242. package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  243. package/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
  244. package/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  245. package/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  246. package/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  247. package/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  248. package/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  249. package/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  250. package/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  251. package/skills/pptx/scripts/office/soffice.py +192 -0
  252. package/skills/pptx/scripts/office/validate.py +173 -0
  253. package/skills/pptx/scripts/office/validators/__init__.py +15 -0
  254. package/skills/pptx/scripts/office/validators/base.py +875 -0
  255. package/skills/pptx/scripts/office/validators/docx.py +466 -0
  256. package/skills/pptx/scripts/office/validators/pptx.py +441 -0
  257. package/skills/pptx/scripts/office/validators/redlining.py +299 -0
  258. package/skills/pptx/scripts/thumbnail.py +311 -0
  259. package/skills/safe-refactor/SKILL.md +16 -0
  260. package/skills/safe-refactor/agents/openai.yaml +4 -0
  261. package/skills/tdd/SKILL.md +18 -0
  262. package/skills/tdd/agents/openai.yaml +3 -0
  263. package/skills/tdd/mocking.md +59 -0
  264. package/skills/tdd/tests.md +77 -0
  265. package/skills/verify-and-stop/SKILL.md +16 -0
  266. package/skills/verify-and-stop/agents/openai.yaml +4 -0
  267. package/skills/webapp-testing/LICENSE.txt +202 -0
  268. package/skills/webapp-testing/SKILL.md +96 -0
  269. package/skills/webapp-testing/examples/console_logging.py +35 -0
  270. package/skills/webapp-testing/examples/element_discovery.py +40 -0
  271. package/skills/webapp-testing/examples/static_html_automation.py +33 -0
  272. package/skills/webapp-testing/scripts/with_server.py +106 -0
  273. package/skills/writing-for-agents/SKILL-MECHANICS.md +22 -0
  274. package/skills/writing-for-agents/SKILL.md +28 -0
  275. package/skills/writing-for-agents/agents/openai.yaml +3 -0
  276. package/skills/xlsx/LICENSE.txt +30 -0
  277. package/skills/xlsx/SKILL.md +101 -0
  278. package/skills/xlsx/scripts/office/helpers/__init__.py +111 -0
  279. package/skills/xlsx/scripts/office/helpers/pptx_chart.py +170 -0
  280. package/skills/xlsx/scripts/office/helpers/pptx_slide.py +60 -0
  281. package/skills/xlsx/scripts/office/helpers/pptx_theme.py +114 -0
  282. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  283. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  284. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  285. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  286. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  287. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  288. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  289. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  290. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  291. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  292. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  293. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  294. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  295. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  296. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  297. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  298. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  299. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  300. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  301. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  302. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  303. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  304. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  305. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  306. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  307. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  308. package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  309. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  310. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  311. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  312. package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  313. package/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
  314. package/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
  315. package/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
  316. package/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
  317. package/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
  318. package/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
  319. package/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  320. package/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
  321. package/skills/xlsx/scripts/office/soffice.py +192 -0
  322. package/skills/xlsx/scripts/office/validate.py +173 -0
  323. package/skills/xlsx/scripts/office/validators/__init__.py +15 -0
  324. package/skills/xlsx/scripts/office/validators/base.py +875 -0
  325. package/skills/xlsx/scripts/office/validators/docx.py +466 -0
  326. package/skills/xlsx/scripts/office/validators/pptx.py +441 -0
  327. package/skills/xlsx/scripts/office/validators/redlining.py +299 -0
  328. package/skills/xlsx/scripts/recalc.py +308 -0
  329. package/skills-lock.json +359 -0
  330. package/tests/auto-permissions.test.mjs +315 -0
  331. package/tests/background-tasks.test.mjs +27 -0
  332. package/tests/background-worker.test.mjs +60 -0
  333. package/tests/bash-permissions.test.mjs +276 -0
  334. package/tests/glob.test.mjs +31 -0
  335. package/tests/mode.test.mjs +62 -0
  336. package/tests/permission-evaluation.test.mjs +70 -0
  337. package/tests/permission-foundation.test.mjs +194 -0
  338. package/tests/permission-policy.test.mjs +158 -0
  339. package/tests/runtime/README.md +51 -0
  340. package/tests/runtime/harness.mjs +190 -0
  341. package/tests/runtime/permissions.test.mjs +192 -0
  342. package/tests/runtime/tui.test.mjs +60 -0
  343. package/tests/skills-routing.test.mjs +51 -0
  344. package/tests/task-integration.test.mjs +324 -0
  345. package/tests/task-permissions.test.mjs +178 -0
  346. package/tests/task-worktree-policy.test.mjs +53 -0
  347. package/themes/orange.json +82 -0
  348. package/tsconfig.json +13 -0
@@ -0,0 +1,441 @@
1
+ """
2
+ Validator for PowerPoint presentation XML files against XSD schemas.
3
+ """
4
+
5
+ import re
6
+ from pathlib import Path
7
+
8
+ from helpers import opc_target, rels_source_part, safe_extract
9
+
10
+ from .base import BaseSchemaValidator
11
+
12
+
13
+ class PPTXSchemaValidator(BaseSchemaValidator):
14
+
15
+ PRESENTATIONML_NAMESPACE = (
16
+ "http://schemas.openxmlformats.org/presentationml/2006/main"
17
+ )
18
+
19
+ ELEMENT_RELATIONSHIP_TYPES = {
20
+ "sldid": "slide",
21
+ "sldmasterid": "slidemaster",
22
+ "notesmasterid": "notesmaster",
23
+ "sldlayoutid": "slidelayout",
24
+ "themeid": "theme",
25
+ "tablestyleid": "tablestyles",
26
+ }
27
+
28
+ def validate(self):
29
+ if not self.validate_xml():
30
+ return False
31
+
32
+ all_valid = True
33
+ if not self.validate_namespaces():
34
+ all_valid = False
35
+
36
+ if not self.validate_unique_ids():
37
+ all_valid = False
38
+
39
+ if not self.validate_uuid_ids():
40
+ all_valid = False
41
+
42
+ if not self.validate_file_references():
43
+ all_valid = False
44
+
45
+ if not self.validate_slide_layout_ids():
46
+ all_valid = False
47
+
48
+ if not self.validate_content_types():
49
+ all_valid = False
50
+
51
+ if not self.validate_against_xsd():
52
+ all_valid = False
53
+
54
+ if not self.validate_notes_slide_references():
55
+ all_valid = False
56
+
57
+ if not self.validate_all_relationship_ids():
58
+ all_valid = False
59
+
60
+ if not self.validate_no_duplicate_slide_layouts():
61
+ all_valid = False
62
+
63
+ if not self.validate_master_theme_uniqueness():
64
+ all_valid = False
65
+
66
+ if not self.validate_charts():
67
+ all_valid = False
68
+
69
+ if not self.validate_slides():
70
+ all_valid = False
71
+
72
+ return all_valid
73
+
74
+ def _package_map(self) -> dict:
75
+ wanted = []
76
+ wanted += list(self.unpacked_dir.glob("[[]Content_Types[]].xml"))
77
+ wanted += list(self.unpacked_dir.glob("ppt/presentation.xml"))
78
+ wanted += list(self.unpacked_dir.glob("ppt/theme/*.xml"))
79
+ wanted += list(self.unpacked_dir.glob("ppt/theme/_rels/*.rels"))
80
+ wanted += list(self.unpacked_dir.glob("ppt/charts/chart*.xml"))
81
+ for group in ("slideMasters", "notesMasters", "handoutMasters"):
82
+ wanted += list(self.unpacked_dir.glob(f"ppt/{group}/*.xml"))
83
+ wanted += list(self.unpacked_dir.glob(f"ppt/{group}/_rels/*.rels"))
84
+ return {
85
+ p.relative_to(self.unpacked_dir).as_posix(): p.read_bytes()
86
+ for p in wanted
87
+ if p.is_file()
88
+ }
89
+
90
+ def validate_master_theme_uniqueness(self):
91
+ from helpers.pptx_theme import _NOTES_MASTERS, live_shared_master_themes
92
+
93
+ shared = live_shared_master_themes(self._package_map())
94
+ if shared:
95
+ print(f"FAILED - Found {len(shared)} master(s) sharing a theme part:")
96
+ for message in shared:
97
+ print(f" {message}")
98
+ if any(m.startswith(_NOTES_MASTERS) for m in shared):
99
+ print(" Fix: in ppt/presentation.xml, move <p:notesMasterIdLst> back to "
100
+ "directly after <p:sldIdLst>. PowerPoint reads that happily.")
101
+ else:
102
+ print(" Fix: give each master its own theme part.")
103
+ return False
104
+
105
+ if self.verbose:
106
+ print("PASSED - No master shares a theme part in a way PowerPoint refuses")
107
+ return True
108
+
109
+ def validate_charts(self):
110
+ from helpers.pptx_chart import find_chart_problems
111
+
112
+ problems = find_chart_problems(self._package_map())
113
+ if problems:
114
+ print(f"FAILED - Found {len(problems)} chart problem(s) PowerPoint rejects:")
115
+ for message in problems:
116
+ print(f" {message}")
117
+ return False
118
+
119
+ if self.verbose:
120
+ print("PASSED - Charts satisfy the constraints PowerPoint enforces")
121
+ return True
122
+
123
+ def _original_slide_defects(self, schema) -> set[str]:
124
+ import tempfile
125
+ import zipfile
126
+
127
+ from helpers.pptx_slide import SLIDE_PART_RE, fatal_slide_errors
128
+
129
+ if self.original_file is None:
130
+ return set()
131
+
132
+ found: set[str] = set()
133
+ with tempfile.TemporaryDirectory() as temp_dir:
134
+ temp_path = Path(temp_dir)
135
+ try:
136
+ with zipfile.ZipFile(self.original_file, "r") as zf:
137
+ safe_extract(zf, temp_path)
138
+ except (zipfile.BadZipFile, ValueError, OSError):
139
+ return set()
140
+
141
+ for part in sorted(temp_path.rglob("*.xml")):
142
+ relative = part.relative_to(temp_path).as_posix()
143
+ if not SLIDE_PART_RE.fullmatch(relative):
144
+ continue
145
+ ok, errors = self._validate_single_file_xsd(
146
+ part.resolve(), temp_path.resolve(), schema_path=schema
147
+ )
148
+ if ok is None or ok or not errors:
149
+ continue
150
+ found |= set(fatal_slide_errors(set(errors)))
151
+ return found
152
+
153
+ def validate_slides(self):
154
+ from helpers.pptx_slide import (
155
+ SLIDE_PART_RE,
156
+ fatal_slide_errors,
157
+ is_schema_verdict,
158
+ )
159
+
160
+ schema = self.schemas_dir / self.SCHEMA_MAPPINGS["ppt"]
161
+ inherited = self._original_slide_defects(schema)
162
+ problems: list[str] = []
163
+ broken: list[str] = []
164
+
165
+ for xml_file in self.xml_files:
166
+ relative = xml_file.relative_to(self.unpacked_dir).as_posix()
167
+ if not SLIDE_PART_RE.fullmatch(relative):
168
+ continue
169
+ ok, errors = self._validate_single_file_xsd(
170
+ xml_file.resolve(), self.unpacked_dir.resolve(), schema_path=schema
171
+ )
172
+ if ok is None or not errors:
173
+ continue
174
+
175
+ unreadable = [f"{relative}: {e}" for e in errors if not is_schema_verdict(e)]
176
+ if unreadable:
177
+ broken.extend(unreadable)
178
+ continue
179
+ if ok:
180
+ continue
181
+
182
+ for message in fatal_slide_errors(set(errors)):
183
+ if message in inherited:
184
+ continue
185
+ problems.append(f"{relative}: {message}")
186
+
187
+ if broken:
188
+ print(f"FAILED - Could not check {len(broken)} slide part(s):")
189
+ for message in sorted(broken):
190
+ print(f" {message[:240]}")
191
+
192
+ if problems:
193
+ print(f"FAILED - Found {len(problems)} slide problem(s) PowerPoint rejects:")
194
+ for message in sorted(problems):
195
+ print(f" {message[:240]}")
196
+
197
+ if broken or problems:
198
+ return False
199
+
200
+ if self.verbose:
201
+ print("PASSED - Slide XML has none of the defects PowerPoint refuses")
202
+ return True
203
+
204
+ def _get_schema_path(self, xml_file):
205
+ if xml_file.parent.name == "charts" and xml_file.name.startswith("chart"):
206
+ return None
207
+ return super()._get_schema_path(xml_file)
208
+
209
+ def _preprocess_for_schema(self, xml_doc, relative_path):
210
+ if relative_path.as_posix() != "ppt/presentation.xml":
211
+ return xml_doc
212
+
213
+ root = xml_doc.getroot()
214
+ ns = f"{{{self.PRESENTATIONML_NAMESPACE}}}"
215
+ notes = root.find(f"{ns}notesMasterIdLst")
216
+ slides = root.find(f"{ns}sldIdLst")
217
+ if notes is None or slides is None:
218
+ return xml_doc
219
+
220
+ children = list(root)
221
+ if children.index(notes) < children.index(slides):
222
+ return xml_doc
223
+
224
+ root.remove(notes)
225
+ root.insert(list(root).index(slides), notes)
226
+ return xml_doc
227
+
228
+ def validate_uuid_ids(self):
229
+ import lxml.etree
230
+
231
+ errors = []
232
+ uuid_pattern = re.compile(
233
+ r"^[\{\(]?[0-9A-Fa-f]{8}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{4}-?[0-9A-Fa-f]{12}[\}\)]?$"
234
+ )
235
+
236
+ for xml_file in self.xml_files:
237
+ try:
238
+ root = lxml.etree.parse(str(xml_file)).getroot()
239
+
240
+ for elem in root.iter():
241
+ for attr, value in elem.attrib.items():
242
+ attr_name = attr.split("}")[-1].lower()
243
+ if attr_name == "id" or attr_name.endswith("id"):
244
+ if self._looks_like_uuid(value):
245
+ if not uuid_pattern.match(value):
246
+ errors.append(
247
+ f" {xml_file.relative_to(self.unpacked_dir)}: "
248
+ f"Line {elem.sourceline}: ID '{value}' appears to be a UUID but contains invalid hex characters"
249
+ )
250
+
251
+ except (lxml.etree.XMLSyntaxError, Exception) as e:
252
+ errors.append(
253
+ f" {xml_file.relative_to(self.unpacked_dir)}: Error: {e}"
254
+ )
255
+
256
+ if errors:
257
+ print(f"FAILED - Found {len(errors)} UUID ID validation errors:")
258
+ for error in errors:
259
+ print(error)
260
+ return False
261
+ else:
262
+ if self.verbose:
263
+ print("PASSED - All UUID-like IDs contain valid hex values")
264
+ return True
265
+
266
+ def _looks_like_uuid(self, value):
267
+ clean_value = value.strip("{}()").replace("-", "")
268
+ return len(clean_value) == 32 and all(c.isalnum() for c in clean_value)
269
+
270
+ def validate_slide_layout_ids(self):
271
+ import lxml.etree
272
+
273
+ errors = []
274
+
275
+ slide_masters = list(self.unpacked_dir.glob("ppt/slideMasters/*.xml"))
276
+
277
+ if not slide_masters:
278
+ if self.verbose:
279
+ print("PASSED - No slide masters found")
280
+ return True
281
+
282
+ for slide_master in slide_masters:
283
+ try:
284
+ root = lxml.etree.parse(str(slide_master)).getroot()
285
+
286
+ rels_file = slide_master.parent / "_rels" / f"{slide_master.name}.rels"
287
+
288
+ if not rels_file.exists():
289
+ errors.append(
290
+ f" {slide_master.relative_to(self.unpacked_dir)}: "
291
+ f"Missing relationships file: {rels_file.relative_to(self.unpacked_dir)}"
292
+ )
293
+ continue
294
+
295
+ rels_root = lxml.etree.parse(str(rels_file)).getroot()
296
+
297
+ valid_layout_rids = set()
298
+ for rel in rels_root.findall(
299
+ f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship"
300
+ ):
301
+ rel_type = rel.get("Type", "")
302
+ if "slideLayout" in rel_type:
303
+ valid_layout_rids.add(rel.get("Id"))
304
+
305
+ for sld_layout_id in root.findall(
306
+ f".//{{{self.PRESENTATIONML_NAMESPACE}}}sldLayoutId"
307
+ ):
308
+ r_id = sld_layout_id.get(
309
+ f"{{{self.OFFICE_RELATIONSHIPS_NAMESPACE}}}id"
310
+ )
311
+ layout_id = sld_layout_id.get("id")
312
+
313
+ if r_id and r_id not in valid_layout_rids:
314
+ errors.append(
315
+ f" {slide_master.relative_to(self.unpacked_dir)}: "
316
+ f"Line {sld_layout_id.sourceline}: sldLayoutId with id='{layout_id}' "
317
+ f"references r:id='{r_id}' which is not found in slide layout relationships"
318
+ )
319
+
320
+ except (lxml.etree.XMLSyntaxError, Exception) as e:
321
+ errors.append(
322
+ f" {slide_master.relative_to(self.unpacked_dir)}: Error: {e}"
323
+ )
324
+
325
+ if errors:
326
+ print(f"FAILED - Found {len(errors)} slide layout ID validation errors:")
327
+ for error in errors:
328
+ print(error)
329
+ print(
330
+ "Remove invalid references or add missing slide layouts to the relationships file."
331
+ )
332
+ return False
333
+ else:
334
+ if self.verbose:
335
+ print("PASSED - All slide layout IDs reference valid slide layouts")
336
+ return True
337
+
338
+ def validate_no_duplicate_slide_layouts(self):
339
+ import lxml.etree
340
+
341
+ errors = []
342
+ slide_rels_files = list(self.unpacked_dir.glob("ppt/slides/_rels/*.xml.rels"))
343
+
344
+ for rels_file in slide_rels_files:
345
+ try:
346
+ root = lxml.etree.parse(str(rels_file)).getroot()
347
+
348
+ layout_rels = [
349
+ rel
350
+ for rel in root.findall(
351
+ f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship"
352
+ )
353
+ if "slideLayout" in rel.get("Type", "")
354
+ ]
355
+
356
+ if len(layout_rels) > 1:
357
+ errors.append(
358
+ f" {rels_file.relative_to(self.unpacked_dir)}: has {len(layout_rels)} slideLayout references"
359
+ )
360
+
361
+ except Exception as e:
362
+ errors.append(
363
+ f" {rels_file.relative_to(self.unpacked_dir)}: Error: {e}"
364
+ )
365
+
366
+ if errors:
367
+ print("FAILED - Found slides with duplicate slideLayout references:")
368
+ for error in errors:
369
+ print(error)
370
+ return False
371
+ else:
372
+ if self.verbose:
373
+ print("PASSED - All slides have exactly one slideLayout reference")
374
+ return True
375
+
376
+ def validate_notes_slide_references(self):
377
+ import lxml.etree
378
+
379
+ errors = []
380
+ notes_slide_references = {}
381
+
382
+ slide_rels_files = list(self.unpacked_dir.glob("ppt/slides/_rels/*.xml.rels"))
383
+
384
+ if not slide_rels_files:
385
+ if self.verbose:
386
+ print("PASSED - No slide relationship files found")
387
+ return True
388
+
389
+ for rels_file in slide_rels_files:
390
+ try:
391
+ root = lxml.etree.parse(str(rels_file)).getroot()
392
+
393
+ for rel in root.findall(
394
+ f".//{{{self.PACKAGE_RELATIONSHIPS_NAMESPACE}}}Relationship"
395
+ ):
396
+ rel_type = rel.get("Type", "")
397
+ if "notesSlide" in rel_type:
398
+ part = opc_target(
399
+ rel.get("Target", ""),
400
+ rels_source_part(rels_file, self.unpacked_dir),
401
+ rel.get("TargetMode", ""),
402
+ )
403
+ if part:
404
+ slide_name = rels_file.stem.replace(
405
+ ".xml", ""
406
+ )
407
+
408
+ notes_slide_references.setdefault(part, []).append(
409
+ (slide_name, rels_file)
410
+ )
411
+
412
+ except (lxml.etree.XMLSyntaxError, Exception) as e:
413
+ errors.append(
414
+ f" {rels_file.relative_to(self.unpacked_dir)}: Error: {e}"
415
+ )
416
+
417
+ for target, references in notes_slide_references.items():
418
+ if len(references) > 1:
419
+ slide_names = [ref[0] for ref in references]
420
+ errors.append(
421
+ f" Notes slide '{target}' is referenced by multiple slides: {', '.join(slide_names)}"
422
+ )
423
+ for slide_name, rels_file in references:
424
+ errors.append(f" - {rels_file.relative_to(self.unpacked_dir)}")
425
+
426
+ if errors:
427
+ print(
428
+ f"FAILED - Found {len([e for e in errors if not e.startswith(' ')])} notes slide reference validation errors:"
429
+ )
430
+ for error in errors:
431
+ print(error)
432
+ print("Each slide may optionally have its own slide file.")
433
+ return False
434
+ else:
435
+ if self.verbose:
436
+ print("PASSED - All notes slide references are unique")
437
+ return True
438
+
439
+
440
+ if __name__ == "__main__":
441
+ raise RuntimeError("This module should not be run directly.")