@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,269 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Spin Animation - Rotate objects continuously or with variation.
4
+
5
+ Creates spinning, rotating, and wobbling 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_spin_animation(
21
+ object_type: str = 'emoji',
22
+ object_data: dict | None = None,
23
+ num_frames: int = 30,
24
+ rotation_type: str = 'clockwise', # 'clockwise', 'counterclockwise', 'wobble', 'pendulum'
25
+ full_rotations: float = 1.0,
26
+ easing: str = 'linear',
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 spinning/rotating animation.
34
+
35
+ Args:
36
+ object_type: 'emoji', 'image', 'text'
37
+ object_data: Object configuration
38
+ num_frames: Number of frames
39
+ rotation_type: Type of rotation
40
+ full_rotations: Number of complete 360° rotations
41
+ easing: Easing function for rotation speed
42
+ center_pos: Center position for rotation
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
+
57
+ for i in range(num_frames):
58
+ frame = create_blank_frame(frame_width, frame_height, bg_color)
59
+ t = i / (num_frames - 1) if num_frames > 1 else 0
60
+
61
+ # Calculate rotation angle
62
+ if rotation_type == 'clockwise':
63
+ angle = interpolate(0, 360 * full_rotations, t, easing)
64
+ elif rotation_type == 'counterclockwise':
65
+ angle = interpolate(0, -360 * full_rotations, t, easing)
66
+ elif rotation_type == 'wobble':
67
+ # Back and forth rotation
68
+ angle = math.sin(t * full_rotations * 2 * math.pi) * 45
69
+ elif rotation_type == 'pendulum':
70
+ # Smooth pendulum swing
71
+ angle = math.sin(t * full_rotations * 2 * math.pi) * 90
72
+ else:
73
+ angle = interpolate(0, 360 * full_rotations, t, easing)
74
+
75
+ # Create object on transparent background to rotate
76
+ if object_type == 'emoji':
77
+ # For emoji, we need to create a larger canvas to avoid clipping during rotation
78
+ emoji_size = object_data['size']
79
+ canvas_size = int(emoji_size * 1.5)
80
+ emoji_canvas = Image.new('RGBA', (canvas_size, canvas_size), (0, 0, 0, 0))
81
+
82
+ # Draw emoji in center of canvas
83
+ from core.frame_composer import draw_emoji_enhanced
84
+ draw_emoji_enhanced(
85
+ emoji_canvas,
86
+ emoji=object_data['emoji'],
87
+ position=(canvas_size // 2 - emoji_size // 2, canvas_size // 2 - emoji_size // 2),
88
+ size=emoji_size,
89
+ shadow=False
90
+ )
91
+
92
+ # Rotate the canvas
93
+ rotated = emoji_canvas.rotate(angle, resample=Image.BICUBIC, expand=False)
94
+
95
+ # Paste onto frame
96
+ paste_x = center_pos[0] - canvas_size // 2
97
+ paste_y = center_pos[1] - canvas_size // 2
98
+ frame.paste(rotated, (paste_x, paste_y), rotated)
99
+
100
+ elif object_type == 'text':
101
+ from core.typography import draw_text_with_outline
102
+ # Similar approach - create canvas, draw text, rotate
103
+ text = object_data.get('text', 'SPIN!')
104
+ font_size = object_data.get('font_size', 50)
105
+
106
+ canvas_size = max(frame_width, frame_height)
107
+ text_canvas = Image.new('RGBA', (canvas_size, canvas_size), (0, 0, 0, 0))
108
+
109
+ # Draw text
110
+ text_canvas_rgb = text_canvas.convert('RGB')
111
+ text_canvas_rgb.paste(bg_color, (0, 0, canvas_size, canvas_size))
112
+ draw_text_with_outline(
113
+ text_canvas_rgb,
114
+ text,
115
+ position=(canvas_size // 2, canvas_size // 2),
116
+ font_size=font_size,
117
+ text_color=object_data.get('text_color', (0, 0, 0)),
118
+ outline_color=object_data.get('outline_color', (255, 255, 255)),
119
+ outline_width=3,
120
+ centered=True
121
+ )
122
+
123
+ # Convert back to RGBA for rotation
124
+ text_canvas = text_canvas_rgb.convert('RGBA')
125
+
126
+ # Make background transparent
127
+ data = text_canvas.getdata()
128
+ new_data = []
129
+ for item in data:
130
+ if item[:3] == bg_color:
131
+ new_data.append((255, 255, 255, 0))
132
+ else:
133
+ new_data.append(item)
134
+ text_canvas.putdata(new_data)
135
+
136
+ # Rotate
137
+ rotated = text_canvas.rotate(angle, resample=Image.BICUBIC, expand=False)
138
+
139
+ # Composite onto frame
140
+ frame_rgba = frame.convert('RGBA')
141
+ frame_rgba = Image.alpha_composite(frame_rgba, rotated)
142
+ frame = frame_rgba.convert('RGB')
143
+
144
+ frames.append(frame)
145
+
146
+ return frames
147
+
148
+
149
+ def create_loading_spinner(
150
+ num_frames: int = 20,
151
+ spinner_type: str = 'dots', # 'dots', 'arc', 'emoji'
152
+ size: int = 100,
153
+ color: tuple[int, int, int] = (100, 150, 255),
154
+ frame_width: int = 128,
155
+ frame_height: int = 128,
156
+ bg_color: tuple[int, int, int] = (255, 255, 255)
157
+ ) -> list[Image.Image]:
158
+ """
159
+ Create a loading spinner animation.
160
+
161
+ Args:
162
+ num_frames: Number of frames
163
+ spinner_type: Type of spinner
164
+ size: Spinner size
165
+ color: Spinner color
166
+ frame_width: Frame width
167
+ frame_height: Frame height
168
+ bg_color: Background color
169
+
170
+ Returns:
171
+ List of frames
172
+ """
173
+ from PIL import ImageDraw
174
+ frames = []
175
+ center = (frame_width // 2, frame_height // 2)
176
+
177
+ for i in range(num_frames):
178
+ frame = create_blank_frame(frame_width, frame_height, bg_color)
179
+ draw = ImageDraw.Draw(frame)
180
+
181
+ angle_offset = (i / num_frames) * 360
182
+
183
+ if spinner_type == 'dots':
184
+ # Circular dots
185
+ num_dots = 8
186
+ for j in range(num_dots):
187
+ angle = (j / num_dots * 360 + angle_offset) * math.pi / 180
188
+ x = center[0] + size * 0.4 * math.cos(angle)
189
+ y = center[1] + size * 0.4 * math.sin(angle)
190
+
191
+ # Fade based on position
192
+ alpha = 1.0 - (j / num_dots)
193
+ dot_color = tuple(int(c * alpha) for c in color)
194
+ dot_radius = int(size * 0.1)
195
+
196
+ draw.ellipse(
197
+ [x - dot_radius, y - dot_radius, x + dot_radius, y + dot_radius],
198
+ fill=dot_color
199
+ )
200
+
201
+ elif spinner_type == 'arc':
202
+ # Rotating arc
203
+ start_angle = angle_offset
204
+ end_angle = angle_offset + 270
205
+ arc_width = int(size * 0.15)
206
+
207
+ bbox = [
208
+ center[0] - size // 2,
209
+ center[1] - size // 2,
210
+ center[0] + size // 2,
211
+ center[1] + size // 2
212
+ ]
213
+ draw.arc(bbox, start_angle, end_angle, fill=color, width=arc_width)
214
+
215
+ elif spinner_type == 'emoji':
216
+ # Rotating emoji spinner
217
+ angle = angle_offset
218
+ emoji_canvas = Image.new('RGBA', (frame_width, frame_height), (0, 0, 0, 0))
219
+ draw_emoji_enhanced(
220
+ emoji_canvas,
221
+ emoji='⏳',
222
+ position=(center[0] - size // 2, center[1] - size // 2),
223
+ size=size,
224
+ shadow=False
225
+ )
226
+ rotated = emoji_canvas.rotate(angle, center=center, resample=Image.BICUBIC)
227
+ frame.paste(rotated, (0, 0), rotated)
228
+
229
+ frames.append(frame)
230
+
231
+ return frames
232
+
233
+
234
+ # Example usage
235
+ if __name__ == '__main__':
236
+ print("Creating spin animations...")
237
+
238
+ builder = GIFBuilder(width=480, height=480, fps=20)
239
+
240
+ # Example 1: Clockwise spin
241
+ frames = create_spin_animation(
242
+ object_type='emoji',
243
+ object_data={'emoji': '🔄', 'size': 100},
244
+ num_frames=30,
245
+ rotation_type='clockwise',
246
+ full_rotations=2
247
+ )
248
+ builder.add_frames(frames)
249
+ builder.save('spin_clockwise.gif', num_colors=128)
250
+
251
+ # Example 2: Wobble
252
+ builder.clear()
253
+ frames = create_spin_animation(
254
+ object_type='emoji',
255
+ object_data={'emoji': '🎯', 'size': 100},
256
+ num_frames=30,
257
+ rotation_type='wobble',
258
+ full_rotations=3
259
+ )
260
+ builder.add_frames(frames)
261
+ builder.save('spin_wobble.gif', num_colors=128)
262
+
263
+ # Example 3: Loading spinner
264
+ builder = GIFBuilder(width=128, height=128, fps=15)
265
+ frames = create_loading_spinner(num_frames=20, spinner_type='dots')
266
+ builder.add_frames(frames)
267
+ builder.save('loading_spinner.gif', num_colors=64, optimize_for_emoji=True)
268
+
269
+ print("Created spin animations!")
@@ -0,0 +1,300 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Wiggle Animation - Smooth, organic wobbling and jiggling motions.
4
+
5
+ Creates playful, elastic movements that are smoother than shake.
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
17
+ from core.easing import interpolate
18
+
19
+
20
+ def create_wiggle_animation(
21
+ object_type: str = 'emoji',
22
+ object_data: dict | None = None,
23
+ num_frames: int = 30,
24
+ wiggle_type: str = 'jello', # 'jello', 'wave', 'bounce', 'sway'
25
+ intensity: float = 1.0,
26
+ cycles: 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 wiggle/wobble animation.
34
+
35
+ Args:
36
+ object_type: 'emoji', 'text'
37
+ object_data: Object configuration
38
+ num_frames: Number of frames
39
+ wiggle_type: Type of wiggle motion
40
+ intensity: Wiggle intensity multiplier
41
+ cycles: Number of wiggle cycles
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
+
57
+ for i in range(num_frames):
58
+ t = i / (num_frames - 1) if num_frames > 1 else 0
59
+ frame = create_blank_frame(frame_width, frame_height, bg_color)
60
+
61
+ # Calculate wiggle transformations
62
+ offset_x = 0
63
+ offset_y = 0
64
+ rotation = 0
65
+ scale_x = 1.0
66
+ scale_y = 1.0
67
+
68
+ if wiggle_type == 'jello':
69
+ # Jello wobble - multiple frequencies
70
+ freq1 = cycles * 2 * math.pi
71
+ freq2 = cycles * 3 * math.pi
72
+ freq3 = cycles * 5 * math.pi
73
+
74
+ decay = 1.0 - t if cycles < 1.5 else 1.0 # Decay for single wiggles
75
+
76
+ offset_x = (
77
+ math.sin(freq1 * t) * 15 +
78
+ math.sin(freq2 * t) * 8 +
79
+ math.sin(freq3 * t) * 3
80
+ ) * intensity * decay
81
+
82
+ rotation = (
83
+ math.sin(freq1 * t) * 10 +
84
+ math.cos(freq2 * t) * 5
85
+ ) * intensity * decay
86
+
87
+ # Squash and stretch
88
+ scale_y = 1.0 + math.sin(freq1 * t) * 0.1 * intensity * decay
89
+ scale_x = 1.0 / scale_y # Preserve volume
90
+
91
+ elif wiggle_type == 'wave':
92
+ # Wave motion
93
+ freq = cycles * 2 * math.pi
94
+ offset_y = math.sin(freq * t) * 20 * intensity
95
+ rotation = math.sin(freq * t + math.pi / 4) * 8 * intensity
96
+
97
+ elif wiggle_type == 'bounce':
98
+ # Bouncy wiggle
99
+ freq = cycles * 2 * math.pi
100
+ bounce = abs(math.sin(freq * t))
101
+
102
+ scale_y = 1.0 + bounce * 0.2 * intensity
103
+ scale_x = 1.0 - bounce * 0.1 * intensity
104
+ offset_y = -bounce * 10 * intensity
105
+
106
+ elif wiggle_type == 'sway':
107
+ # Gentle sway back and forth
108
+ freq = cycles * 2 * math.pi
109
+ offset_x = math.sin(freq * t) * 25 * intensity
110
+ rotation = math.sin(freq * t) * 12 * intensity
111
+
112
+ # Subtle scale change
113
+ scale = 1.0 + math.sin(freq * t) * 0.05 * intensity
114
+ scale_x = scale
115
+ scale_y = scale
116
+
117
+ elif wiggle_type == 'tail_wag':
118
+ # Like a wagging tail - base stays, tip moves
119
+ freq = cycles * 2 * math.pi
120
+ wag = math.sin(freq * t) * intensity
121
+
122
+ # Rotation focused at one end
123
+ rotation = wag * 20
124
+ offset_x = wag * 15
125
+
126
+ # Apply transformations
127
+ if object_type == 'emoji':
128
+ size = object_data['size']
129
+ size_x = int(size * scale_x)
130
+ size_y = int(size * scale_y)
131
+
132
+ # For non-uniform scaling or rotation, we need to use PIL transforms
133
+ if abs(scale_x - scale_y) > 0.01 or abs(rotation) > 0.1:
134
+ # Create emoji on transparent canvas
135
+ canvas_size = int(size * 2)
136
+ emoji_canvas = Image.new('RGBA', (canvas_size, canvas_size), (0, 0, 0, 0))
137
+
138
+ # Draw emoji
139
+ draw_emoji_enhanced(
140
+ emoji_canvas,
141
+ emoji=object_data['emoji'],
142
+ position=(canvas_size // 2 - size // 2, canvas_size // 2 - size // 2),
143
+ size=size,
144
+ shadow=False
145
+ )
146
+
147
+ # Scale
148
+ if abs(scale_x - scale_y) > 0.01:
149
+ new_size = (int(canvas_size * scale_x), int(canvas_size * scale_y))
150
+ emoji_canvas = emoji_canvas.resize(new_size, Image.LANCZOS)
151
+ canvas_size_x, canvas_size_y = new_size
152
+ else:
153
+ canvas_size_x = canvas_size_y = canvas_size
154
+
155
+ # Rotate
156
+ if abs(rotation) > 0.1:
157
+ emoji_canvas = emoji_canvas.rotate(
158
+ rotation,
159
+ resample=Image.BICUBIC,
160
+ expand=False
161
+ )
162
+
163
+ # Position with offset
164
+ paste_x = int(center_pos[0] - canvas_size_x // 2 + offset_x)
165
+ paste_y = int(center_pos[1] - canvas_size_y // 2 + offset_y)
166
+
167
+ frame_rgba = frame.convert('RGBA')
168
+ frame_rgba.paste(emoji_canvas, (paste_x, paste_y), emoji_canvas)
169
+ frame = frame_rgba.convert('RGB')
170
+ else:
171
+ # Simple case - just offset
172
+ pos_x = int(center_pos[0] - size // 2 + offset_x)
173
+ pos_y = int(center_pos[1] - size // 2 + offset_y)
174
+ draw_emoji_enhanced(
175
+ frame,
176
+ emoji=object_data['emoji'],
177
+ position=(pos_x, pos_y),
178
+ size=size,
179
+ shadow=object_data.get('shadow', True)
180
+ )
181
+
182
+ elif object_type == 'text':
183
+ from core.typography import draw_text_with_outline
184
+
185
+ # Create text on canvas for transformation
186
+ canvas_size = max(frame_width, frame_height)
187
+ text_canvas = Image.new('RGBA', (canvas_size, canvas_size), (0, 0, 0, 0))
188
+
189
+ # Convert to RGB for drawing
190
+ text_canvas_rgb = text_canvas.convert('RGB')
191
+ text_canvas_rgb.paste(bg_color, (0, 0, canvas_size, canvas_size))
192
+
193
+ draw_text_with_outline(
194
+ text_canvas_rgb,
195
+ text=object_data.get('text', 'WIGGLE'),
196
+ position=(canvas_size // 2, canvas_size // 2),
197
+ font_size=object_data.get('font_size', 50),
198
+ text_color=object_data.get('text_color', (0, 0, 0)),
199
+ outline_color=object_data.get('outline_color', (255, 255, 255)),
200
+ outline_width=3,
201
+ centered=True
202
+ )
203
+
204
+ # Make transparent
205
+ text_canvas = text_canvas_rgb.convert('RGBA')
206
+ data = text_canvas.getdata()
207
+ new_data = []
208
+ for item in data:
209
+ if item[:3] == bg_color:
210
+ new_data.append((255, 255, 255, 0))
211
+ else:
212
+ new_data.append(item)
213
+ text_canvas.putdata(new_data)
214
+
215
+ # Apply rotation
216
+ if abs(rotation) > 0.1:
217
+ text_canvas = text_canvas.rotate(rotation, center=(canvas_size // 2, canvas_size // 2), resample=Image.BICUBIC)
218
+
219
+ # Crop to frame with offset
220
+ left = (canvas_size - frame_width) // 2 - int(offset_x)
221
+ top = (canvas_size - frame_height) // 2 - int(offset_y)
222
+ text_cropped = text_canvas.crop((left, top, left + frame_width, top + frame_height))
223
+
224
+ frame_rgba = frame.convert('RGBA')
225
+ frame = Image.alpha_composite(frame_rgba, text_cropped)
226
+ frame = frame.convert('RGB')
227
+
228
+ frames.append(frame)
229
+
230
+ return frames
231
+
232
+
233
+ def create_excited_wiggle(
234
+ emoji: str = '🎉',
235
+ num_frames: int = 20,
236
+ frame_size: int = 128
237
+ ) -> list[Image.Image]:
238
+ """
239
+ Create excited wiggle for emoji GIFs.
240
+
241
+ Args:
242
+ emoji: Emoji to wiggle
243
+ num_frames: Number of frames
244
+ frame_size: Frame size (square)
245
+
246
+ Returns:
247
+ List of frames
248
+ """
249
+ return create_wiggle_animation(
250
+ object_type='emoji',
251
+ object_data={'emoji': emoji, 'size': 80, 'shadow': False},
252
+ num_frames=num_frames,
253
+ wiggle_type='jello',
254
+ intensity=0.8,
255
+ cycles=2,
256
+ center_pos=(frame_size // 2, frame_size // 2),
257
+ frame_width=frame_size,
258
+ frame_height=frame_size,
259
+ bg_color=(255, 255, 255)
260
+ )
261
+
262
+
263
+ # Example usage
264
+ if __name__ == '__main__':
265
+ print("Creating wiggle animations...")
266
+
267
+ builder = GIFBuilder(width=480, height=480, fps=20)
268
+
269
+ # Example 1: Jello wiggle
270
+ frames = create_wiggle_animation(
271
+ object_type='emoji',
272
+ object_data={'emoji': '🎈', 'size': 100},
273
+ num_frames=40,
274
+ wiggle_type='jello',
275
+ intensity=1.0,
276
+ cycles=2
277
+ )
278
+ builder.add_frames(frames)
279
+ builder.save('wiggle_jello.gif', num_colors=128)
280
+
281
+ # Example 2: Wave
282
+ builder.clear()
283
+ frames = create_wiggle_animation(
284
+ object_type='emoji',
285
+ object_data={'emoji': '🌊', 'size': 100},
286
+ num_frames=30,
287
+ wiggle_type='wave',
288
+ intensity=1.2,
289
+ cycles=3
290
+ )
291
+ builder.add_frames(frames)
292
+ builder.save('wiggle_wave.gif', num_colors=128)
293
+
294
+ # Example 3: Excited wiggle (emoji size)
295
+ builder = GIFBuilder(width=128, height=128, fps=15)
296
+ frames = create_excited_wiggle(emoji='🎉', num_frames=20)
297
+ builder.add_frames(frames)
298
+ builder.save('wiggle_excited.gif', num_colors=48, optimize_for_emoji=True)
299
+
300
+ print("Created wiggle animations!")