@amrhas82/agentic-kit 1.0.0

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 (335) hide show
  1. package/.claude-plugin/plugin-lite.json +38 -0
  2. package/.claude-plugin/plugin-pro.json +183 -0
  3. package/.claude-plugin/plugin-standard.json +147 -0
  4. package/.claude-plugin/plugin.json +47 -0
  5. package/LICENSE +21 -0
  6. package/QUICK-START.md +318 -0
  7. package/README.md +449 -0
  8. package/TROUBLESHOOTING.md +788 -0
  9. package/VARIANTS.md +480 -0
  10. package/agents/1-create-prd.md +56 -0
  11. package/agents/2-generate-tasks.md +73 -0
  12. package/agents/3-process-task-list.md +101 -0
  13. package/agents/business-analyst.md +76 -0
  14. package/agents/full-stack-dev.md +80 -0
  15. package/agents/holistic-architect.md +91 -0
  16. package/agents/master.md +55 -0
  17. package/agents/orchestrator.md +103 -0
  18. package/agents/product-manager.md +82 -0
  19. package/agents/product-owner.md +97 -0
  20. package/agents/qa-test-architect.md +72 -0
  21. package/agents/scrum-master.md +64 -0
  22. package/agents/ux-expert.md +74 -0
  23. package/cli.js +230 -0
  24. package/hooks/register-agents.js +123 -0
  25. package/package.json +61 -0
  26. package/resources/agent-teams.yaml +50 -0
  27. package/resources/checklists.md +1724 -0
  28. package/resources/data.md +1372 -0
  29. package/resources/task-briefs.md +4428 -0
  30. package/resources/templates.yaml +5634 -0
  31. package/resources/workflows.yaml +1253 -0
  32. package/skills/algorithmic-art/LICENSE.txt +202 -0
  33. package/skills/algorithmic-art/SKILL.md +405 -0
  34. package/skills/algorithmic-art/templates/generator_template.js +223 -0
  35. package/skills/algorithmic-art/templates/viewer.html +599 -0
  36. package/skills/artifacts-builder/LICENSE.txt +202 -0
  37. package/skills/artifacts-builder/SKILL.md +74 -0
  38. package/skills/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  39. package/skills/artifacts-builder/scripts/init-artifact.sh +322 -0
  40. package/skills/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  41. package/skills/brainstorming/SKILL.md +54 -0
  42. package/skills/brand-guidelines/LICENSE.txt +202 -0
  43. package/skills/brand-guidelines/SKILL.md +73 -0
  44. package/skills/canvas-design/LICENSE.txt +202 -0
  45. package/skills/canvas-design/SKILL.md +130 -0
  46. package/skills/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  47. package/skills/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  48. package/skills/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  49. package/skills/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  50. package/skills/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  51. package/skills/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  52. package/skills/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  53. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  54. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  55. package/skills/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  56. package/skills/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  57. package/skills/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  58. package/skills/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  59. package/skills/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  60. package/skills/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  61. package/skills/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  62. package/skills/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  63. package/skills/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  64. package/skills/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  65. package/skills/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  66. package/skills/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  67. package/skills/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  68. package/skills/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  69. package/skills/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  70. package/skills/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  71. package/skills/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  72. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  73. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  74. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  75. package/skills/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  76. package/skills/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  77. package/skills/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  78. package/skills/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  79. package/skills/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  80. package/skills/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  81. package/skills/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  82. package/skills/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  83. package/skills/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  84. package/skills/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  85. package/skills/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  86. package/skills/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  87. package/skills/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  88. package/skills/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  89. package/skills/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  90. package/skills/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  91. package/skills/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  92. package/skills/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  93. package/skills/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  94. package/skills/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  95. package/skills/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  96. package/skills/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  97. package/skills/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  98. package/skills/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  99. package/skills/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  100. package/skills/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  101. package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  102. package/skills/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  103. package/skills/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  104. package/skills/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  105. package/skills/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  106. package/skills/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  107. package/skills/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  108. package/skills/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  109. package/skills/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  110. package/skills/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  111. package/skills/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  112. package/skills/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  113. package/skills/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  114. package/skills/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  115. package/skills/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  116. package/skills/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  117. package/skills/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  118. package/skills/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  119. package/skills/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  120. package/skills/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  121. package/skills/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  122. package/skills/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  123. package/skills/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  124. package/skills/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  125. package/skills/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  126. package/skills/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  127. package/skills/code-review/SKILL.md +105 -0
  128. package/skills/code-review/code-reviewer.md +146 -0
  129. package/skills/condition-based-waiting/SKILL.md +120 -0
  130. package/skills/condition-based-waiting/example.ts +158 -0
  131. package/skills/docx/LICENSE.txt +30 -0
  132. package/skills/docx/SKILL.md +197 -0
  133. package/skills/docx/docx-js.md +350 -0
  134. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  135. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  136. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  137. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  138. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  139. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  140. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  141. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  142. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  143. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  144. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  145. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  146. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  147. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  148. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  149. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  150. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  151. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  152. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  153. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  154. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  155. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  156. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  157. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  158. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  159. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  160. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  161. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  162. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  163. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  164. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  165. package/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  166. package/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  167. package/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  168. package/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  169. package/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  170. package/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  171. package/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  172. package/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  173. package/skills/docx/ooxml/scripts/pack.py +159 -0
  174. package/skills/docx/ooxml/scripts/unpack.py +29 -0
  175. package/skills/docx/ooxml/scripts/validate.py +69 -0
  176. package/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  177. package/skills/docx/ooxml/scripts/validation/base.py +951 -0
  178. package/skills/docx/ooxml/scripts/validation/docx.py +274 -0
  179. package/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  180. package/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  181. package/skills/docx/ooxml.md +610 -0
  182. package/skills/docx/scripts/__init__.py +1 -0
  183. package/skills/docx/scripts/document.py +1276 -0
  184. package/skills/docx/scripts/templates/comments.xml +3 -0
  185. package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  186. package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  187. package/skills/docx/scripts/templates/commentsIds.xml +3 -0
  188. package/skills/docx/scripts/templates/people.xml +3 -0
  189. package/skills/docx/scripts/utilities.py +374 -0
  190. package/skills/internal-comms/LICENSE.txt +202 -0
  191. package/skills/internal-comms/SKILL.md +32 -0
  192. package/skills/internal-comms/examples/3p-updates.md +47 -0
  193. package/skills/internal-comms/examples/company-newsletter.md +65 -0
  194. package/skills/internal-comms/examples/faq-answers.md +30 -0
  195. package/skills/internal-comms/examples/general-comms.md +16 -0
  196. package/skills/mcp-builder/LICENSE.txt +202 -0
  197. package/skills/mcp-builder/SKILL.md +328 -0
  198. package/skills/mcp-builder/reference/evaluation.md +602 -0
  199. package/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
  200. package/skills/mcp-builder/reference/node_mcp_server.md +916 -0
  201. package/skills/mcp-builder/reference/python_mcp_server.md +752 -0
  202. package/skills/mcp-builder/scripts/connections.py +151 -0
  203. package/skills/mcp-builder/scripts/evaluation.py +373 -0
  204. package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
  205. package/skills/mcp-builder/scripts/requirements.txt +2 -0
  206. package/skills/pdf/LICENSE.txt +30 -0
  207. package/skills/pdf/SKILL.md +294 -0
  208. package/skills/pdf/forms.md +205 -0
  209. package/skills/pdf/reference.md +612 -0
  210. package/skills/pdf/scripts/check_bounding_boxes.py +70 -0
  211. package/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  212. package/skills/pdf/scripts/check_fillable_fields.py +12 -0
  213. package/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  214. package/skills/pdf/scripts/create_validation_image.py +41 -0
  215. package/skills/pdf/scripts/extract_form_field_info.py +152 -0
  216. package/skills/pdf/scripts/fill_fillable_fields.py +114 -0
  217. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  218. package/skills/pptx/LICENSE.txt +30 -0
  219. package/skills/pptx/SKILL.md +484 -0
  220. package/skills/pptx/html2pptx.md +625 -0
  221. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  222. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  223. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  224. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  225. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  226. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  227. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  228. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  229. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  230. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  231. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  232. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  233. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  234. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  235. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  236. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  237. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  238. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  239. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  240. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  241. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  242. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  243. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  244. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  245. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  246. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  247. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  248. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  249. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  250. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  251. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  252. package/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  253. package/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  254. package/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  255. package/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  256. package/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  257. package/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  258. package/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  259. package/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  260. package/skills/pptx/ooxml/scripts/pack.py +159 -0
  261. package/skills/pptx/ooxml/scripts/unpack.py +29 -0
  262. package/skills/pptx/ooxml/scripts/validate.py +69 -0
  263. package/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  264. package/skills/pptx/ooxml/scripts/validation/base.py +951 -0
  265. package/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  266. package/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  267. package/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  268. package/skills/pptx/ooxml.md +427 -0
  269. package/skills/pptx/scripts/html2pptx.js +979 -0
  270. package/skills/pptx/scripts/inventory.py +1020 -0
  271. package/skills/pptx/scripts/rearrange.py +231 -0
  272. package/skills/pptx/scripts/replace.py +385 -0
  273. package/skills/pptx/scripts/thumbnail.py +450 -0
  274. package/skills/root-cause-tracing/SKILL.md +174 -0
  275. package/skills/root-cause-tracing/find-polluter.sh +63 -0
  276. package/skills/skill-creator/LICENSE.txt +202 -0
  277. package/skills/skill-creator/SKILL.md +209 -0
  278. package/skills/skill-creator/scripts/init_skill.py +303 -0
  279. package/skills/skill-creator/scripts/package_skill.py +110 -0
  280. package/skills/skill-creator/scripts/quick_validate.py +65 -0
  281. package/skills/slack-gif-creator/LICENSE.txt +202 -0
  282. package/skills/slack-gif-creator/SKILL.md +646 -0
  283. package/skills/slack-gif-creator/core/color_palettes.py +302 -0
  284. package/skills/slack-gif-creator/core/easing.py +230 -0
  285. package/skills/slack-gif-creator/core/frame_composer.py +469 -0
  286. package/skills/slack-gif-creator/core/gif_builder.py +246 -0
  287. package/skills/slack-gif-creator/core/typography.py +357 -0
  288. package/skills/slack-gif-creator/core/validators.py +264 -0
  289. package/skills/slack-gif-creator/core/visual_effects.py +494 -0
  290. package/skills/slack-gif-creator/requirements.txt +4 -0
  291. package/skills/slack-gif-creator/templates/bounce.py +106 -0
  292. package/skills/slack-gif-creator/templates/explode.py +331 -0
  293. package/skills/slack-gif-creator/templates/fade.py +329 -0
  294. package/skills/slack-gif-creator/templates/flip.py +291 -0
  295. package/skills/slack-gif-creator/templates/kaleidoscope.py +211 -0
  296. package/skills/slack-gif-creator/templates/morph.py +329 -0
  297. package/skills/slack-gif-creator/templates/move.py +293 -0
  298. package/skills/slack-gif-creator/templates/pulse.py +268 -0
  299. package/skills/slack-gif-creator/templates/shake.py +127 -0
  300. package/skills/slack-gif-creator/templates/slide.py +291 -0
  301. package/skills/slack-gif-creator/templates/spin.py +269 -0
  302. package/skills/slack-gif-creator/templates/wiggle.py +300 -0
  303. package/skills/slack-gif-creator/templates/zoom.py +312 -0
  304. package/skills/systematic-debugging/CREATION-LOG.md +119 -0
  305. package/skills/systematic-debugging/SKILL.md +295 -0
  306. package/skills/systematic-debugging/test-academic.md +14 -0
  307. package/skills/systematic-debugging/test-pressure-1.md +58 -0
  308. package/skills/systematic-debugging/test-pressure-2.md +68 -0
  309. package/skills/systematic-debugging/test-pressure-3.md +69 -0
  310. package/skills/test-driven-development/SKILL.md +364 -0
  311. package/skills/testing-anti-patterns/SKILL.md +302 -0
  312. package/skills/theme-factory/LICENSE.txt +202 -0
  313. package/skills/theme-factory/SKILL.md +59 -0
  314. package/skills/theme-factory/theme-showcase.pdf +0 -0
  315. package/skills/theme-factory/themes/arctic-frost.md +19 -0
  316. package/skills/theme-factory/themes/botanical-garden.md +19 -0
  317. package/skills/theme-factory/themes/desert-rose.md +19 -0
  318. package/skills/theme-factory/themes/forest-canopy.md +19 -0
  319. package/skills/theme-factory/themes/golden-hour.md +19 -0
  320. package/skills/theme-factory/themes/midnight-galaxy.md +19 -0
  321. package/skills/theme-factory/themes/modern-minimalist.md +19 -0
  322. package/skills/theme-factory/themes/ocean-depths.md +19 -0
  323. package/skills/theme-factory/themes/sunset-boulevard.md +19 -0
  324. package/skills/theme-factory/themes/tech-innovation.md +19 -0
  325. package/skills/verification-before-completion/SKILL.md +139 -0
  326. package/skills/webapp-testing/LICENSE.txt +202 -0
  327. package/skills/webapp-testing/SKILL.md +96 -0
  328. package/skills/webapp-testing/examples/console_logging.py +35 -0
  329. package/skills/webapp-testing/examples/element_discovery.py +40 -0
  330. package/skills/webapp-testing/examples/static_html_automation.py +33 -0
  331. package/skills/webapp-testing/scripts/with_server.py +106 -0
  332. package/skills/xlsx/LICENSE.txt +30 -0
  333. package/skills/xlsx/SKILL.md +289 -0
  334. package/skills/xlsx/recalc.py +178 -0
  335. package/validate-references.sh +86 -0
@@ -0,0 +1,268 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Pulse Animation - Scale objects rhythmically for emphasis.
4
+
5
+ Creates pulsing, heartbeat, and throbbing effects.
6
+ """
7
+
8
+ import sys
9
+ from pathlib import Path
10
+ import math
11
+
12
+ sys.path.append(str(Path(__file__).parent.parent))
13
+
14
+ from PIL import Image
15
+ from core.gif_builder import GIFBuilder
16
+ from core.frame_composer import create_blank_frame, draw_emoji_enhanced, draw_circle
17
+ from core.easing import interpolate
18
+
19
+
20
+ def create_pulse_animation(
21
+ object_type: str = 'emoji',
22
+ object_data: dict | None = None,
23
+ num_frames: int = 30,
24
+ pulse_type: str = 'smooth', # 'smooth', 'heartbeat', 'throb', 'pop'
25
+ scale_range: tuple[float, float] = (0.8, 1.2),
26
+ pulses: float = 2.0,
27
+ center_pos: tuple[int, int] = (240, 240),
28
+ frame_width: int = 480,
29
+ frame_height: int = 480,
30
+ bg_color: tuple[int, int, int] = (255, 255, 255)
31
+ ) -> list[Image.Image]:
32
+ """
33
+ Create pulsing/scaling animation.
34
+
35
+ Args:
36
+ object_type: 'emoji', 'circle', 'text'
37
+ object_data: Object configuration
38
+ num_frames: Number of frames
39
+ pulse_type: Type of pulsing motion
40
+ scale_range: (min_scale, max_scale) tuple
41
+ pulses: Number of pulses in animation
42
+ center_pos: Center position
43
+ frame_width: Frame width
44
+ frame_height: Frame height
45
+ bg_color: Background color
46
+
47
+ Returns:
48
+ List of frames
49
+ """
50
+ frames = []
51
+
52
+ # Default object data
53
+ if object_data is None:
54
+ if object_type == 'emoji':
55
+ object_data = {'emoji': '❤️', 'size': 100}
56
+ elif object_type == 'circle':
57
+ object_data = {'radius': 50, 'color': (255, 100, 100)}
58
+
59
+ min_scale, max_scale = scale_range
60
+
61
+ for i in range(num_frames):
62
+ frame = create_blank_frame(frame_width, frame_height, bg_color)
63
+ t = i / (num_frames - 1) if num_frames > 1 else 0
64
+
65
+ # Calculate scale based on pulse type
66
+ if pulse_type == 'smooth':
67
+ # Simple sinusoidal pulse
68
+ scale = min_scale + (max_scale - min_scale) * (
69
+ 0.5 + 0.5 * math.sin(t * pulses * 2 * math.pi - math.pi / 2)
70
+ )
71
+
72
+ elif pulse_type == 'heartbeat':
73
+ # Double pump like a heartbeat
74
+ phase = (t * pulses) % 1.0
75
+ if phase < 0.15:
76
+ # First pump
77
+ scale = interpolate(min_scale, max_scale, phase / 0.15, 'ease_out')
78
+ elif phase < 0.25:
79
+ # First release
80
+ scale = interpolate(max_scale, min_scale, (phase - 0.15) / 0.10, 'ease_in')
81
+ elif phase < 0.35:
82
+ # Second pump (smaller)
83
+ scale = interpolate(min_scale, (min_scale + max_scale) / 2, (phase - 0.25) / 0.10, 'ease_out')
84
+ elif phase < 0.45:
85
+ # Second release
86
+ scale = interpolate((min_scale + max_scale) / 2, min_scale, (phase - 0.35) / 0.10, 'ease_in')
87
+ else:
88
+ # Rest period
89
+ scale = min_scale
90
+
91
+ elif pulse_type == 'throb':
92
+ # Sharp pulse with quick return
93
+ phase = (t * pulses) % 1.0
94
+ if phase < 0.2:
95
+ scale = interpolate(min_scale, max_scale, phase / 0.2, 'ease_out')
96
+ else:
97
+ scale = interpolate(max_scale, min_scale, (phase - 0.2) / 0.8, 'ease_in')
98
+
99
+ elif pulse_type == 'pop':
100
+ # Pop out and back with overshoot
101
+ phase = (t * pulses) % 1.0
102
+ if phase < 0.3:
103
+ # Pop out with overshoot
104
+ scale = interpolate(min_scale, max_scale * 1.1, phase / 0.3, 'elastic_out')
105
+ else:
106
+ # Settle back
107
+ scale = interpolate(max_scale * 1.1, min_scale, (phase - 0.3) / 0.7, 'ease_out')
108
+
109
+ else:
110
+ scale = min_scale + (max_scale - min_scale) * (
111
+ 0.5 + 0.5 * math.sin(t * pulses * 2 * math.pi)
112
+ )
113
+
114
+ # Draw object at calculated scale
115
+ if object_type == 'emoji':
116
+ base_size = object_data['size']
117
+ current_size = int(base_size * scale)
118
+ draw_emoji_enhanced(
119
+ frame,
120
+ emoji=object_data['emoji'],
121
+ position=(center_pos[0] - current_size // 2, center_pos[1] - current_size // 2),
122
+ size=current_size,
123
+ shadow=object_data.get('shadow', True)
124
+ )
125
+
126
+ elif object_type == 'circle':
127
+ base_radius = object_data['radius']
128
+ current_radius = int(base_radius * scale)
129
+ draw_circle(
130
+ frame,
131
+ center=center_pos,
132
+ radius=current_radius,
133
+ fill_color=object_data['color']
134
+ )
135
+
136
+ elif object_type == 'text':
137
+ from core.typography import draw_text_with_outline
138
+ base_size = object_data.get('font_size', 50)
139
+ current_size = int(base_size * scale)
140
+ draw_text_with_outline(
141
+ frame,
142
+ text=object_data.get('text', 'PULSE'),
143
+ position=center_pos,
144
+ font_size=current_size,
145
+ text_color=object_data.get('text_color', (255, 100, 100)),
146
+ outline_color=object_data.get('outline_color', (0, 0, 0)),
147
+ outline_width=3,
148
+ centered=True
149
+ )
150
+
151
+ frames.append(frame)
152
+
153
+ return frames
154
+
155
+
156
+ def create_attention_pulse(
157
+ emoji: str = '⚠️',
158
+ num_frames: int = 20,
159
+ frame_size: int = 128,
160
+ bg_color: tuple[int, int, int] = (255, 255, 255)
161
+ ) -> list[Image.Image]:
162
+ """
163
+ Create attention-grabbing pulse (good for emoji GIFs).
164
+
165
+ Args:
166
+ emoji: Emoji to pulse
167
+ num_frames: Number of frames
168
+ frame_size: Frame size (square)
169
+ bg_color: Background color
170
+
171
+ Returns:
172
+ List of frames optimized for emoji size
173
+ """
174
+ return create_pulse_animation(
175
+ object_type='emoji',
176
+ object_data={'emoji': emoji, 'size': 80, 'shadow': False},
177
+ num_frames=num_frames,
178
+ pulse_type='throb',
179
+ scale_range=(0.85, 1.15),
180
+ pulses=2,
181
+ center_pos=(frame_size // 2, frame_size // 2),
182
+ frame_width=frame_size,
183
+ frame_height=frame_size,
184
+ bg_color=bg_color
185
+ )
186
+
187
+
188
+ def create_breathing_animation(
189
+ object_type: str = 'emoji',
190
+ object_data: dict | None = None,
191
+ num_frames: int = 60,
192
+ breaths: float = 2.0,
193
+ scale_range: tuple[float, float] = (0.9, 1.1),
194
+ frame_width: int = 480,
195
+ frame_height: int = 480,
196
+ bg_color: tuple[int, int, int] = (240, 248, 255)
197
+ ) -> list[Image.Image]:
198
+ """
199
+ Create slow, calming breathing animation (in and out).
200
+
201
+ Args:
202
+ object_type: Type of object
203
+ object_data: Object configuration
204
+ num_frames: Number of frames
205
+ breaths: Number of breathing cycles
206
+ scale_range: Min/max scale
207
+ frame_width: Frame width
208
+ frame_height: Frame height
209
+ bg_color: Background color
210
+
211
+ Returns:
212
+ List of frames
213
+ """
214
+ if object_data is None:
215
+ object_data = {'emoji': '😌', 'size': 100}
216
+
217
+ return create_pulse_animation(
218
+ object_type=object_type,
219
+ object_data=object_data,
220
+ num_frames=num_frames,
221
+ pulse_type='smooth',
222
+ scale_range=scale_range,
223
+ pulses=breaths,
224
+ center_pos=(frame_width // 2, frame_height // 2),
225
+ frame_width=frame_width,
226
+ frame_height=frame_height,
227
+ bg_color=bg_color
228
+ )
229
+
230
+
231
+ # Example usage
232
+ if __name__ == '__main__':
233
+ print("Creating pulse animations...")
234
+
235
+ builder = GIFBuilder(width=480, height=480, fps=20)
236
+
237
+ # Example 1: Smooth pulse
238
+ frames = create_pulse_animation(
239
+ object_type='emoji',
240
+ object_data={'emoji': '❤️', 'size': 100},
241
+ num_frames=40,
242
+ pulse_type='smooth',
243
+ scale_range=(0.8, 1.2),
244
+ pulses=2
245
+ )
246
+ builder.add_frames(frames)
247
+ builder.save('pulse_smooth.gif', num_colors=128)
248
+
249
+ # Example 2: Heartbeat
250
+ builder.clear()
251
+ frames = create_pulse_animation(
252
+ object_type='emoji',
253
+ object_data={'emoji': '💓', 'size': 100},
254
+ num_frames=60,
255
+ pulse_type='heartbeat',
256
+ scale_range=(0.85, 1.2),
257
+ pulses=3
258
+ )
259
+ builder.add_frames(frames)
260
+ builder.save('pulse_heartbeat.gif', num_colors=128)
261
+
262
+ # Example 3: Attention pulse (emoji size)
263
+ builder = GIFBuilder(width=128, height=128, fps=15)
264
+ frames = create_attention_pulse(emoji='⚠️', num_frames=20)
265
+ builder.add_frames(frames)
266
+ builder.save('pulse_attention.gif', num_colors=48, optimize_for_emoji=True)
267
+
268
+ print("Created pulse animations!")
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Shake Animation Template - Creates shaking/vibrating motion.
4
+
5
+ Use this for impact effects, emphasis, or nervous/excited reactions.
6
+ """
7
+
8
+ import sys
9
+ import math
10
+ from pathlib import Path
11
+
12
+ sys.path.append(str(Path(__file__).parent.parent))
13
+
14
+ from core.gif_builder import GIFBuilder
15
+ from core.frame_composer import create_blank_frame, draw_circle, draw_emoji, draw_text
16
+ from core.easing import ease_out_quad
17
+
18
+
19
+ def create_shake_animation(
20
+ object_type: str = 'emoji',
21
+ object_data: dict = None,
22
+ num_frames: int = 20,
23
+ shake_intensity: int = 15,
24
+ center_x: int = 240,
25
+ center_y: int = 240,
26
+ direction: str = 'horizontal', # 'horizontal', 'vertical', or 'both'
27
+ frame_width: int = 480,
28
+ frame_height: int = 480,
29
+ bg_color: tuple[int, int, int] = (255, 255, 255)
30
+ ) -> list:
31
+ """
32
+ Create frames for a shaking animation.
33
+
34
+ Args:
35
+ object_type: 'circle', 'emoji', 'text', or 'custom'
36
+ object_data: Data for the object
37
+ num_frames: Number of frames
38
+ shake_intensity: Maximum shake displacement in pixels
39
+ center_x: Center X position
40
+ center_y: Center Y position
41
+ direction: 'horizontal', 'vertical', or 'both'
42
+ frame_width: Frame width
43
+ frame_height: Frame height
44
+ bg_color: Background color
45
+
46
+ Returns:
47
+ List of frames
48
+ """
49
+ frames = []
50
+
51
+ # Default object data
52
+ if object_data is None:
53
+ if object_type == 'emoji':
54
+ object_data = {'emoji': '😱', 'size': 80}
55
+ elif object_type == 'text':
56
+ object_data = {'text': 'SHAKE!', 'font_size': 50, 'color': (255, 0, 0)}
57
+
58
+ for i in range(num_frames):
59
+ frame = create_blank_frame(frame_width, frame_height, bg_color)
60
+
61
+ # Calculate progress
62
+ t = i / (num_frames - 1) if num_frames > 1 else 0
63
+
64
+ # Decay shake intensity over time
65
+ intensity = shake_intensity * (1 - ease_out_quad(t))
66
+
67
+ # Calculate shake offset using sine wave for smooth oscillation
68
+ freq = 3 # Oscillation frequency
69
+ offset_x = 0
70
+ offset_y = 0
71
+
72
+ if direction in ['horizontal', 'both']:
73
+ offset_x = int(math.sin(t * freq * 2 * math.pi) * intensity)
74
+
75
+ if direction in ['vertical', 'both']:
76
+ offset_y = int(math.cos(t * freq * 2 * math.pi) * intensity)
77
+
78
+ # Apply offset
79
+ x = center_x + offset_x
80
+ y = center_y + offset_y
81
+
82
+ # Draw object
83
+ if object_type == 'emoji':
84
+ draw_emoji(
85
+ frame,
86
+ emoji=object_data['emoji'],
87
+ position=(x - object_data['size'] // 2, y - object_data['size'] // 2),
88
+ size=object_data['size']
89
+ )
90
+ elif object_type == 'text':
91
+ draw_text(
92
+ frame,
93
+ text=object_data['text'],
94
+ position=(x, y),
95
+ font_size=object_data['font_size'],
96
+ color=object_data['color'],
97
+ centered=True
98
+ )
99
+ elif object_type == 'circle':
100
+ draw_circle(
101
+ frame,
102
+ center=(x, y),
103
+ radius=object_data.get('radius', 30),
104
+ fill_color=object_data.get('color', (100, 100, 255))
105
+ )
106
+
107
+ frames.append(frame)
108
+
109
+ return frames
110
+
111
+
112
+ # Example usage
113
+ if __name__ == '__main__':
114
+ print("Creating shake GIF...")
115
+
116
+ builder = GIFBuilder(width=480, height=480, fps=24)
117
+
118
+ frames = create_shake_animation(
119
+ object_type='emoji',
120
+ object_data={'emoji': '😱', 'size': 100},
121
+ num_frames=30,
122
+ shake_intensity=20,
123
+ direction='both'
124
+ )
125
+
126
+ builder.add_frames(frames)
127
+ builder.save('shake_test.gif', num_colors=128)
@@ -0,0 +1,291 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Slide Animation - Slide elements in from edges with overshoot/bounce.
4
+
5
+ Creates smooth entrance and exit animations.
6
+ """
7
+
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ sys.path.append(str(Path(__file__).parent.parent))
12
+
13
+ from PIL import Image
14
+ from core.gif_builder import GIFBuilder
15
+ from core.frame_composer import create_blank_frame, draw_emoji_enhanced
16
+ from core.easing import interpolate
17
+
18
+
19
+ def create_slide_animation(
20
+ object_type: str = 'emoji',
21
+ object_data: dict | None = None,
22
+ num_frames: int = 30,
23
+ direction: str = 'left', # 'left', 'right', 'top', 'bottom'
24
+ slide_type: str = 'in', # 'in', 'out', 'across'
25
+ easing: str = 'ease_out',
26
+ overshoot: bool = False,
27
+ final_pos: tuple[int, int] | None = None,
28
+ frame_width: int = 480,
29
+ frame_height: int = 480,
30
+ bg_color: tuple[int, int, int] = (255, 255, 255)
31
+ ) -> list[Image.Image]:
32
+ """
33
+ Create slide animation.
34
+
35
+ Args:
36
+ object_type: 'emoji', 'text'
37
+ object_data: Object configuration
38
+ num_frames: Number of frames
39
+ direction: Direction of slide
40
+ slide_type: Type of slide (in/out/across)
41
+ easing: Easing function
42
+ overshoot: Add overshoot/bounce at end
43
+ final_pos: Final position (None = center)
44
+ frame_width: Frame width
45
+ frame_height: Frame height
46
+ bg_color: Background color
47
+
48
+ Returns:
49
+ List of frames
50
+ """
51
+ frames = []
52
+
53
+ # Default object data
54
+ if object_data is None:
55
+ if object_type == 'emoji':
56
+ object_data = {'emoji': '➡️', 'size': 100}
57
+
58
+ if final_pos is None:
59
+ final_pos = (frame_width // 2, frame_height // 2)
60
+
61
+ # Calculate start and end positions based on direction
62
+ size = object_data.get('size', 100) if object_type == 'emoji' else 100
63
+ margin = size
64
+
65
+ if direction == 'left':
66
+ start_pos = (-margin, final_pos[1])
67
+ end_pos = final_pos if slide_type == 'in' else (frame_width + margin, final_pos[1])
68
+ elif direction == 'right':
69
+ start_pos = (frame_width + margin, final_pos[1])
70
+ end_pos = final_pos if slide_type == 'in' else (-margin, final_pos[1])
71
+ elif direction == 'top':
72
+ start_pos = (final_pos[0], -margin)
73
+ end_pos = final_pos if slide_type == 'in' else (final_pos[0], frame_height + margin)
74
+ elif direction == 'bottom':
75
+ start_pos = (final_pos[0], frame_height + margin)
76
+ end_pos = final_pos if slide_type == 'in' else (final_pos[0], -margin)
77
+ else:
78
+ start_pos = (-margin, final_pos[1])
79
+ end_pos = final_pos
80
+
81
+ # For 'out' type, swap start and end
82
+ if slide_type == 'out':
83
+ start_pos, end_pos = final_pos, end_pos
84
+ elif slide_type == 'across':
85
+ # Slide all the way across
86
+ if direction == 'left':
87
+ start_pos = (-margin, final_pos[1])
88
+ end_pos = (frame_width + margin, final_pos[1])
89
+ elif direction == 'right':
90
+ start_pos = (frame_width + margin, final_pos[1])
91
+ end_pos = (-margin, final_pos[1])
92
+ elif direction == 'top':
93
+ start_pos = (final_pos[0], -margin)
94
+ end_pos = (final_pos[0], frame_height + margin)
95
+ elif direction == 'bottom':
96
+ start_pos = (final_pos[0], frame_height + margin)
97
+ end_pos = (final_pos[0], -margin)
98
+
99
+ # Use overshoot easing if requested
100
+ if overshoot and slide_type == 'in':
101
+ easing = 'back_out'
102
+
103
+ for i in range(num_frames):
104
+ t = i / (num_frames - 1) if num_frames > 1 else 0
105
+ frame = create_blank_frame(frame_width, frame_height, bg_color)
106
+
107
+ # Calculate current position
108
+ x = int(interpolate(start_pos[0], end_pos[0], t, easing))
109
+ y = int(interpolate(start_pos[1], end_pos[1], t, easing))
110
+
111
+ # Draw object
112
+ if object_type == 'emoji':
113
+ size = object_data['size']
114
+ draw_emoji_enhanced(
115
+ frame,
116
+ emoji=object_data['emoji'],
117
+ position=(x - size // 2, y - size // 2),
118
+ size=size,
119
+ shadow=object_data.get('shadow', True)
120
+ )
121
+
122
+ elif object_type == 'text':
123
+ from core.typography import draw_text_with_outline
124
+ draw_text_with_outline(
125
+ frame,
126
+ text=object_data.get('text', 'SLIDE'),
127
+ position=(x, y),
128
+ font_size=object_data.get('font_size', 50),
129
+ text_color=object_data.get('text_color', (0, 0, 0)),
130
+ outline_color=object_data.get('outline_color', (255, 255, 255)),
131
+ outline_width=3,
132
+ centered=True
133
+ )
134
+
135
+ frames.append(frame)
136
+
137
+ return frames
138
+
139
+
140
+ def create_multi_slide(
141
+ objects: list[dict],
142
+ num_frames: int = 30,
143
+ stagger_delay: int = 3,
144
+ frame_width: int = 480,
145
+ frame_height: int = 480,
146
+ bg_color: tuple[int, int, int] = (255, 255, 255)
147
+ ) -> list[Image.Image]:
148
+ """
149
+ Create animation with multiple objects sliding in sequence.
150
+
151
+ Args:
152
+ objects: List of object configs with 'type', 'data', 'direction', 'final_pos'
153
+ num_frames: Number of frames
154
+ stagger_delay: Frames between each object starting
155
+ frame_width: Frame width
156
+ frame_height: Frame height
157
+ bg_color: Background color
158
+
159
+ Returns:
160
+ List of frames
161
+ """
162
+ frames = []
163
+
164
+ for i in range(num_frames):
165
+ frame = create_blank_frame(frame_width, frame_height, bg_color)
166
+
167
+ for idx, obj in enumerate(objects):
168
+ # Calculate when this object starts moving
169
+ start_frame = idx * stagger_delay
170
+ if i < start_frame:
171
+ continue # Object hasn't started yet
172
+
173
+ # Calculate progress for this object
174
+ obj_frame = i - start_frame
175
+ obj_duration = num_frames - start_frame
176
+ if obj_duration <= 0:
177
+ continue
178
+
179
+ t = obj_frame / obj_duration
180
+
181
+ # Get object properties
182
+ obj_type = obj.get('type', 'emoji')
183
+ obj_data = obj.get('data', {'emoji': '➡️', 'size': 80})
184
+ direction = obj.get('direction', 'left')
185
+ final_pos = obj.get('final_pos', (frame_width // 2, frame_height // 2))
186
+ easing = obj.get('easing', 'back_out')
187
+
188
+ # Calculate position
189
+ size = obj_data.get('size', 80)
190
+ margin = size
191
+
192
+ if direction == 'left':
193
+ start_x = -margin
194
+ end_x = final_pos[0]
195
+ y = final_pos[1]
196
+ elif direction == 'right':
197
+ start_x = frame_width + margin
198
+ end_x = final_pos[0]
199
+ y = final_pos[1]
200
+ elif direction == 'top':
201
+ x = final_pos[0]
202
+ start_y = -margin
203
+ end_y = final_pos[1]
204
+ elif direction == 'bottom':
205
+ x = final_pos[0]
206
+ start_y = frame_height + margin
207
+ end_y = final_pos[1]
208
+ else:
209
+ start_x = -margin
210
+ end_x = final_pos[0]
211
+ y = final_pos[1]
212
+
213
+ # Interpolate position
214
+ if direction in ['left', 'right']:
215
+ x = int(interpolate(start_x, end_x, t, easing))
216
+ else:
217
+ y = int(interpolate(start_y, end_y, t, easing))
218
+
219
+ # Draw object
220
+ if obj_type == 'emoji':
221
+ draw_emoji_enhanced(
222
+ frame,
223
+ emoji=obj_data['emoji'],
224
+ position=(x - size // 2, y - size // 2),
225
+ size=size,
226
+ shadow=False
227
+ )
228
+
229
+ frames.append(frame)
230
+
231
+ return frames
232
+
233
+
234
+ # Example usage
235
+ if __name__ == '__main__':
236
+ print("Creating slide animations...")
237
+
238
+ builder = GIFBuilder(width=480, height=480, fps=20)
239
+
240
+ # Example 1: Slide in from left with overshoot
241
+ frames = create_slide_animation(
242
+ object_type='emoji',
243
+ object_data={'emoji': '➡️', 'size': 100},
244
+ num_frames=30,
245
+ direction='left',
246
+ slide_type='in',
247
+ overshoot=True
248
+ )
249
+ builder.add_frames(frames)
250
+ builder.save('slide_in_left.gif', num_colors=128)
251
+
252
+ # Example 2: Slide across
253
+ builder.clear()
254
+ frames = create_slide_animation(
255
+ object_type='emoji',
256
+ object_data={'emoji': '🚀', 'size': 80},
257
+ num_frames=40,
258
+ direction='left',
259
+ slide_type='across',
260
+ easing='ease_in_out'
261
+ )
262
+ builder.add_frames(frames)
263
+ builder.save('slide_across.gif', num_colors=128)
264
+
265
+ # Example 3: Multiple objects sliding in
266
+ builder.clear()
267
+ objects = [
268
+ {
269
+ 'type': 'emoji',
270
+ 'data': {'emoji': '🎯', 'size': 60},
271
+ 'direction': 'left',
272
+ 'final_pos': (120, 240)
273
+ },
274
+ {
275
+ 'type': 'emoji',
276
+ 'data': {'emoji': '🎪', 'size': 60},
277
+ 'direction': 'right',
278
+ 'final_pos': (240, 240)
279
+ },
280
+ {
281
+ 'type': 'emoji',
282
+ 'data': {'emoji': '🎨', 'size': 60},
283
+ 'direction': 'top',
284
+ 'final_pos': (360, 240)
285
+ }
286
+ ]
287
+ frames = create_multi_slide(objects, num_frames=50, stagger_delay=5)
288
+ builder.add_frames(frames)
289
+ builder.save('slide_multi.gif', num_colors=128)
290
+
291
+ print("Created slide animations!")