@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,329 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Morph Animation - Transform between different emojis or shapes.
4
+
5
+ Creates smooth transitions and transformations.
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
+ import numpy as np
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_morph_animation(
21
+ object1_data: dict,
22
+ object2_data: dict,
23
+ num_frames: int = 30,
24
+ morph_type: str = 'crossfade', # 'crossfade', 'scale', 'spin_morph'
25
+ easing: str = 'ease_in_out',
26
+ object_type: str = 'emoji',
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 morphing animation between two objects.
34
+
35
+ Args:
36
+ object1_data: First object configuration
37
+ object2_data: Second object configuration
38
+ num_frames: Number of frames
39
+ morph_type: Type of morph effect
40
+ easing: Easing function
41
+ object_type: Type of objects
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
+ for i in range(num_frames):
53
+ t = i / (num_frames - 1) if num_frames > 1 else 0
54
+ frame = create_blank_frame(frame_width, frame_height, bg_color)
55
+
56
+ if morph_type == 'crossfade':
57
+ # Simple crossfade between two objects
58
+ opacity1 = interpolate(1, 0, t, easing)
59
+ opacity2 = interpolate(0, 1, t, easing)
60
+
61
+ if object_type == 'emoji':
62
+ # Create first emoji
63
+ emoji1_canvas = Image.new('RGBA', (frame_width, frame_height), (0, 0, 0, 0))
64
+ size1 = object1_data['size']
65
+ draw_emoji_enhanced(
66
+ emoji1_canvas,
67
+ emoji=object1_data['emoji'],
68
+ position=(center_pos[0] - size1 // 2, center_pos[1] - size1 // 2),
69
+ size=size1,
70
+ shadow=False
71
+ )
72
+
73
+ # Apply opacity
74
+ from templates.fade import apply_opacity
75
+ emoji1_canvas = apply_opacity(emoji1_canvas, opacity1)
76
+
77
+ # Create second emoji
78
+ emoji2_canvas = Image.new('RGBA', (frame_width, frame_height), (0, 0, 0, 0))
79
+ size2 = object2_data['size']
80
+ draw_emoji_enhanced(
81
+ emoji2_canvas,
82
+ emoji=object2_data['emoji'],
83
+ position=(center_pos[0] - size2 // 2, center_pos[1] - size2 // 2),
84
+ size=size2,
85
+ shadow=False
86
+ )
87
+
88
+ emoji2_canvas = apply_opacity(emoji2_canvas, opacity2)
89
+
90
+ # Composite both
91
+ frame_rgba = frame.convert('RGBA')
92
+ frame_rgba = Image.alpha_composite(frame_rgba, emoji1_canvas)
93
+ frame_rgba = Image.alpha_composite(frame_rgba, emoji2_canvas)
94
+ frame = frame_rgba.convert('RGB')
95
+
96
+ elif object_type == 'circle':
97
+ # Morph between two circles
98
+ radius1 = object1_data['radius']
99
+ radius2 = object2_data['radius']
100
+ color1 = object1_data['color']
101
+ color2 = object2_data['color']
102
+
103
+ # Interpolate properties
104
+ current_radius = int(interpolate(radius1, radius2, t, easing))
105
+ current_color = tuple(
106
+ int(interpolate(color1[i], color2[i], t, easing))
107
+ for i in range(3)
108
+ )
109
+
110
+ draw_circle(frame, center_pos, current_radius, fill_color=current_color)
111
+
112
+ elif morph_type == 'scale':
113
+ # First object scales down as second scales up
114
+ if object_type == 'emoji':
115
+ scale1 = interpolate(1.0, 0.0, t, easing)
116
+ scale2 = interpolate(0.0, 1.0, t, easing)
117
+
118
+ # Draw first emoji (shrinking)
119
+ if scale1 > 0.05:
120
+ size1 = int(object1_data['size'] * scale1)
121
+ size1 = max(12, size1)
122
+ emoji1_canvas = Image.new('RGBA', (frame_width, frame_height), (0, 0, 0, 0))
123
+ draw_emoji_enhanced(
124
+ emoji1_canvas,
125
+ emoji=object1_data['emoji'],
126
+ position=(center_pos[0] - size1 // 2, center_pos[1] - size1 // 2),
127
+ size=size1,
128
+ shadow=False
129
+ )
130
+
131
+ frame_rgba = frame.convert('RGBA')
132
+ frame = Image.alpha_composite(frame_rgba, emoji1_canvas)
133
+ frame = frame.convert('RGB')
134
+
135
+ # Draw second emoji (growing)
136
+ if scale2 > 0.05:
137
+ size2 = int(object2_data['size'] * scale2)
138
+ size2 = max(12, size2)
139
+ emoji2_canvas = Image.new('RGBA', (frame_width, frame_height), (0, 0, 0, 0))
140
+ draw_emoji_enhanced(
141
+ emoji2_canvas,
142
+ emoji=object2_data['emoji'],
143
+ position=(center_pos[0] - size2 // 2, center_pos[1] - size2 // 2),
144
+ size=size2,
145
+ shadow=False
146
+ )
147
+
148
+ frame_rgba = frame.convert('RGBA')
149
+ frame = Image.alpha_composite(frame_rgba, emoji2_canvas)
150
+ frame = frame.convert('RGB')
151
+
152
+ elif morph_type == 'spin_morph':
153
+ # Spin while morphing (flip-like)
154
+ import math
155
+
156
+ # Calculate rotation (0 to 180 degrees)
157
+ angle = interpolate(0, 180, t, easing)
158
+ scale_factor = abs(math.cos(math.radians(angle)))
159
+
160
+ # Determine which object to show
161
+ if angle < 90:
162
+ current_object = object1_data
163
+ else:
164
+ current_object = object2_data
165
+
166
+ # Skip when edge-on
167
+ if scale_factor < 0.05:
168
+ frames.append(frame)
169
+ continue
170
+
171
+ if object_type == 'emoji':
172
+ size = current_object['size']
173
+ canvas_size = size * 2
174
+ emoji_canvas = Image.new('RGBA', (canvas_size, canvas_size), (0, 0, 0, 0))
175
+
176
+ draw_emoji_enhanced(
177
+ emoji_canvas,
178
+ emoji=current_object['emoji'],
179
+ position=(canvas_size // 2 - size // 2, canvas_size // 2 - size // 2),
180
+ size=size,
181
+ shadow=False
182
+ )
183
+
184
+ # Scale horizontally for spin effect
185
+ new_width = max(1, int(canvas_size * scale_factor))
186
+ emoji_scaled = emoji_canvas.resize((new_width, canvas_size), Image.LANCZOS)
187
+
188
+ paste_x = center_pos[0] - new_width // 2
189
+ paste_y = center_pos[1] - canvas_size // 2
190
+
191
+ frame_rgba = frame.convert('RGBA')
192
+ frame_rgba.paste(emoji_scaled, (paste_x, paste_y), emoji_scaled)
193
+ frame = frame_rgba.convert('RGB')
194
+
195
+ frames.append(frame)
196
+
197
+ return frames
198
+
199
+
200
+ def create_reaction_morph(
201
+ emoji_start: str,
202
+ emoji_end: str,
203
+ num_frames: int = 20,
204
+ frame_size: int = 128
205
+ ) -> list[Image.Image]:
206
+ """
207
+ Create quick emoji reaction morph (for emoji GIFs).
208
+
209
+ Args:
210
+ emoji_start: Starting emoji
211
+ emoji_end: Ending emoji
212
+ num_frames: Number of frames
213
+ frame_size: Frame size (square)
214
+
215
+ Returns:
216
+ List of frames
217
+ """
218
+ return create_morph_animation(
219
+ object1_data={'emoji': emoji_start, 'size': 80},
220
+ object2_data={'emoji': emoji_end, 'size': 80},
221
+ num_frames=num_frames,
222
+ morph_type='crossfade',
223
+ easing='ease_in_out',
224
+ object_type='emoji',
225
+ center_pos=(frame_size // 2, frame_size // 2),
226
+ frame_width=frame_size,
227
+ frame_height=frame_size,
228
+ bg_color=(255, 255, 255)
229
+ )
230
+
231
+
232
+ def create_shape_morph(
233
+ shapes: list[dict],
234
+ num_frames: int = 60,
235
+ frames_per_shape: int = 20,
236
+ frame_width: int = 480,
237
+ frame_height: int = 480,
238
+ bg_color: tuple[int, int, int] = (255, 255, 255)
239
+ ) -> list[Image.Image]:
240
+ """
241
+ Morph through a sequence of shapes.
242
+
243
+ Args:
244
+ shapes: List of shape dicts with 'radius' and 'color'
245
+ num_frames: Total number of frames
246
+ frames_per_shape: Frames to spend on each morph
247
+ frame_width: Frame width
248
+ frame_height: Frame height
249
+ bg_color: Background color
250
+
251
+ Returns:
252
+ List of frames
253
+ """
254
+ frames = []
255
+ center = (frame_width // 2, frame_height // 2)
256
+
257
+ for i in range(num_frames):
258
+ # Determine which shapes we're morphing between
259
+ cycle_progress = (i % (frames_per_shape * len(shapes))) / frames_per_shape
260
+ shape_idx = int(cycle_progress) % len(shapes)
261
+ next_shape_idx = (shape_idx + 1) % len(shapes)
262
+
263
+ # Progress between these two shapes
264
+ t = cycle_progress - shape_idx
265
+
266
+ shape1 = shapes[shape_idx]
267
+ shape2 = shapes[next_shape_idx]
268
+
269
+ # Interpolate properties
270
+ radius = int(interpolate(shape1['radius'], shape2['radius'], t, 'ease_in_out'))
271
+ color = tuple(
272
+ int(interpolate(shape1['color'][j], shape2['color'][j], t, 'ease_in_out'))
273
+ for j in range(3)
274
+ )
275
+
276
+ # Draw frame
277
+ frame = create_blank_frame(frame_width, frame_height, bg_color)
278
+ draw_circle(frame, center, radius, fill_color=color)
279
+
280
+ frames.append(frame)
281
+
282
+ return frames
283
+
284
+
285
+ # Example usage
286
+ if __name__ == '__main__':
287
+ print("Creating morph animations...")
288
+
289
+ builder = GIFBuilder(width=480, height=480, fps=20)
290
+
291
+ # Example 1: Crossfade morph
292
+ frames = create_morph_animation(
293
+ object1_data={'emoji': '😊', 'size': 100},
294
+ object2_data={'emoji': '😂', 'size': 100},
295
+ num_frames=30,
296
+ morph_type='crossfade',
297
+ object_type='emoji'
298
+ )
299
+ builder.add_frames(frames)
300
+ builder.save('morph_crossfade.gif', num_colors=128)
301
+
302
+ # Example 2: Scale morph
303
+ builder.clear()
304
+ frames = create_morph_animation(
305
+ object1_data={'emoji': '🌙', 'size': 100},
306
+ object2_data={'emoji': '☀️', 'size': 100},
307
+ num_frames=40,
308
+ morph_type='scale',
309
+ object_type='emoji'
310
+ )
311
+ builder.add_frames(frames)
312
+ builder.save('morph_scale.gif', num_colors=128)
313
+
314
+ # Example 3: Shape morph cycle
315
+ builder.clear()
316
+ from core.color_palettes import get_palette
317
+ palette = get_palette('vibrant')
318
+
319
+ shapes = [
320
+ {'radius': 60, 'color': palette['primary']},
321
+ {'radius': 80, 'color': palette['secondary']},
322
+ {'radius': 50, 'color': palette['accent']},
323
+ {'radius': 70, 'color': palette['success']}
324
+ ]
325
+ frames = create_shape_morph(shapes, num_frames=80, frames_per_shape=20)
326
+ builder.add_frames(frames)
327
+ builder.save('morph_shapes.gif', num_colors=64)
328
+
329
+ print("Created morph animations!")
@@ -0,0 +1,293 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Move Animation - Move objects along paths with various motion types.
4
+
5
+ Provides flexible movement primitives for objects along linear, arc, or custom paths.
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 core.gif_builder import GIFBuilder
15
+ from core.frame_composer import create_blank_frame, draw_circle, draw_emoji_enhanced
16
+ from core.easing import interpolate, calculate_arc_motion
17
+
18
+
19
+ def create_move_animation(
20
+ object_type: str = 'emoji',
21
+ object_data: dict | None = None,
22
+ start_pos: tuple[int, int] = (50, 240),
23
+ end_pos: tuple[int, int] = (430, 240),
24
+ num_frames: int = 30,
25
+ motion_type: str = 'linear', # 'linear', 'arc', 'bezier', 'circle', 'wave'
26
+ easing: str = 'ease_out',
27
+ motion_params: dict | None = None,
28
+ frame_width: int = 480,
29
+ frame_height: int = 480,
30
+ bg_color: tuple[int, int, int] = (255, 255, 255)
31
+ ) -> list:
32
+ """
33
+ Create frames showing object moving along a path.
34
+
35
+ Args:
36
+ object_type: 'circle', 'emoji', or 'custom'
37
+ object_data: Data for the object
38
+ start_pos: Starting (x, y) position
39
+ end_pos: Ending (x, y) position
40
+ num_frames: Number of frames
41
+ motion_type: Type of motion path
42
+ easing: Easing function name
43
+ motion_params: Additional parameters for motion (e.g., {'arc_height': 100})
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 == 'circle':
56
+ object_data = {'radius': 30, 'color': (100, 150, 255)}
57
+ elif object_type == 'emoji':
58
+ object_data = {'emoji': '🚀', 'size': 60}
59
+
60
+ # Default motion params
61
+ if motion_params is None:
62
+ motion_params = {}
63
+
64
+ for i in range(num_frames):
65
+ frame = create_blank_frame(frame_width, frame_height, bg_color)
66
+
67
+ t = i / (num_frames - 1) if num_frames > 1 else 0
68
+
69
+ # Calculate position based on motion type
70
+ if motion_type == 'linear':
71
+ # Straight line with easing
72
+ x = interpolate(start_pos[0], end_pos[0], t, easing)
73
+ y = interpolate(start_pos[1], end_pos[1], t, easing)
74
+
75
+ elif motion_type == 'arc':
76
+ # Parabolic arc
77
+ arc_height = motion_params.get('arc_height', 100)
78
+ x, y = calculate_arc_motion(start_pos, end_pos, arc_height, t)
79
+
80
+ elif motion_type == 'circle':
81
+ # Circular motion around a center
82
+ center = motion_params.get('center', (frame_width // 2, frame_height // 2))
83
+ radius = motion_params.get('radius', 150)
84
+ start_angle = motion_params.get('start_angle', 0)
85
+ angle_range = motion_params.get('angle_range', 360) # Full circle
86
+
87
+ angle = start_angle + (angle_range * t)
88
+ angle_rad = math.radians(angle)
89
+
90
+ x = center[0] + radius * math.cos(angle_rad)
91
+ y = center[1] + radius * math.sin(angle_rad)
92
+
93
+ elif motion_type == 'wave':
94
+ # Move in straight line but add wave motion
95
+ wave_amplitude = motion_params.get('wave_amplitude', 50)
96
+ wave_frequency = motion_params.get('wave_frequency', 2)
97
+
98
+ # Base linear motion
99
+ base_x = interpolate(start_pos[0], end_pos[0], t, easing)
100
+ base_y = interpolate(start_pos[1], end_pos[1], t, easing)
101
+
102
+ # Add wave offset perpendicular to motion direction
103
+ dx = end_pos[0] - start_pos[0]
104
+ dy = end_pos[1] - start_pos[1]
105
+ length = math.sqrt(dx * dx + dy * dy)
106
+
107
+ if length > 0:
108
+ # Perpendicular direction
109
+ perp_x = -dy / length
110
+ perp_y = dx / length
111
+
112
+ # Wave offset
113
+ wave_offset = math.sin(t * wave_frequency * 2 * math.pi) * wave_amplitude
114
+
115
+ x = base_x + perp_x * wave_offset
116
+ y = base_y + perp_y * wave_offset
117
+ else:
118
+ x, y = base_x, base_y
119
+
120
+ elif motion_type == 'bezier':
121
+ # Quadratic bezier curve
122
+ control_point = motion_params.get('control_point', (
123
+ (start_pos[0] + end_pos[0]) // 2,
124
+ (start_pos[1] + end_pos[1]) // 2 - 100
125
+ ))
126
+
127
+ # Quadratic Bezier formula: B(t) = (1-t)²P0 + 2(1-t)tP1 + t²P2
128
+ x = (1 - t) ** 2 * start_pos[0] + 2 * (1 - t) * t * control_point[0] + t ** 2 * end_pos[0]
129
+ y = (1 - t) ** 2 * start_pos[1] + 2 * (1 - t) * t * control_point[1] + t ** 2 * end_pos[1]
130
+
131
+ else:
132
+ # Default to linear
133
+ x = interpolate(start_pos[0], end_pos[0], t, easing)
134
+ y = interpolate(start_pos[1], end_pos[1], t, easing)
135
+
136
+ # Draw object at calculated position
137
+ x, y = int(x), int(y)
138
+
139
+ if object_type == 'circle':
140
+ draw_circle(
141
+ frame,
142
+ center=(x, y),
143
+ radius=object_data['radius'],
144
+ fill_color=object_data['color']
145
+ )
146
+ elif object_type == 'emoji':
147
+ draw_emoji_enhanced(
148
+ frame,
149
+ emoji=object_data['emoji'],
150
+ position=(x - object_data['size'] // 2, y - object_data['size'] // 2),
151
+ size=object_data['size'],
152
+ shadow=object_data.get('shadow', True)
153
+ )
154
+
155
+ frames.append(frame)
156
+
157
+ return frames
158
+
159
+
160
+ def create_path_from_points(points: list[tuple[int, int]],
161
+ num_frames: int = 60,
162
+ easing: str = 'ease_in_out') -> list[tuple[int, int]]:
163
+ """
164
+ Create a smooth path through multiple points.
165
+
166
+ Args:
167
+ points: List of (x, y) waypoints
168
+ num_frames: Total number of frames
169
+ easing: Easing between points
170
+
171
+ Returns:
172
+ List of (x, y) positions for each frame
173
+ """
174
+ if len(points) < 2:
175
+ return points * num_frames
176
+
177
+ path = []
178
+ frames_per_segment = num_frames // (len(points) - 1)
179
+
180
+ for i in range(len(points) - 1):
181
+ start = points[i]
182
+ end = points[i + 1]
183
+
184
+ # Last segment gets remaining frames
185
+ if i == len(points) - 2:
186
+ segment_frames = num_frames - len(path)
187
+ else:
188
+ segment_frames = frames_per_segment
189
+
190
+ for j in range(segment_frames):
191
+ t = j / segment_frames if segment_frames > 0 else 0
192
+ x = interpolate(start[0], end[0], t, easing)
193
+ y = interpolate(start[1], end[1], t, easing)
194
+ path.append((int(x), int(y)))
195
+
196
+ return path
197
+
198
+
199
+ def apply_trail_effect(frames: list, trail_length: int = 5,
200
+ fade_alpha: float = 0.3) -> list:
201
+ """
202
+ Add motion trail effect to moving object.
203
+
204
+ Args:
205
+ frames: List of frames with moving object
206
+ trail_length: Number of previous frames to blend
207
+ fade_alpha: Opacity of trail frames
208
+
209
+ Returns:
210
+ List of frames with trail effect
211
+ """
212
+ from PIL import Image, ImageChops
213
+ import numpy as np
214
+
215
+ trailed_frames = []
216
+
217
+ for i, frame in enumerate(frames):
218
+ # Start with current frame
219
+ result = frame.copy()
220
+
221
+ # Blend previous frames
222
+ for j in range(1, min(trail_length + 1, i + 1)):
223
+ prev_frame = frames[i - j]
224
+
225
+ # Calculate fade
226
+ alpha = fade_alpha ** j
227
+
228
+ # Blend
229
+ result_array = np.array(result, dtype=np.float32)
230
+ prev_array = np.array(prev_frame, dtype=np.float32)
231
+
232
+ blended = result_array * (1 - alpha) + prev_array * alpha
233
+ result = Image.fromarray(blended.astype(np.uint8))
234
+
235
+ trailed_frames.append(result)
236
+
237
+ return trailed_frames
238
+
239
+
240
+ # Example usage
241
+ if __name__ == '__main__':
242
+ print("Creating movement examples...")
243
+
244
+ # Example 1: Linear movement
245
+ builder = GIFBuilder(width=480, height=480, fps=20)
246
+ frames = create_move_animation(
247
+ object_type='emoji',
248
+ object_data={'emoji': '🚀', 'size': 60},
249
+ start_pos=(50, 240),
250
+ end_pos=(430, 240),
251
+ num_frames=30,
252
+ motion_type='linear',
253
+ easing='ease_out'
254
+ )
255
+ builder.add_frames(frames)
256
+ builder.save('move_linear.gif', num_colors=128)
257
+
258
+ # Example 2: Arc movement
259
+ builder.clear()
260
+ frames = create_move_animation(
261
+ object_type='emoji',
262
+ object_data={'emoji': '⚽', 'size': 60},
263
+ start_pos=(50, 350),
264
+ end_pos=(430, 350),
265
+ num_frames=30,
266
+ motion_type='arc',
267
+ motion_params={'arc_height': 150},
268
+ easing='linear'
269
+ )
270
+ builder.add_frames(frames)
271
+ builder.save('move_arc.gif', num_colors=128)
272
+
273
+ # Example 3: Circular movement
274
+ builder.clear()
275
+ frames = create_move_animation(
276
+ object_type='emoji',
277
+ object_data={'emoji': '🌍', 'size': 50},
278
+ start_pos=(0, 0), # Ignored for circle
279
+ end_pos=(0, 0), # Ignored for circle
280
+ num_frames=40,
281
+ motion_type='circle',
282
+ motion_params={
283
+ 'center': (240, 240),
284
+ 'radius': 120,
285
+ 'start_angle': 0,
286
+ 'angle_range': 360
287
+ },
288
+ easing='linear'
289
+ )
290
+ builder.add_frames(frames)
291
+ builder.save('move_circle.gif', num_colors=128)
292
+
293
+ print("Created movement examples!")