@rosetears/aili-pi 0.1.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 (531) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -0
  3. package/THIRD_PARTY_NOTICES.md +64 -0
  4. package/extensions/index.ts +6 -0
  5. package/install.sh +5 -0
  6. package/manifests/adapter-evidence.json +45 -0
  7. package/manifests/capabilities.json +124 -0
  8. package/manifests/live-verification.json +26 -0
  9. package/manifests/provenance.json +71 -0
  10. package/manifests/roles.json +474 -0
  11. package/manifests/sbom.json +7797 -0
  12. package/manifests/skill-compatibility.json +8100 -0
  13. package/manifests/subagent-provenance.json +37 -0
  14. package/package.json +91 -0
  15. package/prompts/build.md +8 -0
  16. package/prompts/define.md +8 -0
  17. package/prompts/ideate.md +8 -0
  18. package/prompts/local-review.md +8 -0
  19. package/prompts/ship.md +8 -0
  20. package/roles/agent-evaluator.md +47 -0
  21. package/roles/ai-regression-scout.md +47 -0
  22. package/roles/browser-qa-runner.md +47 -0
  23. package/roles/code-reviewer.md +47 -0
  24. package/roles/code-scout.md +47 -0
  25. package/roles/convergence-reviewer.md +55 -0
  26. package/roles/doc-researcher.md +47 -0
  27. package/roles/e2e-artifact-runner.md +47 -0
  28. package/roles/implementer.md +47 -0
  29. package/roles/opensource-sanitizer.md +47 -0
  30. package/roles/plan-auditor.md +47 -0
  31. package/roles/pr-test-analyzer.md +47 -0
  32. package/roles/security-auditor.md +47 -0
  33. package/roles/silent-failure-reviewer.md +47 -0
  34. package/roles/spec-miner.md +47 -0
  35. package/roles/test-coverage-reviewer.md +47 -0
  36. package/roles/test-engineer.md +48 -0
  37. package/roles/web-performance-auditor.md +47 -0
  38. package/roles/web-researcher.md +47 -0
  39. package/scripts/apply-adapter-evidence.ts +73 -0
  40. package/scripts/bootstrap.sh +180 -0
  41. package/scripts/generate-provenance.ts +143 -0
  42. package/scripts/local-package-e2e.ts +51 -0
  43. package/scripts/sync-roles.ts +213 -0
  44. package/scripts/sync-skills.ts +356 -0
  45. package/scripts/validate-runtime.ts +11 -0
  46. package/skills/academic-paper-review/SKILL.md +81 -0
  47. package/skills/agents-md-initialization/SKILL.md +121 -0
  48. package/skills/agents-md-initialization/references/agents-template.md +83 -0
  49. package/skills/agents-md-initialization/references/agents_md.py +215 -0
  50. package/skills/ai-regression-scout/SKILL.md +24 -0
  51. package/skills/aili-delivery-flow/SKILL.md +125 -0
  52. package/skills/aili-delivery-flow/references/artifact-contracts.md +138 -0
  53. package/skills/aili-delivery-flow/references/backend-routing.md +40 -0
  54. package/skills/aili-delivery-flow/references/build-execution-loop.md +113 -0
  55. package/skills/aili-delivery-flow/references/build-goal-mode.md +3 -0
  56. package/skills/aili-delivery-flow/references/direct-vs-delegated-work.md +38 -0
  57. package/skills/aili-delivery-flow/references/implementation-packages.md +54 -0
  58. package/skills/aili-delivery-flow/references/lifecycle.md +127 -0
  59. package/skills/aili-delivery-flow/references/protocols/acceptance-test-plan.md +18 -0
  60. package/skills/aili-delivery-flow/references/protocols/alignment-questionnaire.md +10 -0
  61. package/skills/aili-delivery-flow/references/protocols/closeout-report.md +101 -0
  62. package/skills/aili-delivery-flow/references/protocols/compact-evidence-pack.md +46 -0
  63. package/skills/aili-delivery-flow/references/protocols/idea-brief.md +10 -0
  64. package/skills/aili-delivery-flow/references/protocols/implementation-package.md +53 -0
  65. package/skills/aili-delivery-flow/references/protocols/research-evidence-pack.md +19 -0
  66. package/skills/aili-delivery-flow/references/protocols/review-report.md +7 -0
  67. package/skills/aili-delivery-flow/references/protocols/spec-draft.md +12 -0
  68. package/skills/aili-delivery-flow/references/protocols/subagent-result.md +60 -0
  69. package/skills/aili-delivery-flow/references/protocols/subagent-task-packet.md +29 -0
  70. package/skills/aili-delivery-flow/references/protocols/worktree-context.md +109 -0
  71. package/skills/aili-delivery-flow/references/questionnaire-policy.md +62 -0
  72. package/skills/aili-delivery-flow/references/review-repair-loop.md +16 -0
  73. package/skills/aili-delivery-flow/references/test-document-policy.md +35 -0
  74. package/skills/android-native-dev/SKILL.md +722 -0
  75. package/skills/android-native-dev/references/accessibility.md +209 -0
  76. package/skills/android-native-dev/references/adaptive-screens.md +231 -0
  77. package/skills/android-native-dev/references/design-style-guide.md +365 -0
  78. package/skills/android-native-dev/references/functional-requirements.md +229 -0
  79. package/skills/android-native-dev/references/motion-system.md +203 -0
  80. package/skills/android-native-dev/references/performance-stability.md +223 -0
  81. package/skills/android-native-dev/references/privacy-security.md +244 -0
  82. package/skills/android-native-dev/references/testing.md +554 -0
  83. package/skills/android-native-dev/references/visual-design.md +246 -0
  84. package/skills/api-and-interface-design/SKILL.md +318 -0
  85. package/skills/browser-qa/SKILL.md +32 -0
  86. package/skills/browser-testing-with-devtools/SKILL.md +323 -0
  87. package/skills/build-failure-repair/SKILL.md +49 -0
  88. package/skills/chart-visualization/SKILL.md +73 -0
  89. package/skills/ci-cd-and-automation/SKILL.md +353 -0
  90. package/skills/code-review-and-quality/SKILL.md +375 -0
  91. package/skills/code-review-quality-gates/SKILL.md +132 -0
  92. package/skills/code-simplification/SKILL.md +371 -0
  93. package/skills/comment-accuracy-review/SKILL.md +37 -0
  94. package/skills/consulting-analysis/SKILL.md +69 -0
  95. package/skills/context-engineering/SKILL.md +375 -0
  96. package/skills/coverage-review/SKILL.md +24 -0
  97. package/skills/data-analysis/SKILL.md +74 -0
  98. package/skills/deprecation-and-migration/SKILL.md +222 -0
  99. package/skills/documentation-and-adrs/SKILL.md +330 -0
  100. package/skills/e2e-artifact-handling/SKILL.md +30 -0
  101. package/skills/evidence-scoped-retrospective/SKILL.md +156 -0
  102. package/skills/explain-by-allegory/SKILL.md +99 -0
  103. package/skills/flutter-dev/SKILL.md +162 -0
  104. package/skills/flutter-dev/references/animations.md +497 -0
  105. package/skills/flutter-dev/references/bloc-state.md +281 -0
  106. package/skills/flutter-dev/references/forms.md +656 -0
  107. package/skills/flutter-dev/references/gorouter-navigation.md +257 -0
  108. package/skills/flutter-dev/references/localization.md +510 -0
  109. package/skills/flutter-dev/references/networking.md +566 -0
  110. package/skills/flutter-dev/references/performance.md +305 -0
  111. package/skills/flutter-dev/references/platform-specific.md +417 -0
  112. package/skills/flutter-dev/references/project-structure.md +273 -0
  113. package/skills/flutter-dev/references/riverpod-state.md +232 -0
  114. package/skills/flutter-dev/references/testing.md +364 -0
  115. package/skills/flutter-dev/references/widget-patterns.md +233 -0
  116. package/skills/frontend-dev/SKILL.md +468 -0
  117. package/skills/frontend-dev/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  118. package/skills/frontend-dev/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  119. package/skills/frontend-dev/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  120. package/skills/frontend-dev/canvas-fonts/BigShoulders-OFL.txt +93 -0
  121. package/skills/frontend-dev/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  122. package/skills/frontend-dev/canvas-fonts/Boldonse-OFL.txt +93 -0
  123. package/skills/frontend-dev/canvas-fonts/Boldonse-Regular.ttf +0 -0
  124. package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  125. package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  126. package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  127. package/skills/frontend-dev/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  128. package/skills/frontend-dev/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  129. package/skills/frontend-dev/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  130. package/skills/frontend-dev/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  131. package/skills/frontend-dev/canvas-fonts/DMMono-OFL.txt +93 -0
  132. package/skills/frontend-dev/canvas-fonts/DMMono-Regular.ttf +0 -0
  133. package/skills/frontend-dev/canvas-fonts/EricaOne-OFL.txt +94 -0
  134. package/skills/frontend-dev/canvas-fonts/EricaOne-Regular.ttf +0 -0
  135. package/skills/frontend-dev/canvas-fonts/GeistMono-Bold.ttf +0 -0
  136. package/skills/frontend-dev/canvas-fonts/GeistMono-OFL.txt +93 -0
  137. package/skills/frontend-dev/canvas-fonts/GeistMono-Regular.ttf +0 -0
  138. package/skills/frontend-dev/canvas-fonts/Gloock-OFL.txt +93 -0
  139. package/skills/frontend-dev/canvas-fonts/Gloock-Regular.ttf +0 -0
  140. package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  141. package/skills/frontend-dev/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  142. package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  143. package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  144. package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  145. package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  146. package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  147. package/skills/frontend-dev/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  148. package/skills/frontend-dev/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  149. package/skills/frontend-dev/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  150. package/skills/frontend-dev/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  151. package/skills/frontend-dev/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  152. package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  153. package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  154. package/skills/frontend-dev/canvas-fonts/Italiana-OFL.txt +93 -0
  155. package/skills/frontend-dev/canvas-fonts/Italiana-Regular.ttf +0 -0
  156. package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  157. package/skills/frontend-dev/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  158. package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  159. package/skills/frontend-dev/canvas-fonts/Jura-Light.ttf +0 -0
  160. package/skills/frontend-dev/canvas-fonts/Jura-Medium.ttf +0 -0
  161. package/skills/frontend-dev/canvas-fonts/Jura-OFL.txt +93 -0
  162. package/skills/frontend-dev/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  163. package/skills/frontend-dev/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  164. package/skills/frontend-dev/canvas-fonts/Lora-Bold.ttf +0 -0
  165. package/skills/frontend-dev/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  166. package/skills/frontend-dev/canvas-fonts/Lora-Italic.ttf +0 -0
  167. package/skills/frontend-dev/canvas-fonts/Lora-OFL.txt +93 -0
  168. package/skills/frontend-dev/canvas-fonts/Lora-Regular.ttf +0 -0
  169. package/skills/frontend-dev/canvas-fonts/NationalPark-Bold.ttf +0 -0
  170. package/skills/frontend-dev/canvas-fonts/NationalPark-OFL.txt +93 -0
  171. package/skills/frontend-dev/canvas-fonts/NationalPark-Regular.ttf +0 -0
  172. package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  173. package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  174. package/skills/frontend-dev/canvas-fonts/Outfit-Bold.ttf +0 -0
  175. package/skills/frontend-dev/canvas-fonts/Outfit-OFL.txt +93 -0
  176. package/skills/frontend-dev/canvas-fonts/Outfit-Regular.ttf +0 -0
  177. package/skills/frontend-dev/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  178. package/skills/frontend-dev/canvas-fonts/PixelifySans-OFL.txt +93 -0
  179. package/skills/frontend-dev/canvas-fonts/PoiretOne-OFL.txt +93 -0
  180. package/skills/frontend-dev/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  181. package/skills/frontend-dev/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  182. package/skills/frontend-dev/canvas-fonts/RedHatMono-OFL.txt +93 -0
  183. package/skills/frontend-dev/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  184. package/skills/frontend-dev/canvas-fonts/Silkscreen-OFL.txt +93 -0
  185. package/skills/frontend-dev/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  186. package/skills/frontend-dev/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  187. package/skills/frontend-dev/canvas-fonts/SmoochSans-OFL.txt +93 -0
  188. package/skills/frontend-dev/canvas-fonts/Tektur-Medium.ttf +0 -0
  189. package/skills/frontend-dev/canvas-fonts/Tektur-OFL.txt +93 -0
  190. package/skills/frontend-dev/canvas-fonts/Tektur-Regular.ttf +0 -0
  191. package/skills/frontend-dev/canvas-fonts/WorkSans-Bold.ttf +0 -0
  192. package/skills/frontend-dev/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  193. package/skills/frontend-dev/canvas-fonts/WorkSans-Italic.ttf +0 -0
  194. package/skills/frontend-dev/canvas-fonts/WorkSans-OFL.txt +93 -0
  195. package/skills/frontend-dev/canvas-fonts/WorkSans-Regular.ttf +0 -0
  196. package/skills/frontend-dev/canvas-fonts/YoungSerif-OFL.txt +93 -0
  197. package/skills/frontend-dev/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  198. package/skills/frontend-dev/references/asset-prompt-guide.md +43 -0
  199. package/skills/frontend-dev/references/env-setup.md +33 -0
  200. package/skills/frontend-dev/references/minimax-cli-reference.md +133 -0
  201. package/skills/frontend-dev/references/minimax-image-guide.md +65 -0
  202. package/skills/frontend-dev/references/minimax-music-guide.md +216 -0
  203. package/skills/frontend-dev/references/minimax-tts-guide.md +78 -0
  204. package/skills/frontend-dev/references/minimax-video-guide.md +82 -0
  205. package/skills/frontend-dev/references/minimax-voice-catalog.md +685 -0
  206. package/skills/frontend-dev/references/motion-recipes.md +407 -0
  207. package/skills/frontend-dev/references/troubleshooting.md +85 -0
  208. package/skills/frontend-dev/scripts/minimax_image.py +137 -0
  209. package/skills/frontend-dev/scripts/minimax_music.py +157 -0
  210. package/skills/frontend-dev/scripts/minimax_tts.py +127 -0
  211. package/skills/frontend-dev/scripts/minimax_video.py +187 -0
  212. package/skills/frontend-dev/templates/generator_template.js +223 -0
  213. package/skills/frontend-dev/templates/viewer.html +599 -0
  214. package/skills/frontend-ui-engineering/SKILL.md +367 -0
  215. package/skills/fullstack-dev/SKILL.md +819 -0
  216. package/skills/fullstack-dev/references/api-design.md +444 -0
  217. package/skills/fullstack-dev/references/auth-flow.md +165 -0
  218. package/skills/fullstack-dev/references/db-schema.md +706 -0
  219. package/skills/fullstack-dev/references/django-best-practices.md +466 -0
  220. package/skills/fullstack-dev/references/environment-management.md +78 -0
  221. package/skills/fullstack-dev/references/release-checklist.md +278 -0
  222. package/skills/fullstack-dev/references/technology-selection.md +254 -0
  223. package/skills/fullstack-dev/references/testing-strategy.md +404 -0
  224. package/skills/git-workflow-and-versioning/SKILL.md +446 -0
  225. package/skills/github-evidence-triage/SKILL.md +115 -0
  226. package/skills/harness-evolution/SKILL.md +59 -0
  227. package/skills/harness-evolution/references/activation-matrix.md +13 -0
  228. package/skills/harness-evolution/references/approval-policy.md +20 -0
  229. package/skills/harness-evolution/references/change-report-template.md +33 -0
  230. package/skills/harness-evolution/references/component-taxonomy.md +19 -0
  231. package/skills/harness-evolution/references/verdict-policy.md +13 -0
  232. package/skills/harness-issue-triage/SKILL.md +72 -0
  233. package/skills/harness-issue-triage/references/component-diagnosis.md +25 -0
  234. package/skills/harness-issue-triage/references/triage-report-template.md +34 -0
  235. package/skills/harness-optimization-audit/SKILL.md +125 -0
  236. package/skills/idea-refine/SKILL.md +191 -0
  237. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
  238. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
  239. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/SKILL.upstream.md +178 -0
  240. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/examples.md +238 -0
  241. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/frameworks.md +99 -0
  242. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/refinement-criteria.md +113 -0
  243. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/scripts/idea-refine.upstream.sh +15 -0
  244. package/skills/incremental-implementation/SKILL.md +252 -0
  245. package/skills/ios-application-dev/SKILL.md +212 -0
  246. package/skills/ios-application-dev/references/accessibility.md +259 -0
  247. package/skills/ios-application-dev/references/graphics-animation.md +350 -0
  248. package/skills/ios-application-dev/references/layout-system.md +199 -0
  249. package/skills/ios-application-dev/references/metal-shader.md +178 -0
  250. package/skills/ios-application-dev/references/navigation-patterns.md +175 -0
  251. package/skills/ios-application-dev/references/swift-coding-standards.md +757 -0
  252. package/skills/ios-application-dev/references/swiftui-design-guidelines.md +1167 -0
  253. package/skills/ios-application-dev/references/system-integration.md +401 -0
  254. package/skills/ios-application-dev/references/uikit-components.md +297 -0
  255. package/skills/local-review-gate/SKILL.md +207 -0
  256. package/skills/local-review-gate/references/addyosmani-code-review-rubric.md +33 -0
  257. package/skills/local-review-gate/references/codex-github-compatibility.md +26 -0
  258. package/skills/local-review-gate/references/ecc-code-review-adaptation.md +40 -0
  259. package/skills/local-review-gate/references/graphify-local-review.md +33 -0
  260. package/skills/local-review-gate/references/orchestration-adaptation.md +51 -0
  261. package/skills/local-review-gate/references/review-repair-lane-adaptation.md +46 -0
  262. package/skills/local-review-gate/references/upstream-provenance.md +61 -0
  263. package/skills/mature-project-pattern-research/SKILL.md +155 -0
  264. package/skills/mature-project-pattern-research/references/research-rubric.md +45 -0
  265. package/skills/minimax-docx/LICENSE +21 -0
  266. package/skills/minimax-docx/SKILL.md +273 -0
  267. package/skills/minimax-docx/assets/styles/academic_styles.xml +250 -0
  268. package/skills/minimax-docx/assets/styles/corporate_styles.xml +284 -0
  269. package/skills/minimax-docx/assets/styles/default_styles.xml +449 -0
  270. package/skills/minimax-docx/assets/xsd/aesthetic-rules.xsd +470 -0
  271. package/skills/minimax-docx/assets/xsd/business-rules.xsd +130 -0
  272. package/skills/minimax-docx/assets/xsd/common-types.xsd +159 -0
  273. package/skills/minimax-docx/assets/xsd/wml-subset.xsd +589 -0
  274. package/skills/minimax-docx/references/cjk_typography.md +357 -0
  275. package/skills/minimax-docx/references/cjk_university_template_guide.md +184 -0
  276. package/skills/minimax-docx/references/comments_guide.md +191 -0
  277. package/skills/minimax-docx/references/design_good_bad_examples.md +829 -0
  278. package/skills/minimax-docx/references/design_principles.md +819 -0
  279. package/skills/minimax-docx/references/openxml_element_order.md +308 -0
  280. package/skills/minimax-docx/references/openxml_encyclopedia_part1.md +4061 -0
  281. package/skills/minimax-docx/references/openxml_encyclopedia_part2.md +2820 -0
  282. package/skills/minimax-docx/references/openxml_encyclopedia_part3.md +3381 -0
  283. package/skills/minimax-docx/references/openxml_namespaces.md +82 -0
  284. package/skills/minimax-docx/references/openxml_units.md +72 -0
  285. package/skills/minimax-docx/references/scenario_a_create.md +284 -0
  286. package/skills/minimax-docx/references/scenario_b_edit_content.md +295 -0
  287. package/skills/minimax-docx/references/scenario_c_apply_template.md +456 -0
  288. package/skills/minimax-docx/references/track_changes_guide.md +200 -0
  289. package/skills/minimax-docx/references/troubleshooting.md +506 -0
  290. package/skills/minimax-docx/references/typography_guide.md +294 -0
  291. package/skills/minimax-docx/references/xsd_validation_guide.md +158 -0
  292. package/skills/minimax-docx/scripts/doc_to_docx.sh +40 -0
  293. package/skills/minimax-docx/scripts/docx_preview.sh +37 -0
  294. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj +19 -0
  295. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs +18 -0
  296. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs +147 -0
  297. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs +322 -0
  298. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs +324 -0
  299. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs +155 -0
  300. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs +487 -0
  301. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs +108 -0
  302. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs +122 -0
  303. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs +107 -0
  304. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj +15 -0
  305. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs +169 -0
  306. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs +80 -0
  307. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs +42 -0
  308. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs +81 -0
  309. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs +81 -0
  310. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs +99 -0
  311. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs +23 -0
  312. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs +1832 -0
  313. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs +910 -0
  314. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs +999 -0
  315. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs +1048 -0
  316. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs +1038 -0
  317. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs +1020 -0
  318. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs +1121 -0
  319. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs +624 -0
  320. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs +675 -0
  321. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs +838 -0
  322. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs +917 -0
  323. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs +826 -0
  324. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs +1199 -0
  325. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs +1487 -0
  326. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs +1163 -0
  327. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs +595 -0
  328. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs +39 -0
  329. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs +24 -0
  330. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs +20 -0
  331. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs +224 -0
  332. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs +148 -0
  333. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs +23 -0
  334. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs +69 -0
  335. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx +4 -0
  336. package/skills/minimax-docx/scripts/env_check.sh +196 -0
  337. package/skills/minimax-docx/scripts/setup.ps1 +274 -0
  338. package/skills/minimax-docx/scripts/setup.sh +504 -0
  339. package/skills/minimax-pdf/README.md +222 -0
  340. package/skills/minimax-pdf/SKILL.md +218 -0
  341. package/skills/minimax-pdf/design/design.md +381 -0
  342. package/skills/minimax-pdf/scripts/cover.py +1579 -0
  343. package/skills/minimax-pdf/scripts/fill_inspect.py +200 -0
  344. package/skills/minimax-pdf/scripts/fill_write.py +242 -0
  345. package/skills/minimax-pdf/scripts/make.sh +491 -0
  346. package/skills/minimax-pdf/scripts/merge.py +112 -0
  347. package/skills/minimax-pdf/scripts/palette.py +521 -0
  348. package/skills/minimax-pdf/scripts/reformat_parse.py +374 -0
  349. package/skills/minimax-pdf/scripts/render_body.py +1052 -0
  350. package/skills/minimax-pdf/scripts/render_cover.js +111 -0
  351. package/skills/minimax-xlsx/SKILL.md +156 -0
  352. package/skills/minimax-xlsx/references/create.md +691 -0
  353. package/skills/minimax-xlsx/references/edit.md +684 -0
  354. package/skills/minimax-xlsx/references/fix.md +37 -0
  355. package/skills/minimax-xlsx/references/format.md +768 -0
  356. package/skills/minimax-xlsx/references/ooxml-cheatsheet.md +231 -0
  357. package/skills/minimax-xlsx/references/read-analyze.md +97 -0
  358. package/skills/minimax-xlsx/references/validate.md +772 -0
  359. package/skills/minimax-xlsx/scripts/formula_check.py +422 -0
  360. package/skills/minimax-xlsx/scripts/libreoffice_recalc.py +248 -0
  361. package/skills/minimax-xlsx/scripts/shared_strings_builder.py +163 -0
  362. package/skills/minimax-xlsx/scripts/style_audit.py +575 -0
  363. package/skills/minimax-xlsx/scripts/xlsx_add_column.py +395 -0
  364. package/skills/minimax-xlsx/scripts/xlsx_insert_row.py +274 -0
  365. package/skills/minimax-xlsx/scripts/xlsx_pack.py +87 -0
  366. package/skills/minimax-xlsx/scripts/xlsx_reader.py +362 -0
  367. package/skills/minimax-xlsx/scripts/xlsx_shift_rows.py +396 -0
  368. package/skills/minimax-xlsx/scripts/xlsx_unpack.py +130 -0
  369. package/skills/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml +9 -0
  370. package/skills/minimax-xlsx/templates/minimal_xlsx/_rels/.rels +6 -0
  371. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +19 -0
  372. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +33 -0
  373. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml +160 -0
  374. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml +30 -0
  375. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +70 -0
  376. package/skills/newsletter-generation/SKILL.md +71 -0
  377. package/skills/oss-release-readiness/SKILL.md +47 -0
  378. package/skills/parallel-subagent-dispatch/SKILL.md +58 -0
  379. package/skills/performance-optimization/SKILL.md +364 -0
  380. package/skills/planning-and-task-breakdown/SKILL.md +290 -0
  381. package/skills/pptx-generator/SKILL.md +275 -0
  382. package/skills/pptx-generator/references/design-system.md +392 -0
  383. package/skills/pptx-generator/references/editing.md +162 -0
  384. package/skills/pptx-generator/references/pitfalls.md +112 -0
  385. package/skills/pptx-generator/references/pptxgenjs.md +420 -0
  386. package/skills/pptx-generator/references/slide-types.md +413 -0
  387. package/skills/pr-test-analysis/SKILL.md +24 -0
  388. package/skills/react-native-dev/SKILL.md +180 -0
  389. package/skills/react-native-dev/references/animations.md +254 -0
  390. package/skills/react-native-dev/references/components.md +124 -0
  391. package/skills/react-native-dev/references/engineering.md +527 -0
  392. package/skills/react-native-dev/references/forms.md +300 -0
  393. package/skills/react-native-dev/references/native-capabilities.md +163 -0
  394. package/skills/react-native-dev/references/navigation.md +271 -0
  395. package/skills/react-native-dev/references/networking.md +346 -0
  396. package/skills/react-native-dev/references/performance.md +215 -0
  397. package/skills/react-native-dev/references/state-management.md +230 -0
  398. package/skills/react-native-dev/references/styling.md +117 -0
  399. package/skills/react-native-dev/references/testing.md +341 -0
  400. package/skills/requirements-grilling/SKILL.md +447 -0
  401. package/skills/requirements-grilling/references/ADR-FORMAT.md +46 -0
  402. package/skills/requirements-grilling/references/CONTEXT-FORMAT.md +41 -0
  403. package/skills/requirements-grilling/references/INTERVIEW-PACKET-FORMAT.md +62 -0
  404. package/skills/requirements-grilling/references/MIT-LICENSE-MATT-POCOCK.md +25 -0
  405. package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
  406. package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
  407. package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/interview-me/SKILL.upstream.md +225 -0
  408. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/LICENSE +21 -0
  409. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/NOTICE.md +12 -0
  410. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/batch-grill-me/SKILL.upstream.md +15 -0
  411. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grill-me/SKILL.upstream.md +7 -0
  412. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grilling/SKILL.upstream.md +12 -0
  413. package/skills/review-pipeline/SKILL.md +38 -0
  414. package/skills/rose-memory/SKILL.md +210 -0
  415. package/skills/rose-memory/references/README.md +48 -0
  416. package/skills/rose-memory/references/memory_cli.py +2384 -0
  417. package/skills/rose-memory/references/schema.sql +315 -0
  418. package/skills/security-and-hardening/SKILL.md +369 -0
  419. package/skills/session-handoff/SKILL.md +88 -0
  420. package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
  421. package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
  422. package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/handoff/SKILL.upstream.md +16 -0
  423. package/skills/session-handoff/scripts/session_handoff.py +764 -0
  424. package/skills/shader-dev/SKILL.md +316 -0
  425. package/skills/shader-dev/reference/ambient-occlusion.md +382 -0
  426. package/skills/shader-dev/reference/analytic-ray-tracing.md +651 -0
  427. package/skills/shader-dev/reference/anti-aliasing.md +71 -0
  428. package/skills/shader-dev/reference/atmospheric-scattering.md +571 -0
  429. package/skills/shader-dev/reference/camera-effects.md +80 -0
  430. package/skills/shader-dev/reference/cellular-automata.md +635 -0
  431. package/skills/shader-dev/reference/color-palette.md +481 -0
  432. package/skills/shader-dev/reference/csg-boolean-operations.md +466 -0
  433. package/skills/shader-dev/reference/domain-repetition.md +436 -0
  434. package/skills/shader-dev/reference/domain-warping.md +419 -0
  435. package/skills/shader-dev/reference/fluid-simulation.md +425 -0
  436. package/skills/shader-dev/reference/fractal-rendering.md +525 -0
  437. package/skills/shader-dev/reference/lighting-model.md +639 -0
  438. package/skills/shader-dev/reference/matrix-transform.md +535 -0
  439. package/skills/shader-dev/reference/multipass-buffer.md +571 -0
  440. package/skills/shader-dev/reference/normal-estimation.md +418 -0
  441. package/skills/shader-dev/reference/particle-system.md +589 -0
  442. package/skills/shader-dev/reference/path-tracing-gi.md +602 -0
  443. package/skills/shader-dev/reference/polar-uv-manipulation.md +521 -0
  444. package/skills/shader-dev/reference/post-processing.md +375 -0
  445. package/skills/shader-dev/reference/procedural-2d-pattern.md +439 -0
  446. package/skills/shader-dev/reference/procedural-noise.md +551 -0
  447. package/skills/shader-dev/reference/ray-marching.md +396 -0
  448. package/skills/shader-dev/reference/sdf-2d.md +724 -0
  449. package/skills/shader-dev/reference/sdf-3d.md +805 -0
  450. package/skills/shader-dev/reference/sdf-tricks.md +63 -0
  451. package/skills/shader-dev/reference/shadow-techniques.md +476 -0
  452. package/skills/shader-dev/reference/simulation-physics.md +644 -0
  453. package/skills/shader-dev/reference/sound-synthesis.md +578 -0
  454. package/skills/shader-dev/reference/terrain-rendering.md +839 -0
  455. package/skills/shader-dev/reference/texture-mapping-advanced.md +87 -0
  456. package/skills/shader-dev/reference/texture-sampling.md +553 -0
  457. package/skills/shader-dev/reference/volumetric-rendering.md +608 -0
  458. package/skills/shader-dev/reference/voronoi-cellular-noise.md +486 -0
  459. package/skills/shader-dev/reference/voxel-rendering.md +701 -0
  460. package/skills/shader-dev/reference/water-ocean.md +445 -0
  461. package/skills/shader-dev/reference/webgl-pitfalls.md +41 -0
  462. package/skills/shader-dev/techniques/ambient-occlusion.md +364 -0
  463. package/skills/shader-dev/techniques/analytic-ray-tracing.md +542 -0
  464. package/skills/shader-dev/techniques/anti-aliasing.md +124 -0
  465. package/skills/shader-dev/techniques/atmospheric-scattering.md +522 -0
  466. package/skills/shader-dev/techniques/camera-effects.md +115 -0
  467. package/skills/shader-dev/techniques/cellular-automata.md +531 -0
  468. package/skills/shader-dev/techniques/color-palette.md +380 -0
  469. package/skills/shader-dev/techniques/csg-boolean-operations.md +491 -0
  470. package/skills/shader-dev/techniques/domain-repetition.md +333 -0
  471. package/skills/shader-dev/techniques/domain-warping.md +414 -0
  472. package/skills/shader-dev/techniques/fluid-simulation.md +1175 -0
  473. package/skills/shader-dev/techniques/fractal-rendering.md +436 -0
  474. package/skills/shader-dev/techniques/lighting-model.md +527 -0
  475. package/skills/shader-dev/techniques/matrix-transform.md +455 -0
  476. package/skills/shader-dev/techniques/multipass-buffer.md +922 -0
  477. package/skills/shader-dev/techniques/normal-estimation.md +318 -0
  478. package/skills/shader-dev/techniques/particle-system.md +1203 -0
  479. package/skills/shader-dev/techniques/path-tracing-gi.md +623 -0
  480. package/skills/shader-dev/techniques/polar-uv-manipulation.md +373 -0
  481. package/skills/shader-dev/techniques/post-processing.md +788 -0
  482. package/skills/shader-dev/techniques/procedural-2d-pattern.md +346 -0
  483. package/skills/shader-dev/techniques/procedural-noise.md +554 -0
  484. package/skills/shader-dev/techniques/ray-marching.md +467 -0
  485. package/skills/shader-dev/techniques/sdf-2d.md +631 -0
  486. package/skills/shader-dev/techniques/sdf-3d.md +589 -0
  487. package/skills/shader-dev/techniques/sdf-tricks.md +100 -0
  488. package/skills/shader-dev/techniques/shadow-techniques.md +776 -0
  489. package/skills/shader-dev/techniques/simulation-physics.md +1542 -0
  490. package/skills/shader-dev/techniques/sound-synthesis.md +490 -0
  491. package/skills/shader-dev/techniques/terrain-rendering.md +408 -0
  492. package/skills/shader-dev/techniques/texture-mapping-advanced.md +121 -0
  493. package/skills/shader-dev/techniques/texture-sampling.md +382 -0
  494. package/skills/shader-dev/techniques/volumetric-rendering.md +375 -0
  495. package/skills/shader-dev/techniques/voronoi-cellular-noise.md +458 -0
  496. package/skills/shader-dev/techniques/voxel-rendering.md +985 -0
  497. package/skills/shader-dev/techniques/water-ocean.md +490 -0
  498. package/skills/shader-dev/techniques/webgl-pitfalls.md +170 -0
  499. package/skills/shipping-and-launch/SKILL.md +334 -0
  500. package/skills/silent-failure-hunting/SKILL.md +24 -0
  501. package/skills/source-driven-development/SKILL.md +223 -0
  502. package/skills/spec-driven-development/SKILL.md +235 -0
  503. package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
  504. package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
  505. package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/spec-driven-development/SKILL.upstream.md +206 -0
  506. package/skills/strategy-stress-test/SKILL.md +185 -0
  507. package/skills/systematic-literature-review/SKILL.md +77 -0
  508. package/skills/test-document-generator/SKILL.md +152 -0
  509. package/skills/test-document-generator/references/test-document-template.md +45 -0
  510. package/skills/test-driven-development/SKILL.md +399 -0
  511. package/skills/write-skills/GLOSSARY.md +113 -0
  512. package/skills/write-skills/SKILL.md +133 -0
  513. package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
  514. package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
  515. package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/GLOSSARY.md +201 -0
  516. package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/SKILL.upstream.md +83 -0
  517. package/src/runtime/child-guard.ts +70 -0
  518. package/src/runtime/conflicts.ts +25 -0
  519. package/src/runtime/contracts.ts +9 -0
  520. package/src/runtime/doctor.ts +134 -0
  521. package/src/runtime/global-resources.ts +152 -0
  522. package/src/runtime/index.ts +23 -0
  523. package/src/runtime/lifecycle.ts +19 -0
  524. package/src/runtime/native-integrations.ts +44 -0
  525. package/src/runtime/path-boundaries.ts +69 -0
  526. package/src/runtime/registry.ts +213 -0
  527. package/src/runtime/roles.ts +64 -0
  528. package/src/runtime/rose-context.ts +24 -0
  529. package/src/runtime/subagents.ts +426 -0
  530. package/templates/APPEND_SYSTEM.md +12 -0
  531. package/upstream/aili-workflows.lock.json +3226 -0
@@ -0,0 +1,157 @@
1
+ #!/usr/bin/env python3
2
+ # SPDX-License-Identifier: MIT
3
+ """
4
+ MiniMax Music Generation (HTTP)
5
+ Self-contained: no external dependencies beyond `requests`.
6
+
7
+ Usage:
8
+ python minimax_music.py --prompt "Indie folk, melancholic" --lyrics "[verse]\nStreetlights flicker" -o song.mp3
9
+ python minimax_music.py --prompt "Upbeat pop, energetic" --auto-lyrics -o pop.mp3
10
+ python minimax_music.py --prompt "Jazz piano, smooth, relaxing" --instrumental -o jazz.mp3
11
+
12
+ Env: MINIMAX_API_KEY (required)
13
+ """
14
+
15
+ import os
16
+ import sys
17
+ import json
18
+ import argparse
19
+ import requests
20
+
21
+ API_KEY = os.getenv("MINIMAX_API_KEY")
22
+ # China Mainland: https://api.minimaxi.com/v1
23
+ # Overseas: https://api.minimax.io/v1
24
+ API_BASE = os.getenv("MINIMAX_API_BASE")
25
+ if not API_BASE:
26
+ raise SystemExit("ERROR: MINIMAX_API_BASE is not set.")
27
+
28
+
29
+ def generate_music(
30
+ prompt: str = "",
31
+ lyrics: str = "",
32
+ model: str = "music-2.5+",
33
+ is_instrumental: bool = False,
34
+ lyrics_optimizer: bool = False,
35
+ sample_rate: int = 44100,
36
+ bitrate: int = 256000,
37
+ fmt: str = "mp3",
38
+ output_format: str = "hex",
39
+ timeout: int = 600,
40
+ ) -> dict:
41
+ """Synchronous HTTP music generation. Returns dict with audio bytes and metadata."""
42
+ if not API_KEY:
43
+ raise SystemExit("ERROR: MINIMAX_API_KEY is not set.\n export MINIMAX_API_KEY='your-key'")
44
+
45
+ payload = {
46
+ "model": model,
47
+ "audio_setting": {
48
+ "sample_rate": sample_rate,
49
+ "bitrate": bitrate,
50
+ "format": fmt,
51
+ },
52
+ "output_format": output_format,
53
+ }
54
+
55
+ if prompt:
56
+ payload["prompt"] = prompt
57
+ if lyrics:
58
+ payload["lyrics"] = lyrics
59
+ if is_instrumental:
60
+ payload["is_instrumental"] = True
61
+ if lyrics_optimizer:
62
+ payload["lyrics_optimizer"] = True
63
+
64
+ resp = requests.post(
65
+ f"{API_BASE}/music_generation",
66
+ headers={
67
+ "Authorization": f"Bearer {API_KEY}",
68
+ "Content-Type": "application/json",
69
+ },
70
+ json=payload,
71
+ timeout=timeout,
72
+ )
73
+ resp.raise_for_status()
74
+ data = resp.json()
75
+
76
+ # Check API-level error
77
+ base_resp = data.get("base_resp", {})
78
+ if base_resp.get("status_code", 0) != 0:
79
+ raise SystemExit(f"API Error [{base_resp.get('status_code')}]: {base_resp.get('status_msg')}")
80
+
81
+ status = data.get("data", {}).get("status")
82
+ if status != 2:
83
+ raise SystemExit(f"Generation incomplete (status={status}): {json.dumps(data, indent=2)}")
84
+
85
+ audio_data = data.get("data", {}).get("audio", "")
86
+ if not audio_data:
87
+ raise SystemExit(f"No audio in response: {json.dumps(data, indent=2)}")
88
+
89
+ extra = data.get("extra_info", {})
90
+
91
+ if output_format == "hex":
92
+ audio_bytes = bytes.fromhex(audio_data)
93
+ else:
94
+ # URL mode — audio_data is a URL string
95
+ audio_bytes = None
96
+
97
+ return {
98
+ "audio_bytes": audio_bytes,
99
+ "audio_url": audio_data if output_format == "url" else None,
100
+ "duration": extra.get("music_duration"),
101
+ "sample_rate": extra.get("music_sample_rate"),
102
+ "channels": extra.get("music_channel"),
103
+ "bitrate": extra.get("bitrate"),
104
+ "size": extra.get("music_size"),
105
+ }
106
+
107
+
108
+ def main():
109
+ p = argparse.ArgumentParser(description="MiniMax Music Generation (HTTP)")
110
+ p.add_argument("-o", "--output", required=True, help="Output file path")
111
+ p.add_argument("--prompt", default="", help="Music description: style, mood, scenario (max 2000 chars)")
112
+ p.add_argument("--lyrics", default="", help="Song lyrics with structure tags (max 3500 chars)")
113
+ p.add_argument("--lyrics-file", default="", help="Read lyrics from file instead of --lyrics")
114
+ p.add_argument("--model", default="music-2.5+", choices=["music-2.5+", "music-2.5"], help="Model (default: music-2.5+)")
115
+ p.add_argument("--instrumental", action="store_true", help="Generate instrumental only (no vocals)")
116
+ p.add_argument("--auto-lyrics", action="store_true", help="Auto-generate lyrics from prompt")
117
+ p.add_argument("--format", default="mp3", dest="fmt", choices=["mp3", "wav", "pcm"], help="Audio format (default: mp3)")
118
+ p.add_argument("--sample-rate", type=int, default=44100, choices=[16000, 24000, 32000, 44100], help="Sample rate (default: 44100)")
119
+ p.add_argument("--bitrate", type=int, default=256000, choices=[32000, 64000, 128000, 256000], help="Bitrate (default: 256000)")
120
+ args = p.parse_args()
121
+
122
+ lyrics = args.lyrics
123
+ if args.lyrics_file:
124
+ with open(args.lyrics_file, "r") as f:
125
+ lyrics = f.read()
126
+
127
+ os.makedirs(os.path.dirname(args.output) or ".", exist_ok=True)
128
+
129
+ result = generate_music(
130
+ prompt=args.prompt,
131
+ lyrics=lyrics,
132
+ model=args.model,
133
+ is_instrumental=args.instrumental,
134
+ lyrics_optimizer=args.auto_lyrics,
135
+ sample_rate=args.sample_rate,
136
+ bitrate=args.bitrate,
137
+ fmt=args.fmt,
138
+ )
139
+
140
+ if result["audio_bytes"]:
141
+ with open(args.output, "wb") as f:
142
+ f.write(result["audio_bytes"])
143
+ size = len(result["audio_bytes"])
144
+ else:
145
+ # URL mode — download
146
+ r = requests.get(result["audio_url"], timeout=120)
147
+ r.raise_for_status()
148
+ with open(args.output, "wb") as f:
149
+ f.write(r.content)
150
+ size = len(r.content)
151
+
152
+ duration = result.get("duration", "?")
153
+ print(f"OK: {size} bytes -> {args.output} (duration: {duration}s)")
154
+
155
+
156
+ if __name__ == "__main__":
157
+ main()
@@ -0,0 +1,127 @@
1
+ #!/usr/bin/env python3
2
+ # SPDX-License-Identifier: MIT
3
+ """
4
+ MiniMax Sync TTS (HTTP)
5
+ Self-contained: no external dependencies beyond `requests`.
6
+
7
+ Usage:
8
+ python minimax_tts.py "Hello world" -o output.mp3
9
+ python minimax_tts.py "你好世界" -o hi.mp3 -v female-shaonv --model speech-2.8-hd
10
+ python minimax_tts.py "Welcome" -o out.wav -v male-qn-jingying --speed 0.8 --format wav
11
+
12
+ Env: MINIMAX_API_KEY (required)
13
+ """
14
+
15
+ import os
16
+ import sys
17
+ import json
18
+ import argparse
19
+ import requests
20
+
21
+ API_KEY = os.getenv("MINIMAX_API_KEY")
22
+ # China Mainland: https://api.minimaxi.com/v1
23
+ # Overseas: https://api.minimax.io/v1
24
+ API_BASE = os.getenv("MINIMAX_API_BASE")
25
+ if not API_BASE:
26
+ raise SystemExit("ERROR: MINIMAX_API_BASE is not set.")
27
+
28
+
29
+ def tts(
30
+ text: str,
31
+ voice_id: str = "male-qn-qingse",
32
+ model: str = "speech-2.8-hd",
33
+ speed: float = 1.0,
34
+ volume: float = 1.0,
35
+ pitch: int = 0,
36
+ emotion: str = "",
37
+ sample_rate: int = 32000,
38
+ bitrate: int = 128000,
39
+ fmt: str = "mp3",
40
+ language_boost: str = "auto",
41
+ timeout: int = 120,
42
+ ) -> bytes:
43
+ """Synchronous HTTP TTS. Returns raw audio bytes."""
44
+ if not API_KEY:
45
+ raise SystemExit("ERROR: MINIMAX_API_KEY is not set.\n export MINIMAX_API_KEY='your-key'")
46
+
47
+ voice_setting = {"voice_id": voice_id, "speed": speed, "vol": volume, "pitch": pitch}
48
+ if emotion:
49
+ voice_setting["emotion"] = emotion
50
+
51
+ payload = {
52
+ "model": model,
53
+ "text": text,
54
+ "stream": False,
55
+ "voice_setting": voice_setting,
56
+ "audio_setting": {
57
+ "sample_rate": sample_rate,
58
+ "bitrate": bitrate,
59
+ "format": fmt,
60
+ "channel": 1,
61
+ },
62
+ "language_boost": language_boost,
63
+ "output_format": "hex",
64
+ }
65
+
66
+ resp = requests.post(
67
+ f"{API_BASE}/t2a_v2",
68
+ headers={
69
+ "Authorization": f"Bearer {API_KEY}",
70
+ "Content-Type": "application/json",
71
+ },
72
+ json=payload,
73
+ timeout=timeout,
74
+ )
75
+ resp.raise_for_status()
76
+ data = resp.json()
77
+
78
+ # Check API-level error
79
+ base_resp = data.get("base_resp", {})
80
+ if base_resp.get("status_code", 0) != 0:
81
+ raise SystemExit(f"API Error [{base_resp.get('status_code')}]: {base_resp.get('status_msg')}")
82
+
83
+ audio_hex = data.get("data", {}).get("audio", "")
84
+ if not audio_hex:
85
+ raise SystemExit(f"No audio in response: {json.dumps(data, indent=2)}")
86
+
87
+ return bytes.fromhex(audio_hex)
88
+
89
+
90
+ def main():
91
+ p = argparse.ArgumentParser(description="MiniMax Sync TTS (HTTP)")
92
+ p.add_argument("text", help="Text to synthesize (max 10000 chars)")
93
+ p.add_argument("-o", "--output", required=True, help="Output file path")
94
+ p.add_argument("-v", "--voice", default="male-qn-qingse", help="Voice ID")
95
+ p.add_argument("--model", default="speech-2.8-hd", help="Model (default: speech-2.8-hd)")
96
+ p.add_argument("--speed", type=float, default=1.0, help="Speed 0.5-2.0")
97
+ p.add_argument("--volume", type=float, default=1.0, help="Volume 0.1-10")
98
+ p.add_argument("--pitch", type=int, default=0, help="Pitch -12 to 12")
99
+ p.add_argument("--emotion", default="", help="Emotion tag (happy/sad/angry/...)")
100
+ p.add_argument("--format", default="mp3", dest="fmt", help="Audio format (mp3/wav/flac)")
101
+ p.add_argument("--sample-rate", type=int, default=32000, help="Sample rate")
102
+ p.add_argument("--lang", default="auto", help="Language boost")
103
+ args = p.parse_args()
104
+
105
+ os.makedirs(os.path.dirname(args.output) or ".", exist_ok=True)
106
+
107
+ audio = tts(
108
+ text=args.text,
109
+ voice_id=args.voice,
110
+ model=args.model,
111
+ speed=args.speed,
112
+ volume=args.volume,
113
+ pitch=args.pitch,
114
+ emotion=args.emotion,
115
+ fmt=args.fmt,
116
+ sample_rate=args.sample_rate,
117
+ language_boost=args.lang,
118
+ )
119
+
120
+ with open(args.output, "wb") as f:
121
+ f.write(audio)
122
+
123
+ print(f"OK: {len(audio)} bytes -> {args.output}")
124
+
125
+
126
+ if __name__ == "__main__":
127
+ main()
@@ -0,0 +1,187 @@
1
+ #!/usr/bin/env python3
2
+ # SPDX-License-Identifier: MIT
3
+ """
4
+ MiniMax Text-to-Video — async generation with polling and download.
5
+
6
+ Usage:
7
+ python minimax_video.py "A cat playing piano" -o cat.mp4
8
+ python minimax_video.py "Ocean waves [Truck left]" -o waves.mp4 --model MiniMax-Hailuo-2.3 --duration 10
9
+ python minimax_video.py "City skyline at sunset [Push in]" -o city.mp4 --resolution 1080P
10
+
11
+ Env: MINIMAX_API_KEY (required)
12
+ """
13
+
14
+ import os
15
+ import sys
16
+ import json
17
+ import time
18
+ import argparse
19
+ import requests
20
+
21
+ API_KEY = os.getenv("MINIMAX_API_KEY")
22
+ # China Mainland: https://api.minimaxi.com/v1
23
+ # Overseas: https://api.minimax.io/v1
24
+ API_BASE = os.getenv("MINIMAX_API_BASE")
25
+ if not API_BASE:
26
+ raise SystemExit("ERROR: MINIMAX_API_BASE is not set.")
27
+
28
+
29
+ def _headers():
30
+ if not API_KEY:
31
+ raise SystemExit("ERROR: MINIMAX_API_KEY is not set.\n export MINIMAX_API_KEY='your-key'")
32
+ return {
33
+ "Authorization": f"Bearer {API_KEY}",
34
+ "Content-Type": "application/json",
35
+ }
36
+
37
+
38
+ def _check_resp(data):
39
+ base_resp = data.get("base_resp", {})
40
+ code = base_resp.get("status_code", 0)
41
+ if code != 0:
42
+ msg = base_resp.get("status_msg", "Unknown error")
43
+ raise SystemExit(f"API Error [{code}]: {msg}")
44
+
45
+
46
+ def create_task(
47
+ prompt: str,
48
+ model: str = "MiniMax-Hailuo-2.3",
49
+ duration: int = 6,
50
+ resolution: str = "768P",
51
+ prompt_optimizer: bool = True,
52
+ ) -> str:
53
+ """Submit a video generation task. Returns task_id."""
54
+ payload = {
55
+ "model": model,
56
+ "prompt": prompt,
57
+ "duration": duration,
58
+ "resolution": resolution,
59
+ "prompt_optimizer": prompt_optimizer,
60
+ }
61
+
62
+ resp = requests.post(
63
+ f"{API_BASE}/video_generation",
64
+ headers=_headers(),
65
+ json=payload,
66
+ timeout=30,
67
+ )
68
+ resp.raise_for_status()
69
+ data = resp.json()
70
+ _check_resp(data)
71
+
72
+ task_id = data.get("task_id")
73
+ if not task_id:
74
+ raise SystemExit(f"No task_id in response: {json.dumps(data, indent=2)}")
75
+ return task_id
76
+
77
+
78
+ def poll_task(task_id: str, interval: int = 10, max_wait: int = 600) -> str:
79
+ """Poll task status until Success. Returns file_id."""
80
+ elapsed = 0
81
+ while elapsed < max_wait:
82
+ resp = requests.get(
83
+ f"{API_BASE}/query/video_generation",
84
+ headers=_headers(),
85
+ params={"task_id": task_id},
86
+ timeout=30,
87
+ )
88
+ resp.raise_for_status()
89
+ data = resp.json()
90
+ _check_resp(data)
91
+
92
+ status = data.get("status", "")
93
+ file_id = data.get("file_id", "")
94
+
95
+ if status == "Success":
96
+ if not file_id:
97
+ raise SystemExit("Task succeeded but no file_id returned")
98
+ print(f" Done! file_id={file_id}")
99
+ return file_id
100
+ elif status == "Fail":
101
+ raise SystemExit(f"Video generation failed: {json.dumps(data, indent=2)}")
102
+ else:
103
+ print(f" [{elapsed}s] Status: {status}...")
104
+ time.sleep(interval)
105
+ elapsed += interval
106
+
107
+ raise SystemExit(f"Timeout after {max_wait}s. task_id={task_id}, check manually.")
108
+
109
+
110
+ def download_video(file_id: str, output_path: str):
111
+ """Retrieve download URL via file_id and save the video."""
112
+ resp = requests.get(
113
+ f"{API_BASE}/files/retrieve",
114
+ headers=_headers(),
115
+ params={"file_id": file_id},
116
+ timeout=30,
117
+ )
118
+ resp.raise_for_status()
119
+ data = resp.json()
120
+ _check_resp(data)
121
+
122
+ download_url = data.get("file", {}).get("download_url", "")
123
+ if not download_url:
124
+ raise SystemExit(f"No download_url in response: {json.dumps(data, indent=2)}")
125
+
126
+ print(f" Downloading from {download_url[:80]}...")
127
+ video_resp = requests.get(download_url, timeout=300)
128
+ video_resp.raise_for_status()
129
+
130
+ os.makedirs(os.path.dirname(output_path) or ".", exist_ok=True)
131
+ with open(output_path, "wb") as f:
132
+ f.write(video_resp.content)
133
+
134
+ print(f"OK: {len(video_resp.content)} bytes -> {output_path}")
135
+
136
+
137
+ def generate(
138
+ prompt: str,
139
+ output_path: str,
140
+ model: str = "MiniMax-Hailuo-2.3",
141
+ duration: int = 6,
142
+ resolution: str = "768P",
143
+ prompt_optimizer: bool = True,
144
+ poll_interval: int = 10,
145
+ max_wait: int = 600,
146
+ ):
147
+ """Full pipeline: create task -> poll -> download."""
148
+ print(f"Creating video task...")
149
+ print(f" Model: {model} | Duration: {duration}s | Resolution: {resolution}")
150
+ print(f" Prompt: {prompt[:100]}{'...' if len(prompt) > 100 else ''}")
151
+
152
+ task_id = create_task(prompt, model, duration, resolution, prompt_optimizer)
153
+ print(f" task_id={task_id}")
154
+ print(f"Waiting for generation...")
155
+
156
+ file_id = poll_task(task_id, poll_interval, max_wait)
157
+ download_video(file_id, output_path)
158
+
159
+
160
+ def main():
161
+ p = argparse.ArgumentParser(description="MiniMax Text-to-Video")
162
+ p.add_argument("prompt", help="Video description (max 2000 chars). Use [Camera Command] for camera control.")
163
+ p.add_argument("-o", "--output", required=True, help="Output file path (.mp4)")
164
+ p.add_argument("--model", default="MiniMax-Hailuo-2.3",
165
+ choices=["MiniMax-Hailuo-2.3", "MiniMax-Hailuo-02", "T2V-01-Director", "T2V-01"],
166
+ help="Model (default: MiniMax-Hailuo-2.3)")
167
+ p.add_argument("--duration", type=int, default=6, choices=[6, 10], help="Duration in seconds (default: 6)")
168
+ p.add_argument("--resolution", default="768P", choices=["720P", "768P", "1080P"], help="Resolution (default: 768P)")
169
+ p.add_argument("--no-optimize", action="store_true", help="Disable prompt auto-optimization")
170
+ p.add_argument("--poll-interval", type=int, default=10, help="Poll interval in seconds (default: 10)")
171
+ p.add_argument("--max-wait", type=int, default=600, help="Max wait time in seconds (default: 600)")
172
+ args = p.parse_args()
173
+
174
+ generate(
175
+ prompt=args.prompt,
176
+ output_path=args.output,
177
+ model=args.model,
178
+ duration=args.duration,
179
+ resolution=args.resolution,
180
+ prompt_optimizer=not args.no_optimize,
181
+ poll_interval=args.poll_interval,
182
+ max_wait=args.max_wait,
183
+ )
184
+
185
+
186
+ if __name__ == "__main__":
187
+ main()
@@ -0,0 +1,223 @@
1
+ /**
2
+ * ═══════════════════════════════════════════════════════════════════════════
3
+ * P5.JS GENERATIVE ART - BEST PRACTICES
4
+ * ═══════════════════════════════════════════════════════════════════════════
5
+ *
6
+ * This file shows STRUCTURE and PRINCIPLES for p5.js generative art.
7
+ * It does NOT prescribe what art you should create.
8
+ *
9
+ * Your algorithmic philosophy should guide what you build.
10
+ * These are just best practices for how to structure your code.
11
+ *
12
+ * ═══════════════════════════════════════════════════════════════════════════
13
+ */
14
+
15
+ // ============================================================================
16
+ // 1. PARAMETER ORGANIZATION
17
+ // ============================================================================
18
+ // Keep all tunable parameters in one object
19
+ // This makes it easy to:
20
+ // - Connect to UI controls
21
+ // - Reset to defaults
22
+ // - Serialize/save configurations
23
+
24
+ let params = {
25
+ // Define parameters that match YOUR algorithm
26
+ // Examples (customize for your art):
27
+ // - Counts: how many elements (particles, circles, branches, etc.)
28
+ // - Scales: size, speed, spacing
29
+ // - Probabilities: likelihood of events
30
+ // - Angles: rotation, direction
31
+ // - Colors: palette arrays
32
+
33
+ seed: 12345,
34
+ // define colorPalette as an array -- choose whatever colors you'd like ['#d97757', '#6a9bcc', '#788c5d', '#b0aea5']
35
+ // Add YOUR parameters here based on your algorithm
36
+ };
37
+
38
+ // ============================================================================
39
+ // 2. SEEDED RANDOMNESS (Critical for reproducibility)
40
+ // ============================================================================
41
+ // ALWAYS use seeded random for Art Blocks-style reproducible output
42
+
43
+ function initializeSeed(seed) {
44
+ randomSeed(seed);
45
+ noiseSeed(seed);
46
+ // Now all random() and noise() calls will be deterministic
47
+ }
48
+
49
+ // ============================================================================
50
+ // 3. P5.JS LIFECYCLE
51
+ // ============================================================================
52
+
53
+ function setup() {
54
+ createCanvas(800, 800);
55
+
56
+ // Initialize seed first
57
+ initializeSeed(params.seed);
58
+
59
+ // Set up your generative system
60
+ // This is where you initialize:
61
+ // - Arrays of objects
62
+ // - Grid structures
63
+ // - Initial positions
64
+ // - Starting states
65
+
66
+ // For static art: call noLoop() at the end of setup
67
+ // For animated art: let draw() keep running
68
+ }
69
+
70
+ function draw() {
71
+ // Option 1: Static generation (runs once, then stops)
72
+ // - Generate everything in setup()
73
+ // - Call noLoop() in setup()
74
+ // - draw() doesn't do much or can be empty
75
+
76
+ // Option 2: Animated generation (continuous)
77
+ // - Update your system each frame
78
+ // - Common patterns: particle movement, growth, evolution
79
+ // - Can optionally call noLoop() after N frames
80
+
81
+ // Option 3: User-triggered regeneration
82
+ // - Use noLoop() by default
83
+ // - Call redraw() when parameters change
84
+ }
85
+
86
+ // ============================================================================
87
+ // 4. CLASS STRUCTURE (When you need objects)
88
+ // ============================================================================
89
+ // Use classes when your algorithm involves multiple entities
90
+ // Examples: particles, agents, cells, nodes, etc.
91
+
92
+ class Entity {
93
+ constructor() {
94
+ // Initialize entity properties
95
+ // Use random() here - it will be seeded
96
+ }
97
+
98
+ update() {
99
+ // Update entity state
100
+ // This might involve:
101
+ // - Physics calculations
102
+ // - Behavioral rules
103
+ // - Interactions with neighbors
104
+ }
105
+
106
+ display() {
107
+ // Render the entity
108
+ // Keep rendering logic separate from update logic
109
+ }
110
+ }
111
+
112
+ // ============================================================================
113
+ // 5. PERFORMANCE CONSIDERATIONS
114
+ // ============================================================================
115
+
116
+ // For large numbers of elements:
117
+ // - Pre-calculate what you can
118
+ // - Use simple collision detection (spatial hashing if needed)
119
+ // - Limit expensive operations (sqrt, trig) when possible
120
+ // - Consider using p5 vectors efficiently
121
+
122
+ // For smooth animation:
123
+ // - Aim for 60fps
124
+ // - Profile if things are slow
125
+ // - Consider reducing particle counts or simplifying calculations
126
+
127
+ // ============================================================================
128
+ // 6. UTILITY FUNCTIONS
129
+ // ============================================================================
130
+
131
+ // Color utilities
132
+ function hexToRgb(hex) {
133
+ const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
134
+ return result ? {
135
+ r: parseInt(result[1], 16),
136
+ g: parseInt(result[2], 16),
137
+ b: parseInt(result[3], 16)
138
+ } : null;
139
+ }
140
+
141
+ function colorFromPalette(index) {
142
+ return params.colorPalette[index % params.colorPalette.length];
143
+ }
144
+
145
+ // Mapping and easing
146
+ function mapRange(value, inMin, inMax, outMin, outMax) {
147
+ return outMin + (outMax - outMin) * ((value - inMin) / (inMax - inMin));
148
+ }
149
+
150
+ function easeInOutCubic(t) {
151
+ return t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;
152
+ }
153
+
154
+ // Constrain to bounds
155
+ function wrapAround(value, max) {
156
+ if (value < 0) return max;
157
+ if (value > max) return 0;
158
+ return value;
159
+ }
160
+
161
+ // ============================================================================
162
+ // 7. PARAMETER UPDATES (Connect to UI)
163
+ // ============================================================================
164
+
165
+ function updateParameter(paramName, value) {
166
+ params[paramName] = value;
167
+ // Decide if you need to regenerate or just update
168
+ // Some params can update in real-time, others need full regeneration
169
+ }
170
+
171
+ function regenerate() {
172
+ // Reinitialize your generative system
173
+ // Useful when parameters change significantly
174
+ initializeSeed(params.seed);
175
+ // Then regenerate your system
176
+ }
177
+
178
+ // ============================================================================
179
+ // 8. COMMON P5.JS PATTERNS
180
+ // ============================================================================
181
+
182
+ // Drawing with transparency for trails/fading
183
+ function fadeBackground(opacity) {
184
+ fill(250, 249, 245, opacity); // brand light with alpha
185
+ noStroke();
186
+ rect(0, 0, width, height);
187
+ }
188
+
189
+ // Using noise for organic variation
190
+ function getNoiseValue(x, y, scale = 0.01) {
191
+ return noise(x * scale, y * scale);
192
+ }
193
+
194
+ // Creating vectors from angles
195
+ function vectorFromAngle(angle, magnitude = 1) {
196
+ return createVector(cos(angle), sin(angle)).mult(magnitude);
197
+ }
198
+
199
+ // ============================================================================
200
+ // 9. EXPORT FUNCTIONS
201
+ // ============================================================================
202
+
203
+ function exportImage() {
204
+ saveCanvas('generative-art-' + params.seed, 'png');
205
+ }
206
+
207
+ // ============================================================================
208
+ // REMEMBER
209
+ // ============================================================================
210
+ //
211
+ // These are TOOLS and PRINCIPLES, not a recipe.
212
+ // Your algorithmic philosophy should guide WHAT you create.
213
+ // This structure helps you create it WELL.
214
+ //
215
+ // Focus on:
216
+ // - Clean, readable code
217
+ // - Parameterized for exploration
218
+ // - Seeded for reproducibility
219
+ // - Performant execution
220
+ //
221
+ // The art itself is entirely up to you!
222
+ //
223
+ // ============================================================================