@prismer/runtime 2.2.55 → 2.2.63

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 (563) hide show
  1. package/CHANGELOG.md +574 -0
  2. package/apc/skills/releasing-test/SKILL.md +9 -0
  3. package/built-in-skills/agent-coordination/SKILL.md +21 -4
  4. package/built-in-skills/agent-meta/SKILL.md +11 -0
  5. package/built-in-skills/assets/SKILL.md +1 -1
  6. package/built-in-skills/canvas-design/SKILL.md +3 -3
  7. package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-OFL.txt +93 -0
  8. package/built-in-skills/canvas-design/canvas-fonts/InstrumentSerif-OFL.txt +93 -0
  9. package/built-in-skills/canvas-design/canvas-fonts/LICENSE-SOURCES.md +16 -0
  10. package/built-in-skills/claim-agent-ownership/SKILL.md +7 -3
  11. package/built-in-skills/claude-api/SKILL.md +1 -1
  12. package/built-in-skills/claude-api/python/claude-api/README.md +2 -2
  13. package/built-in-skills/claude-api/python/claude-api/tool-use.md +9 -5
  14. package/built-in-skills/claude-api/python/managed-agents/README.md +11 -1
  15. package/built-in-skills/claude-api/shared/error-codes.md +4 -4
  16. package/built-in-skills/claude-api/shared/managed-agents-client-patterns.md +4 -2
  17. package/built-in-skills/claude-api/shared/managed-agents-core.md +1 -2
  18. package/built-in-skills/claude-api/shared/managed-agents-events.md +41 -22
  19. package/built-in-skills/claude-api/shared/managed-agents-multiagent.md +5 -3
  20. package/built-in-skills/claude-api/shared/managed-agents-self-hosted-sandboxes.md +1 -1
  21. package/built-in-skills/claude-api/shared/managed-agents-tools.md +2 -3
  22. package/built-in-skills/claude-api/shared/model-migration.md +3 -3
  23. package/built-in-skills/claude-api/shared/models.md +1 -1
  24. package/built-in-skills/claude-api/typescript/claude-api/batches.md +1 -1
  25. package/built-in-skills/claude-api/typescript/claude-api/files-api.md +3 -1
  26. package/built-in-skills/claude-api/typescript/claude-api/tool-use.md +8 -2
  27. package/built-in-skills/claude-api/typescript/managed-agents/README.md +8 -2
  28. package/built-in-skills/codebase-design/SKILL.md +15 -1
  29. package/built-in-skills/codebase-design/references/requesting-code-review/GUIDE.md +291 -0
  30. package/built-in-skills/codebase-design/references/requesting-code-review/LICENSE +21 -0
  31. package/built-in-skills/codebase-design/references/requesting-code-review/LICENSE.superpowers +21 -0
  32. package/built-in-skills/codebase-design/references/requesting-code-review/NOTICE.md +37 -0
  33. package/built-in-skills/codebase-design/references/sdlc-review/GUIDE.md +130 -0
  34. package/built-in-skills/codebase-design/references/sdlc-review/LICENSE +21 -0
  35. package/built-in-skills/codebase-design/references/sdlc-review/NOTICE.md +17 -0
  36. package/built-in-skills/codebase-design/references/simplify-code/GUIDE.md +269 -0
  37. package/built-in-skills/codebase-design/references/simplify-code/LICENSE +21 -0
  38. package/built-in-skills/codebase-design/references/simplify-code/NOTICE.md +37 -0
  39. package/built-in-skills/competitor-intelligence/LICENSE +21 -0
  40. package/built-in-skills/competitor-intelligence/NOTICE.md +6 -0
  41. package/built-in-skills/competitor-intelligence/SKILL.md +125 -0
  42. package/built-in-skills/competitor-intelligence/scripts/watch_state.py +160 -0
  43. package/built-in-skills/conversation-compaction/SKILL.md +3 -0
  44. package/built-in-skills/council-creator/SKILL.md +4 -3
  45. package/built-in-skills/diagnosing-bugs/SKILL.md +12 -0
  46. package/built-in-skills/diagnosing-bugs/references/desktop-dom/GUIDE.md +64 -0
  47. package/built-in-skills/diagnosing-bugs/references/desktop-dom/LICENSE +21 -0
  48. package/built-in-skills/diagnosing-bugs/references/desktop-dom/NOTICE.md +17 -0
  49. package/built-in-skills/diagnosing-bugs/references/systematic-debugging/GUIDE.md +410 -0
  50. package/built-in-skills/diagnosing-bugs/references/systematic-debugging/LICENSE +21 -0
  51. package/built-in-skills/diagnosing-bugs/references/systematic-debugging/LICENSE.superpowers +21 -0
  52. package/built-in-skills/diagnosing-bugs/references/systematic-debugging/NOTICE.md +37 -0
  53. package/built-in-skills/doc-coauthoring/SKILL.md +6 -0
  54. package/built-in-skills/doc-coauthoring/references/humanizer/GUIDE.md +647 -0
  55. package/built-in-skills/doc-coauthoring/references/humanizer/LICENSE +21 -0
  56. package/built-in-skills/doc-coauthoring/references/humanizer/LICENSE.hermes +21 -0
  57. package/built-in-skills/doc-coauthoring/references/humanizer/PROVENANCE.md +7 -0
  58. package/built-in-skills/document-actions/LICENSE +21 -0
  59. package/built-in-skills/document-actions/NOTICE.md +21 -0
  60. package/built-in-skills/document-actions/SKILL.md +46 -0
  61. package/built-in-skills/evidence-citations/LICENSE +21 -0
  62. package/built-in-skills/evidence-citations/NOTICE.md +21 -0
  63. package/built-in-skills/evidence-citations/SKILL.md +46 -0
  64. package/built-in-skills/evidence-citations/references/citation-formats.md +68 -0
  65. package/built-in-skills/evidence-citations/references/grounding-rationale.md +64 -0
  66. package/built-in-skills/evidence-citations/scripts/sources.py +720 -0
  67. package/built-in-skills/frontend-design/SKILL.md +6 -0
  68. package/built-in-skills/frontend-design/references/claude-design/GUIDE.md +650 -0
  69. package/built-in-skills/frontend-design/references/claude-design/LICENSE +21 -0
  70. package/built-in-skills/frontend-design/references/claude-design/LICENSE.hermes +21 -0
  71. package/built-in-skills/frontend-design/references/claude-design/PROVENANCE.md +7 -0
  72. package/built-in-skills/image-generate/SKILL.md +5 -0
  73. package/built-in-skills/image-generate/scripts/generate-and-deliver.mjs +24 -3
  74. package/built-in-skills/mcp-builder/reference/evaluation.md +11 -2
  75. package/built-in-skills/mcp-builder/reference/node_mcp_server.md +34 -5
  76. package/built-in-skills/mcp-builder/reference/python_mcp_server.md +6 -2
  77. package/built-in-skills/mcp-builder/scripts/connections.py +1 -1
  78. package/built-in-skills/mcp-builder/scripts/evaluation.py +52 -34
  79. package/built-in-skills/mcp-builder/scripts/requirements.txt +2 -2
  80. package/built-in-skills/meeting-actions/LICENSE +21 -0
  81. package/built-in-skills/meeting-actions/NOTICE.md +21 -0
  82. package/built-in-skills/meeting-actions/SKILL.md +48 -0
  83. package/built-in-skills/memory/SKILL.md +27 -3
  84. package/built-in-skills/memory/references/llm-wiki/GUIDE.md +468 -0
  85. package/built-in-skills/memory/references/llm-wiki/LICENSE +21 -0
  86. package/built-in-skills/memory/references/llm-wiki/NOTICE.md +4 -0
  87. package/built-in-skills/memory/references/llm-wiki/scripts/lint_wiki.py +84 -0
  88. package/built-in-skills/memory/references/llm-wiki/scripts/requirements.txt +1 -0
  89. package/built-in-skills/memory/references/llm-wiki/templates/SCHEMA.md +19 -0
  90. package/built-in-skills/memory/references/llm-wiki/templates/index.md +9 -0
  91. package/built-in-skills/memory/references/llm-wiki/templates/log.md +4 -0
  92. package/built-in-skills/memory-dream/SKILL.md +8 -15
  93. package/built-in-skills/memory-import/SKILL.md +51 -0
  94. package/built-in-skills/office-artifacts/NOTICE.md +15 -0
  95. package/built-in-skills/office-artifacts/SKILL.md +20 -0
  96. package/built-in-skills/office-artifacts/references/RESOURCE-LIMITS.md +44 -0
  97. package/built-in-skills/office-artifacts/references/docx/GUIDE.md +196 -0
  98. package/built-in-skills/office-artifacts/references/docx/LICENSE +21 -0
  99. package/built-in-skills/office-artifacts/references/docx/NOTICE.md +21 -0
  100. package/built-in-skills/office-artifacts/references/docx/references/revisions-and-comments.md +88 -0
  101. package/built-in-skills/office-artifacts/references/docx/scripts/docx_comments.py +292 -0
  102. package/built-in-skills/office-artifacts/references/docx/scripts/docx_common.py +93 -0
  103. package/built-in-skills/office-artifacts/references/docx/scripts/docx_create.py +177 -0
  104. package/built-in-skills/office-artifacts/references/docx/scripts/docx_edit.py +250 -0
  105. package/built-in-skills/office-artifacts/references/docx/scripts/docx_read.py +169 -0
  106. package/built-in-skills/office-artifacts/references/docx/scripts/docx_revisions.py +149 -0
  107. package/built-in-skills/office-artifacts/references/docx/scripts/docx_template.py +70 -0
  108. package/built-in-skills/office-artifacts/references/docx/scripts/docx_validate.py +155 -0
  109. package/built-in-skills/office-artifacts/references/docx/tests/test_docx_skill.py +525 -0
  110. package/built-in-skills/office-artifacts/references/pdf/GUIDE.md +125 -0
  111. package/built-in-skills/office-artifacts/references/pdf/LICENSE +21 -0
  112. package/built-in-skills/office-artifacts/references/pdf/NOTICE.md +21 -0
  113. package/built-in-skills/office-artifacts/references/pdf/references/forms.md +99 -0
  114. package/built-in-skills/office-artifacts/references/pdf/references/nano-pdf-editing.md +40 -0
  115. package/built-in-skills/office-artifacts/references/pdf/references/ocr-extraction.md +165 -0
  116. package/built-in-skills/office-artifacts/references/pdf/scripts/_raster.py +87 -0
  117. package/built-in-skills/office-artifacts/references/pdf/scripts/extract_marker.py +95 -0
  118. package/built-in-skills/office-artifacts/references/pdf/scripts/extract_pymupdf.py +107 -0
  119. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_create.py +153 -0
  120. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_fill_form.py +97 -0
  121. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_form_layout.py +168 -0
  122. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_make_form.py +145 -0
  123. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_merge.py +50 -0
  124. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_meta.py +123 -0
  125. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_page_image.py +101 -0
  126. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_read.py +153 -0
  127. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_secure.py +71 -0
  128. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_split.py +86 -0
  129. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_stamp.py +145 -0
  130. package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_watermark.py +51 -0
  131. package/built-in-skills/office-artifacts/references/pdf/tests/test_pdf_skill.py +414 -0
  132. package/built-in-skills/office-artifacts/references/powerpoint/GUIDE.md +220 -0
  133. package/built-in-skills/office-artifacts/references/powerpoint/LICENSE +21 -0
  134. package/built-in-skills/office-artifacts/references/powerpoint/NOTICE.md +21 -0
  135. package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_create.py +214 -0
  136. package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_edit.py +442 -0
  137. package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_from_template.py +88 -0
  138. package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_read.py +131 -0
  139. package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_render.py +104 -0
  140. package/built-in-skills/office-artifacts/references/powerpoint/tests/test_powerpoint_skill.py +478 -0
  141. package/built-in-skills/office-artifacts/references/xlsx/GUIDE.md +196 -0
  142. package/built-in-skills/office-artifacts/references/xlsx/LICENSE +21 -0
  143. package/built-in-skills/office-artifacts/references/xlsx/NOTICE.md +21 -0
  144. package/built-in-skills/office-artifacts/references/xlsx/references/restructuring.md +74 -0
  145. package/built-in-skills/office-artifacts/references/xlsx/scripts/csv_to_xlsx.py +108 -0
  146. package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_create.py +259 -0
  147. package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_edit.py +269 -0
  148. package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_read.py +160 -0
  149. package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_recalc.py +111 -0
  150. package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_restructure.py +418 -0
  151. package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_to_csv.py +69 -0
  152. package/built-in-skills/office-artifacts/references/xlsx/tests/test_xlsx_skill.py +542 -0
  153. package/built-in-skills/office-artifacts/tests/test_resource_regressions.py +272 -0
  154. package/built-in-skills/persona-generator/SKILL.md +9 -9
  155. package/built-in-skills/pkf-svg/SKILL.md +5 -0
  156. package/built-in-skills/pkf-svg/references/architecture-diagram/GUIDE.md +148 -0
  157. package/built-in-skills/pkf-svg/references/architecture-diagram/LICENSE +21 -0
  158. package/built-in-skills/pkf-svg/references/architecture-diagram/LICENSE.hermes +21 -0
  159. package/built-in-skills/pkf-svg/references/architecture-diagram/PROVENANCE.md +7 -0
  160. package/built-in-skills/pkf-svg/references/architecture-diagram/templates/template.html +345 -0
  161. package/built-in-skills/pkf-writing/SKILL.md +36 -14
  162. package/built-in-skills/prismer-airtable/LICENSE +21 -0
  163. package/built-in-skills/prismer-airtable/NOTICE.md +11 -0
  164. package/built-in-skills/prismer-airtable/SKILL.md +248 -0
  165. package/built-in-skills/prismer-airtable/scripts/airtable_client.py +76 -0
  166. package/built-in-skills/prismer-apple-notes/LICENSE +21 -0
  167. package/built-in-skills/prismer-apple-notes/NOTICE.md +17 -0
  168. package/built-in-skills/prismer-apple-notes/SKILL.md +118 -0
  169. package/built-in-skills/prismer-apple-notes/scripts/readiness.py +47 -0
  170. package/built-in-skills/prismer-apple-reminders/LICENSE +21 -0
  171. package/built-in-skills/prismer-apple-reminders/NOTICE.md +17 -0
  172. package/built-in-skills/prismer-apple-reminders/SKILL.md +155 -0
  173. package/built-in-skills/prismer-apple-reminders/scripts/readiness.py +47 -0
  174. package/built-in-skills/prismer-ascii-video/LICENSE +21 -0
  175. package/built-in-skills/prismer-ascii-video/LICENSE.hermes +21 -0
  176. package/built-in-skills/prismer-ascii-video/PROVENANCE.md +7 -0
  177. package/built-in-skills/prismer-ascii-video/README.md +290 -0
  178. package/built-in-skills/prismer-ascii-video/SKILL.md +252 -0
  179. package/built-in-skills/prismer-ascii-video/provenance/category-DESCRIPTION.md +3 -0
  180. package/built-in-skills/prismer-ascii-video/references/architecture.md +807 -0
  181. package/built-in-skills/prismer-ascii-video/references/composition.md +900 -0
  182. package/built-in-skills/prismer-ascii-video/references/effects.md +1877 -0
  183. package/built-in-skills/prismer-ascii-video/references/inputs.md +693 -0
  184. package/built-in-skills/prismer-ascii-video/references/optimization.md +688 -0
  185. package/built-in-skills/prismer-ascii-video/references/scenes.md +1018 -0
  186. package/built-in-skills/prismer-ascii-video/references/shaders.md +1408 -0
  187. package/built-in-skills/prismer-ascii-video/references/troubleshooting.md +360 -0
  188. package/built-in-skills/prismer-baoyu-infographic/LICENSE +21 -0
  189. package/built-in-skills/prismer-baoyu-infographic/LICENSE.hermes +21 -0
  190. package/built-in-skills/prismer-baoyu-infographic/LICENSE.origin +21 -0
  191. package/built-in-skills/prismer-baoyu-infographic/PORT_NOTES.md +37 -0
  192. package/built-in-skills/prismer-baoyu-infographic/PROVENANCE.md +7 -0
  193. package/built-in-skills/prismer-baoyu-infographic/SKILL.md +240 -0
  194. package/built-in-skills/prismer-baoyu-infographic/references/analysis-framework.md +182 -0
  195. package/built-in-skills/prismer-baoyu-infographic/references/base-prompt.md +43 -0
  196. package/built-in-skills/prismer-baoyu-infographic/references/layouts/bento-grid.md +41 -0
  197. package/built-in-skills/prismer-baoyu-infographic/references/layouts/binary-comparison.md +48 -0
  198. package/built-in-skills/prismer-baoyu-infographic/references/layouts/bridge.md +41 -0
  199. package/built-in-skills/prismer-baoyu-infographic/references/layouts/circular-flow.md +41 -0
  200. package/built-in-skills/prismer-baoyu-infographic/references/layouts/comic-strip.md +41 -0
  201. package/built-in-skills/prismer-baoyu-infographic/references/layouts/comparison-matrix.md +41 -0
  202. package/built-in-skills/prismer-baoyu-infographic/references/layouts/dashboard.md +41 -0
  203. package/built-in-skills/prismer-baoyu-infographic/references/layouts/dense-modules.md +72 -0
  204. package/built-in-skills/prismer-baoyu-infographic/references/layouts/funnel.md +41 -0
  205. package/built-in-skills/prismer-baoyu-infographic/references/layouts/hierarchical-layers.md +48 -0
  206. package/built-in-skills/prismer-baoyu-infographic/references/layouts/hub-spoke.md +41 -0
  207. package/built-in-skills/prismer-baoyu-infographic/references/layouts/iceberg.md +41 -0
  208. package/built-in-skills/prismer-baoyu-infographic/references/layouts/isometric-map.md +41 -0
  209. package/built-in-skills/prismer-baoyu-infographic/references/layouts/jigsaw.md +41 -0
  210. package/built-in-skills/prismer-baoyu-infographic/references/layouts/linear-progression.md +48 -0
  211. package/built-in-skills/prismer-baoyu-infographic/references/layouts/periodic-table.md +41 -0
  212. package/built-in-skills/prismer-baoyu-infographic/references/layouts/story-mountain.md +41 -0
  213. package/built-in-skills/prismer-baoyu-infographic/references/layouts/structural-breakdown.md +48 -0
  214. package/built-in-skills/prismer-baoyu-infographic/references/layouts/tree-branching.md +41 -0
  215. package/built-in-skills/prismer-baoyu-infographic/references/layouts/venn-diagram.md +41 -0
  216. package/built-in-skills/prismer-baoyu-infographic/references/layouts/winding-roadmap.md +41 -0
  217. package/built-in-skills/prismer-baoyu-infographic/references/structured-content-template.md +244 -0
  218. package/built-in-skills/prismer-baoyu-infographic/references/styles/aged-academia.md +36 -0
  219. package/built-in-skills/prismer-baoyu-infographic/references/styles/bold-graphic.md +36 -0
  220. package/built-in-skills/prismer-baoyu-infographic/references/styles/chalkboard.md +61 -0
  221. package/built-in-skills/prismer-baoyu-infographic/references/styles/claymation.md +29 -0
  222. package/built-in-skills/prismer-baoyu-infographic/references/styles/corporate-memphis.md +29 -0
  223. package/built-in-skills/prismer-baoyu-infographic/references/styles/craft-handmade.md +44 -0
  224. package/built-in-skills/prismer-baoyu-infographic/references/styles/cyberpunk-neon.md +29 -0
  225. package/built-in-skills/prismer-baoyu-infographic/references/styles/hand-drawn-edu.md +63 -0
  226. package/built-in-skills/prismer-baoyu-infographic/references/styles/ikea-manual.md +29 -0
  227. package/built-in-skills/prismer-baoyu-infographic/references/styles/kawaii.md +29 -0
  228. package/built-in-skills/prismer-baoyu-infographic/references/styles/knolling.md +29 -0
  229. package/built-in-skills/prismer-baoyu-infographic/references/styles/lego-brick.md +29 -0
  230. package/built-in-skills/prismer-baoyu-infographic/references/styles/morandi-journal.md +60 -0
  231. package/built-in-skills/prismer-baoyu-infographic/references/styles/origami.md +29 -0
  232. package/built-in-skills/prismer-baoyu-infographic/references/styles/pixel-art.md +29 -0
  233. package/built-in-skills/prismer-baoyu-infographic/references/styles/pop-laboratory.md +48 -0
  234. package/built-in-skills/prismer-baoyu-infographic/references/styles/retro-pop-grid.md +47 -0
  235. package/built-in-skills/prismer-baoyu-infographic/references/styles/storybook-watercolor.md +29 -0
  236. package/built-in-skills/prismer-baoyu-infographic/references/styles/subway-map.md +29 -0
  237. package/built-in-skills/prismer-baoyu-infographic/references/styles/technical-schematic.md +36 -0
  238. package/built-in-skills/prismer-baoyu-infographic/references/styles/ui-wireframe.md +29 -0
  239. package/built-in-skills/prismer-blocked-page-recovery/LICENSE +21 -0
  240. package/built-in-skills/prismer-blocked-page-recovery/NOTICE.md +17 -0
  241. package/built-in-skills/prismer-blocked-page-recovery/SKILL.md +158 -0
  242. package/built-in-skills/prismer-blocked-page-recovery/scripts/recover_page.py +311 -0
  243. package/built-in-skills/prismer-box/LICENSE +21 -0
  244. package/built-in-skills/prismer-box/NOTICE.md +11 -0
  245. package/built-in-skills/prismer-box/SKILL.md +147 -0
  246. package/built-in-skills/prismer-box/references/bulk-operations.md +43 -0
  247. package/built-in-skills/prismer-box/references/cli-guide.md +133 -0
  248. package/built-in-skills/prismer-box/references/content-workflows.md +86 -0
  249. package/built-in-skills/prismer-box/references/hubs.md +77 -0
  250. package/built-in-skills/prismer-box/references/oauth-setup.md +92 -0
  251. package/built-in-skills/prismer-box/references/rest-api.md +37 -0
  252. package/built-in-skills/prismer-box/references/sdk-development.md +85 -0
  253. package/built-in-skills/prismer-box/references/search-and-ai.md +147 -0
  254. package/built-in-skills/prismer-box/references/troubleshooting.md +33 -0
  255. package/built-in-skills/prismer-box/references/webhooks-and-events.md +43 -0
  256. package/built-in-skills/prismer-codebase-inspection/LICENSE +21 -0
  257. package/built-in-skills/prismer-codebase-inspection/NOTICE.md +17 -0
  258. package/built-in-skills/prismer-codebase-inspection/SKILL.md +141 -0
  259. package/built-in-skills/prismer-computer-use/LICENSE +21 -0
  260. package/built-in-skills/prismer-computer-use/NOTICE.md +17 -0
  261. package/built-in-skills/prismer-computer-use/SKILL.md +372 -0
  262. package/built-in-skills/prismer-design-md/LICENSE +21 -0
  263. package/built-in-skills/prismer-design-md/LICENSE.hermes +21 -0
  264. package/built-in-skills/prismer-design-md/PROVENANCE.md +7 -0
  265. package/built-in-skills/prismer-design-md/SKILL.md +227 -0
  266. package/built-in-skills/prismer-design-md/templates/starter.md +99 -0
  267. package/built-in-skills/prismer-email-inbox-triage/LICENSE +21 -0
  268. package/built-in-skills/prismer-email-inbox-triage/NOTICE.md +11 -0
  269. package/built-in-skills/prismer-email-inbox-triage/SKILL.md +116 -0
  270. package/built-in-skills/prismer-findmy/LICENSE +21 -0
  271. package/built-in-skills/prismer-findmy/NOTICE.md +17 -0
  272. package/built-in-skills/prismer-findmy/SKILL.md +150 -0
  273. package/built-in-skills/prismer-findmy/scripts/readiness.py +47 -0
  274. package/built-in-skills/prismer-gif-search/LICENSE +21 -0
  275. package/built-in-skills/prismer-gif-search/LICENSE.hermes +21 -0
  276. package/built-in-skills/prismer-gif-search/PROVENANCE.md +7 -0
  277. package/built-in-skills/prismer-gif-search/SKILL.md +97 -0
  278. package/built-in-skills/prismer-gif-search/scripts/tenor.py +81 -0
  279. package/built-in-skills/prismer-github/LICENSE +21 -0
  280. package/built-in-skills/prismer-github/NOTICE.md +17 -0
  281. package/built-in-skills/prismer-github/SKILL.md +74 -0
  282. package/built-in-skills/prismer-github/references/auth.md +91 -0
  283. package/built-in-skills/prismer-github/references/ci-troubleshooting.md +193 -0
  284. package/built-in-skills/prismer-github/references/code-review.md +465 -0
  285. package/built-in-skills/prismer-github/references/conventional-commits.md +81 -0
  286. package/built-in-skills/prismer-github/references/github-api-cheatsheet.md +177 -0
  287. package/built-in-skills/prismer-github/references/issue-to-pr.md +74 -0
  288. package/built-in-skills/prismer-github/references/issues.md +336 -0
  289. package/built-in-skills/prismer-github/references/pr-workflow.md +346 -0
  290. package/built-in-skills/prismer-github/references/repo-management.md +484 -0
  291. package/built-in-skills/prismer-github/references/review-output-template.md +84 -0
  292. package/built-in-skills/prismer-github/scripts/ensure-gh.py +132 -0
  293. package/built-in-skills/prismer-github/scripts/gh-env.sh +25 -0
  294. package/built-in-skills/prismer-github/scripts/git-credential-token.py +68 -0
  295. package/built-in-skills/prismer-github/scripts/github-api.py +71 -0
  296. package/built-in-skills/prismer-github/scripts/github-context.py +28 -0
  297. package/built-in-skills/prismer-github/templates/bug-report.md +35 -0
  298. package/built-in-skills/prismer-github/templates/feature-request.md +31 -0
  299. package/built-in-skills/prismer-github/templates/pr-body-bugfix.md +35 -0
  300. package/built-in-skills/prismer-github/templates/pr-body-feature.md +33 -0
  301. package/built-in-skills/prismer-google-workspace/LICENSE +21 -0
  302. package/built-in-skills/prismer-google-workspace/NOTICE.md +11 -0
  303. package/built-in-skills/prismer-google-workspace/SKILL.md +369 -0
  304. package/built-in-skills/prismer-google-workspace/references/daily-brief.md +65 -0
  305. package/built-in-skills/prismer-google-workspace/references/gmail-search-syntax.md +63 -0
  306. package/built-in-skills/prismer-google-workspace/scripts/_hermes_home.py +17 -0
  307. package/built-in-skills/prismer-google-workspace/scripts/_private_state.py +39 -0
  308. package/built-in-skills/prismer-google-workspace/scripts/google_api.py +1339 -0
  309. package/built-in-skills/prismer-google-workspace/scripts/gws_bridge.py +121 -0
  310. package/built-in-skills/prismer-google-workspace/scripts/setup.py +563 -0
  311. package/built-in-skills/prismer-google-workspace/tests/test_productivity_regressions.py +214 -0
  312. package/built-in-skills/prismer-hermes-agent/LICENSE +21 -0
  313. package/built-in-skills/prismer-hermes-agent/NOTICE.md +17 -0
  314. package/built-in-skills/prismer-hermes-agent/SKILL.md +247 -0
  315. package/built-in-skills/prismer-hermes-agent/references/background-systems.md +108 -0
  316. package/built-in-skills/prismer-hermes-agent/references/cli-reference.md +158 -0
  317. package/built-in-skills/prismer-hermes-agent/references/configuration.md +96 -0
  318. package/built-in-skills/prismer-hermes-agent/references/contributor-guide.md +151 -0
  319. package/built-in-skills/prismer-hermes-agent/references/delegate-task-concurrency-diagnosis.md +47 -0
  320. package/built-in-skills/prismer-hermes-agent/references/desktop-plugins.md +215 -0
  321. package/built-in-skills/prismer-hermes-agent/references/native-mcp.md +351 -0
  322. package/built-in-skills/prismer-hermes-agent/references/petdex.md +82 -0
  323. package/built-in-skills/prismer-hermes-agent/references/portal-auth-for-third-party-apps.md +135 -0
  324. package/built-in-skills/prismer-hermes-agent/references/project-context-files.md +55 -0
  325. package/built-in-skills/prismer-hermes-agent/references/providers-and-models.md +81 -0
  326. package/built-in-skills/prismer-hermes-agent/references/security-privacy.md +73 -0
  327. package/built-in-skills/prismer-hermes-agent/references/slash-commands.md +119 -0
  328. package/built-in-skills/prismer-hermes-agent/references/themes.md +134 -0
  329. package/built-in-skills/prismer-hermes-agent/references/troubleshooting.md +87 -0
  330. package/built-in-skills/prismer-hermes-agent/references/tui-widgets.md +144 -0
  331. package/built-in-skills/prismer-hermes-agent/references/webhooks.md +219 -0
  332. package/built-in-skills/prismer-hermes-agent/references/windows-quirks.md +64 -0
  333. package/built-in-skills/prismer-hermes-agent/templates/clock.mjs +51 -0
  334. package/built-in-skills/prismer-hermes-agent/templates/plugin.js +97 -0
  335. package/built-in-skills/prismer-hermes-agent/templates/skin.yaml +49 -0
  336. package/built-in-skills/prismer-himalaya/LICENSE +21 -0
  337. package/built-in-skills/prismer-himalaya/NOTICE.md +11 -0
  338. package/built-in-skills/prismer-himalaya/SKILL.md +340 -0
  339. package/built-in-skills/prismer-himalaya/references/configuration.md +227 -0
  340. package/built-in-skills/prismer-himalaya/references/message-composition.md +206 -0
  341. package/built-in-skills/prismer-himalaya/scripts/compose_draft.py +48 -0
  342. package/built-in-skills/prismer-im-collab/SKILL.md +1 -1
  343. package/built-in-skills/prismer-imessage/LICENSE +21 -0
  344. package/built-in-skills/prismer-imessage/NOTICE.md +17 -0
  345. package/built-in-skills/prismer-imessage/SKILL.md +128 -0
  346. package/built-in-skills/prismer-imessage/scripts/readiness.py +47 -0
  347. package/built-in-skills/prismer-manim-video/LICENSE +21 -0
  348. package/built-in-skills/prismer-manim-video/LICENSE.hermes +21 -0
  349. package/built-in-skills/prismer-manim-video/PROVENANCE.md +7 -0
  350. package/built-in-skills/prismer-manim-video/README.md +23 -0
  351. package/built-in-skills/prismer-manim-video/SKILL.md +279 -0
  352. package/built-in-skills/prismer-manim-video/references/animation-design-thinking.md +161 -0
  353. package/built-in-skills/prismer-manim-video/references/animations.md +282 -0
  354. package/built-in-skills/prismer-manim-video/references/camera-and-3d.md +135 -0
  355. package/built-in-skills/prismer-manim-video/references/decorations.md +202 -0
  356. package/built-in-skills/prismer-manim-video/references/equations.md +216 -0
  357. package/built-in-skills/prismer-manim-video/references/graphs-and-data.md +163 -0
  358. package/built-in-skills/prismer-manim-video/references/mobjects.md +333 -0
  359. package/built-in-skills/prismer-manim-video/references/paper-explainer.md +255 -0
  360. package/built-in-skills/prismer-manim-video/references/production-quality.md +190 -0
  361. package/built-in-skills/prismer-manim-video/references/rendering.md +187 -0
  362. package/built-in-skills/prismer-manim-video/references/scene-planning.md +118 -0
  363. package/built-in-skills/prismer-manim-video/references/troubleshooting.md +135 -0
  364. package/built-in-skills/prismer-manim-video/references/updaters-and-trackers.md +260 -0
  365. package/built-in-skills/prismer-manim-video/references/visual-design.md +124 -0
  366. package/built-in-skills/prismer-manim-video/scripts/setup.sh +15 -0
  367. package/built-in-skills/prismer-maps/LICENSE +21 -0
  368. package/built-in-skills/prismer-maps/NOTICE.md +11 -0
  369. package/built-in-skills/prismer-maps/SKILL.md +240 -0
  370. package/built-in-skills/prismer-maps/scripts/maps_client.py +1324 -0
  371. package/built-in-skills/prismer-node-inspect-debugger/LICENSE +21 -0
  372. package/built-in-skills/prismer-node-inspect-debugger/NOTICE.md +17 -0
  373. package/built-in-skills/prismer-node-inspect-debugger/SKILL.md +347 -0
  374. package/built-in-skills/prismer-notion/LICENSE +21 -0
  375. package/built-in-skills/prismer-notion/NOTICE.md +11 -0
  376. package/built-in-skills/prismer-notion/SKILL.md +495 -0
  377. package/built-in-skills/prismer-notion/references/block-types.md +112 -0
  378. package/built-in-skills/prismer-obsidian/LICENSE +21 -0
  379. package/built-in-skills/prismer-obsidian/LICENSE.hermes +21 -0
  380. package/built-in-skills/prismer-obsidian/PROVENANCE.md +7 -0
  381. package/built-in-skills/prismer-obsidian/SKILL.md +80 -0
  382. package/built-in-skills/prismer-obsidian/provenance/category-DESCRIPTION.md +3 -0
  383. package/built-in-skills/prismer-obsidian/scripts/write_note.py +84 -0
  384. package/built-in-skills/prismer-p5js/LICENSE +21 -0
  385. package/built-in-skills/prismer-p5js/LICENSE.hermes +21 -0
  386. package/built-in-skills/prismer-p5js/PROVENANCE.md +7 -0
  387. package/built-in-skills/prismer-p5js/README.md +64 -0
  388. package/built-in-skills/prismer-p5js/SKILL.md +574 -0
  389. package/built-in-skills/prismer-p5js/references/animation.md +439 -0
  390. package/built-in-skills/prismer-p5js/references/color-systems.md +355 -0
  391. package/built-in-skills/prismer-p5js/references/core-api.md +410 -0
  392. package/built-in-skills/prismer-p5js/references/export-pipeline.md +534 -0
  393. package/built-in-skills/prismer-p5js/references/interaction.md +398 -0
  394. package/built-in-skills/prismer-p5js/references/shapes-and-geometry.md +300 -0
  395. package/built-in-skills/prismer-p5js/references/troubleshooting.md +532 -0
  396. package/built-in-skills/prismer-p5js/references/typography.md +302 -0
  397. package/built-in-skills/prismer-p5js/references/visual-effects.md +905 -0
  398. package/built-in-skills/prismer-p5js/references/webgl-and-3d.md +423 -0
  399. package/built-in-skills/prismer-p5js/scripts/export-frames.js +91 -0
  400. package/built-in-skills/prismer-p5js/scripts/render.sh +113 -0
  401. package/built-in-skills/prismer-p5js/scripts/serve.sh +25 -0
  402. package/built-in-skills/prismer-p5js/scripts/setup.sh +87 -0
  403. package/built-in-skills/prismer-p5js/templates/viewer.html +401 -0
  404. package/built-in-skills/prismer-popular-web-designs/LICENSE +21 -0
  405. package/built-in-skills/prismer-popular-web-designs/LICENSE.hermes +21 -0
  406. package/built-in-skills/prismer-popular-web-designs/LICENSE.origin +21 -0
  407. package/built-in-skills/prismer-popular-web-designs/PROVENANCE.md +7 -0
  408. package/built-in-skills/prismer-popular-web-designs/SKILL.md +218 -0
  409. package/built-in-skills/prismer-popular-web-designs/templates/airbnb.md +259 -0
  410. package/built-in-skills/prismer-popular-web-designs/templates/airtable.md +102 -0
  411. package/built-in-skills/prismer-popular-web-designs/templates/apple.md +326 -0
  412. package/built-in-skills/prismer-popular-web-designs/templates/bmw.md +193 -0
  413. package/built-in-skills/prismer-popular-web-designs/templates/cal.md +272 -0
  414. package/built-in-skills/prismer-popular-web-designs/templates/claude.md +325 -0
  415. package/built-in-skills/prismer-popular-web-designs/templates/clay.md +317 -0
  416. package/built-in-skills/prismer-popular-web-designs/templates/clickhouse.md +294 -0
  417. package/built-in-skills/prismer-popular-web-designs/templates/cohere.md +279 -0
  418. package/built-in-skills/prismer-popular-web-designs/templates/coinbase.md +142 -0
  419. package/built-in-skills/prismer-popular-web-designs/templates/composio.md +320 -0
  420. package/built-in-skills/prismer-popular-web-designs/templates/cursor.md +322 -0
  421. package/built-in-skills/prismer-popular-web-designs/templates/elevenlabs.md +278 -0
  422. package/built-in-skills/prismer-popular-web-designs/templates/expo.md +294 -0
  423. package/built-in-skills/prismer-popular-web-designs/templates/figma.md +233 -0
  424. package/built-in-skills/prismer-popular-web-designs/templates/framer.md +259 -0
  425. package/built-in-skills/prismer-popular-web-designs/templates/hashicorp.md +291 -0
  426. package/built-in-skills/prismer-popular-web-designs/templates/ibm.md +345 -0
  427. package/built-in-skills/prismer-popular-web-designs/templates/intercom.md +159 -0
  428. package/built-in-skills/prismer-popular-web-designs/templates/kraken.md +138 -0
  429. package/built-in-skills/prismer-popular-web-designs/templates/linear.app.md +380 -0
  430. package/built-in-skills/prismer-popular-web-designs/templates/lovable.md +311 -0
  431. package/built-in-skills/prismer-popular-web-designs/templates/minimax.md +270 -0
  432. package/built-in-skills/prismer-popular-web-designs/templates/mintlify.md +339 -0
  433. package/built-in-skills/prismer-popular-web-designs/templates/miro.md +121 -0
  434. package/built-in-skills/prismer-popular-web-designs/templates/mistral.ai.md +274 -0
  435. package/built-in-skills/prismer-popular-web-designs/templates/mongodb.md +279 -0
  436. package/built-in-skills/prismer-popular-web-designs/templates/notion.md +322 -0
  437. package/built-in-skills/prismer-popular-web-designs/templates/nvidia.md +306 -0
  438. package/built-in-skills/prismer-popular-web-designs/templates/ollama.md +280 -0
  439. package/built-in-skills/prismer-popular-web-designs/templates/opencode.ai.md +294 -0
  440. package/built-in-skills/prismer-popular-web-designs/templates/pinterest.md +243 -0
  441. package/built-in-skills/prismer-popular-web-designs/templates/posthog.md +269 -0
  442. package/built-in-skills/prismer-popular-web-designs/templates/raycast.md +281 -0
  443. package/built-in-skills/prismer-popular-web-designs/templates/replicate.md +274 -0
  444. package/built-in-skills/prismer-popular-web-designs/templates/resend.md +316 -0
  445. package/built-in-skills/prismer-popular-web-designs/templates/revolut.md +198 -0
  446. package/built-in-skills/prismer-popular-web-designs/templates/runwayml.md +257 -0
  447. package/built-in-skills/prismer-popular-web-designs/templates/sanity.md +370 -0
  448. package/built-in-skills/prismer-popular-web-designs/templates/sentry.md +275 -0
  449. package/built-in-skills/prismer-popular-web-designs/templates/spacex.md +207 -0
  450. package/built-in-skills/prismer-popular-web-designs/templates/spotify.md +259 -0
  451. package/built-in-skills/prismer-popular-web-designs/templates/stripe.md +335 -0
  452. package/built-in-skills/prismer-popular-web-designs/templates/supabase.md +268 -0
  453. package/built-in-skills/prismer-popular-web-designs/templates/superhuman.md +265 -0
  454. package/built-in-skills/prismer-popular-web-designs/templates/together.ai.md +276 -0
  455. package/built-in-skills/prismer-popular-web-designs/templates/uber.md +308 -0
  456. package/built-in-skills/prismer-popular-web-designs/templates/vercel.md +323 -0
  457. package/built-in-skills/prismer-popular-web-designs/templates/voltagent.md +336 -0
  458. package/built-in-skills/prismer-popular-web-designs/templates/warp.md +266 -0
  459. package/built-in-skills/prismer-popular-web-designs/templates/webflow.md +105 -0
  460. package/built-in-skills/prismer-popular-web-designs/templates/wise.md +186 -0
  461. package/built-in-skills/prismer-popular-web-designs/templates/x.ai.md +270 -0
  462. package/built-in-skills/prismer-popular-web-designs/templates/zapier.md +341 -0
  463. package/built-in-skills/prismer-product-price-monitor/LICENSE +21 -0
  464. package/built-in-skills/prismer-product-price-monitor/NOTICE.md +11 -0
  465. package/built-in-skills/prismer-product-price-monitor/SKILL.md +97 -0
  466. package/built-in-skills/prismer-product-price-monitor/scripts/watch_state.py +116 -0
  467. package/built-in-skills/prismer-python-debugpy/LICENSE +21 -0
  468. package/built-in-skills/prismer-python-debugpy/NOTICE.md +17 -0
  469. package/built-in-skills/prismer-python-debugpy/SKILL.md +377 -0
  470. package/built-in-skills/prismer-python-debugpy/scripts/dap_client.py +68 -0
  471. package/built-in-skills/prismer-songsee/LICENSE +21 -0
  472. package/built-in-skills/prismer-songsee/LICENSE.hermes +21 -0
  473. package/built-in-skills/prismer-songsee/PROVENANCE.md +7 -0
  474. package/built-in-skills/prismer-songsee/SKILL.md +91 -0
  475. package/built-in-skills/prismer-songwriting-and-ai-music/LICENSE +21 -0
  476. package/built-in-skills/prismer-songwriting-and-ai-music/LICENSE.hermes +21 -0
  477. package/built-in-skills/prismer-songwriting-and-ai-music/PROVENANCE.md +7 -0
  478. package/built-in-skills/prismer-songwriting-and-ai-music/SKILL.md +317 -0
  479. package/built-in-skills/prismer-spike/LICENSE +21 -0
  480. package/built-in-skills/prismer-spike/LICENSE.gsd +21 -0
  481. package/built-in-skills/prismer-spike/NOTICE.md +17 -0
  482. package/built-in-skills/prismer-spike/SKILL.md +212 -0
  483. package/built-in-skills/prismer-teams-meeting-pipeline/LICENSE +21 -0
  484. package/built-in-skills/prismer-teams-meeting-pipeline/NOTICE.md +11 -0
  485. package/built-in-skills/prismer-teams-meeting-pipeline/SKILL.md +156 -0
  486. package/built-in-skills/prismer-xurl/LICENSE +21 -0
  487. package/built-in-skills/prismer-xurl/LICENSE.hermes +21 -0
  488. package/built-in-skills/prismer-xurl/PROVENANCE.md +7 -0
  489. package/built-in-skills/prismer-xurl/SKILL.md +444 -0
  490. package/built-in-skills/prismer-xurl/provenance/category-DESCRIPTION.md +3 -0
  491. package/built-in-skills/prismer-youtube-content/LICENSE +21 -0
  492. package/built-in-skills/prismer-youtube-content/LICENSE.hermes +21 -0
  493. package/built-in-skills/prismer-youtube-content/PROVENANCE.md +7 -0
  494. package/built-in-skills/prismer-youtube-content/SKILL.md +86 -0
  495. package/built-in-skills/prismer-youtube-content/provenance/category-DESCRIPTION.md +3 -0
  496. package/built-in-skills/prismer-youtube-content/references/output-formats.md +56 -0
  497. package/built-in-skills/prismer-youtube-content/scripts/fetch_transcript.py +146 -0
  498. package/built-in-skills/research-arxiv/LICENSE +21 -0
  499. package/built-in-skills/research-arxiv/NOTICE.md +4 -0
  500. package/built-in-skills/research-arxiv/SKILL.md +263 -0
  501. package/built-in-skills/research-arxiv/scripts/search_arxiv.py +111 -0
  502. package/built-in-skills/role-builder/SKILL.md +7 -1
  503. package/built-in-skills/role-builder/scripts/author-role.mjs +23 -7
  504. package/built-in-skills/role-builder/scripts/ingest-role.mjs +15 -117
  505. package/built-in-skills/role-builder/scripts/instantiate-and-run.mjs +15 -1
  506. package/built-in-skills/role-builder/scripts/operation-harness.mjs +6 -4
  507. package/built-in-skills/skill-creator/LICENSE.prismer +21 -0
  508. package/built-in-skills/skill-creator/NOTICE.md +18 -0
  509. package/built-in-skills/skill-creator/SKILL.md +20 -1
  510. package/built-in-skills/skill-creator/eval-viewer/generate_review.py +20 -31
  511. package/built-in-skills/skill-creator/eval-viewer/viewer.html +35 -23
  512. package/built-in-skills/skill-creator/references/hermes-agent-skill-authoring/GUIDE.md +220 -0
  513. package/built-in-skills/skill-creator/references/hermes-agent-skill-authoring/LICENSE +21 -0
  514. package/built-in-skills/{skill-authoring/SKILL.md → skill-creator/references/skill-authoring/GUIDE.md} +1 -1
  515. package/built-in-skills/{skill-builder/SKILL.md → skill-creator/references/skill-builder/GUIDE.md} +8 -12
  516. package/built-in-skills/skill-creator/references/skill-builder/scripts/ingest.mjs +93 -0
  517. package/built-in-skills/skill-creator/scripts/aggregate_benchmark.py +3 -2
  518. package/built-in-skills/skill-creator/scripts/import-library.mjs +30 -7
  519. package/built-in-skills/skill-creator/scripts/improve_description.py +14 -16
  520. package/built-in-skills/skill-creator/scripts/package_skill.py +16 -9
  521. package/built-in-skills/skill-creator/scripts/quick_validate.py +22 -5
  522. package/built-in-skills/skill-creator/scripts/run_eval.py +63 -144
  523. package/built-in-skills/skill-creator/scripts/run_loop.py +24 -16
  524. package/built-in-skills/slack-gif-creator/core/gif_builder.py +13 -2
  525. package/built-in-skills/slack-gif-creator/core/validators.py +17 -7
  526. package/built-in-skills/tasks/SKILL.md +2 -2
  527. package/built-in-skills/tdd/SKILL.md +7 -0
  528. package/built-in-skills/tdd/references/test-driven-development/GUIDE.md +356 -0
  529. package/built-in-skills/tdd/references/test-driven-development/LICENSE +21 -0
  530. package/built-in-skills/tdd/references/test-driven-development/LICENSE.superpowers +21 -0
  531. package/built-in-skills/tdd/references/test-driven-development/NOTICE.md +37 -0
  532. package/built-in-skills/team/SKILL.md +1 -1
  533. package/built-in-skills/web-artifacts-builder/SKILL.md +3 -3
  534. package/built-in-skills/web-artifacts-builder/scripts/bundle-artifact.sh +9 -7
  535. package/built-in-skills/web-artifacts-builder/scripts/init-artifact.sh +28 -55
  536. package/built-in-skills/webapp-qa/LICENSE +21 -0
  537. package/built-in-skills/webapp-qa/NOTICE.md +37 -0
  538. package/built-in-skills/webapp-qa/SKILL.md +41 -0
  539. package/built-in-skills/webapp-qa/references/dogfood/GUIDE.md +161 -0
  540. package/built-in-skills/webapp-qa/references/issue-taxonomy.md +109 -0
  541. package/built-in-skills/webapp-qa/templates/dogfood-report-template.md +86 -0
  542. package/built-in-skills/webapp-testing/SKILL.md +9 -2
  543. package/built-in-skills/webapp-testing/examples/console_logging.py +10 -4
  544. package/built-in-skills/webapp-testing/examples/element_discovery.py +11 -4
  545. package/built-in-skills/webapp-testing/examples/static_html_automation.py +14 -9
  546. package/built-in-skills/webapp-testing/scripts/with_server.py +34 -10
  547. package/built-in-skills/weekly-review/LICENSE +21 -0
  548. package/built-in-skills/weekly-review/NOTICE.md +21 -0
  549. package/built-in-skills/weekly-review/SKILL.md +49 -0
  550. package/components/eaas-pi-components.manifest.json +37 -0
  551. package/dist/cli.cjs +7017 -3340
  552. package/dist/cli.js +6631 -2936
  553. package/dist/index.cjs +7863 -3830
  554. package/dist/index.d.cts +459 -5
  555. package/dist/index.d.ts +459 -5
  556. package/dist/index.js +7106 -3064
  557. package/package.json +7 -2
  558. package/plugins/memory/prismer/__init__.py +4 -0
  559. package/plugins/memory/prismer/tool-schemas.generated.json +8 -0
  560. package/built-in-skills/skill-builder/scripts/ingest.mjs +0 -265
  561. package/built-in-skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  562. /package/built-in-skills/{document-generation/SKILL.md → office-artifacts/references/document-generation/GUIDE.md} +0 -0
  563. /package/built-in-skills/{skill-authoring/skill.json → skill-creator/references/skill-authoring/draft-contract.json} +0 -0
@@ -0,0 +1,688 @@
1
+ # Optimization Reference
2
+
3
+ > **See also:** architecture.md · composition.md · scenes.md · shaders.md · inputs.md · troubleshooting.md
4
+
5
+ ## Hardware Detection
6
+
7
+ Detect the user's hardware at script startup and adapt rendering parameters automatically. Never hardcode worker counts or resolution.
8
+
9
+ ### CPU and Memory Detection
10
+
11
+ ```python
12
+ import multiprocessing
13
+ import platform
14
+ import shutil
15
+ import os
16
+
17
+ def detect_hardware():
18
+ """Detect hardware capabilities and return render config."""
19
+ cpu_count = getattr(os, 'process_cpu_count', multiprocessing.cpu_count)() or 1
20
+ try:
21
+ quota, period = open('/sys/fs/cgroup/cpu.max').read().split()
22
+ if quota != 'max': cpu_count = min(cpu_count, max(1, int(quota) // int(period)))
23
+ except (OSError, ValueError):
24
+ pass
25
+
26
+ # Leave 1-2 cores free for OS + ffmpeg encoding
27
+ if cpu_count >= 16:
28
+ workers = cpu_count - 2
29
+ elif cpu_count >= 8:
30
+ workers = cpu_count - 1
31
+ elif cpu_count >= 4:
32
+ workers = cpu_count - 1
33
+ else:
34
+ workers = max(1, cpu_count)
35
+
36
+ # Memory detection (platform-specific)
37
+ try:
38
+ if platform.system() == "Darwin":
39
+ import subprocess
40
+ mem_bytes = int(subprocess.check_output(["sysctl", "-n", "hw.memsize"]).strip())
41
+ elif platform.system() == "Linux":
42
+ with open("/proc/meminfo") as f:
43
+ for line in f:
44
+ if line.startswith("MemTotal"):
45
+ mem_bytes = int(line.split()[1]) * 1024
46
+ break
47
+ else:
48
+ mem_bytes = 8 * 1024**3 # assume 8GB on unknown
49
+ except Exception:
50
+ mem_bytes = 8 * 1024**3
51
+
52
+ try:
53
+ limit = open('/sys/fs/cgroup/memory.max').read().strip()
54
+ if limit != 'max': mem_bytes = min(mem_bytes, int(limit))
55
+ except (OSError, ValueError):
56
+ pass
57
+ mem_gb = mem_bytes / (1024**3)
58
+
59
+ # Each worker uses ~50-150MB depending on grid sizes
60
+ # Cap workers if memory is tight
61
+ mem_per_worker_mb = 150
62
+ max_workers_by_mem = int(mem_gb * 1024 * 0.6 / mem_per_worker_mb) # use 60% of RAM
63
+ workers = max(1, min(workers, max_workers_by_mem, int(os.environ.get("PRISMER_RENDER_WORKERS", "1"))))
64
+
65
+ # ffmpeg availability and codec support
66
+ has_ffmpeg = shutil.which("ffmpeg") is not None
67
+
68
+ return {
69
+ "cpu_count": cpu_count,
70
+ "workers": workers,
71
+ "mem_gb": mem_gb,
72
+ "platform": platform.system(),
73
+ "arch": platform.machine(),
74
+ "has_ffmpeg": has_ffmpeg,
75
+ }
76
+ ```
77
+
78
+ ### Adaptive Quality Profiles
79
+
80
+ Scale resolution, FPS, CRF, and grid density based on hardware:
81
+
82
+ ```python
83
+ def quality_profile(hw, target_duration_s, user_preference="auto"):
84
+ """
85
+ Returns render settings adapted to hardware.
86
+ user_preference: "auto", "draft", "preview", "production", "max"
87
+ """
88
+ if user_preference == "draft":
89
+ return {"vw": 960, "vh": 540, "fps": 12, "crf": 28, "workers": min(4, hw["workers"]),
90
+ "grid_scale": 0.5, "shaders": "minimal", "particles_max": 200}
91
+
92
+ if user_preference == "preview":
93
+ return {"vw": 1280, "vh": 720, "fps": 15, "crf": 25, "workers": hw["workers"],
94
+ "grid_scale": 0.75, "shaders": "standard", "particles_max": 500}
95
+
96
+ if user_preference == "max":
97
+ return {"vw": 3840, "vh": 2160, "fps": 30, "crf": 15, "workers": hw["workers"],
98
+ "grid_scale": 2.0, "shaders": "full", "particles_max": 3000}
99
+
100
+ # "production" or "auto"
101
+ # Auto-detect: estimate render time, downgrade if it would take too long
102
+ n_frames = int(target_duration_s * 24)
103
+ est_seconds_per_frame = 0.18 # ~180ms at 1080p
104
+ est_total_s = n_frames * est_seconds_per_frame / max(1, hw["workers"])
105
+
106
+ if hw["mem_gb"] < 4 or hw["cpu_count"] <= 2:
107
+ # Low-end: 720p, 15fps
108
+ return {"vw": 1280, "vh": 720, "fps": 15, "crf": 23, "workers": hw["workers"],
109
+ "grid_scale": 0.75, "shaders": "standard", "particles_max": 500}
110
+
111
+ if est_total_s > 3600: # would take over an hour
112
+ # Downgrade to 720p to speed up
113
+ return {"vw": 1280, "vh": 720, "fps": 24, "crf": 20, "workers": hw["workers"],
114
+ "grid_scale": 0.75, "shaders": "standard", "particles_max": 800}
115
+
116
+ # Standard production: 1080p 24fps
117
+ return {"vw": 1920, "vh": 1080, "fps": 24, "crf": 20, "workers": hw["workers"],
118
+ "grid_scale": 1.0, "shaders": "full", "particles_max": 1200}
119
+
120
+
121
+ def apply_quality_profile(profile):
122
+ """Set globals from quality profile."""
123
+ global VW, VH, FPS, N_WORKERS
124
+ VW = profile["vw"]
125
+ VH = profile["vh"]
126
+ FPS = profile["fps"]
127
+ N_WORKERS = profile["workers"]
128
+ # Grid sizes scale with resolution
129
+ # CRF passed to ffmpeg encoder
130
+ # Shader set determines which post-processing is active
131
+ ```
132
+
133
+ ### CLI Integration
134
+
135
+ ```python
136
+ parser = argparse.ArgumentParser()
137
+ parser.add_argument("--quality", choices=["draft", "preview", "production", "max", "auto"],
138
+ default="auto", help="Render quality preset")
139
+ parser.add_argument("--aspect", choices=["landscape", "portrait", "square"],
140
+ default="landscape", help="Aspect ratio preset")
141
+ parser.add_argument("--workers", type=int, default=0, help="Override worker count (0=auto)")
142
+ parser.add_argument("--resolution", type=str, default="", help="Override resolution e.g. 1280x720")
143
+ args = parser.parse_args()
144
+
145
+ hw = detect_hardware()
146
+ if args.workers > 0:
147
+ hw["workers"] = args.workers
148
+ profile = quality_profile(hw, target_duration, args.quality)
149
+
150
+ # Apply aspect ratio preset (before manual resolution override)
151
+ ASPECT_PRESETS = {
152
+ "landscape": (1920, 1080),
153
+ "portrait": (1080, 1920),
154
+ "square": (1080, 1080),
155
+ }
156
+ if args.aspect != "landscape" and not args.resolution:
157
+ profile["vw"], profile["vh"] = ASPECT_PRESETS[args.aspect]
158
+
159
+ if args.resolution:
160
+ w, h = args.resolution.split("x")
161
+ profile["vw"], profile["vh"] = int(w), int(h)
162
+ apply_quality_profile(profile)
163
+
164
+ log(f"Hardware: {hw['cpu_count']} cores, {hw['mem_gb']:.1f}GB RAM, {hw['platform']}")
165
+ log(f"Render: {profile['vw']}x{profile['vh']} @{profile['fps']}fps, "
166
+ f"CRF {profile['crf']}, {profile['workers']} workers")
167
+ ```
168
+
169
+ ### Portrait Mode Considerations
170
+
171
+ Portrait (1080x1920) has the same pixel count as landscape 1080p, so performance is equivalent. But composition patterns differ:
172
+
173
+ | Concern | Landscape | Portrait |
174
+ |---------|-----------|----------|
175
+ | Grid cols at `lg` | 160 | 90 |
176
+ | Grid rows at `lg` | 45 | 80 |
177
+ | Max text line chars | ~50 centered | ~25-30 centered |
178
+ | Vertical rain | Short travel | Long, dramatic travel |
179
+ | Horizontal spectrum | Full width | Needs rotation or compression |
180
+ | Radial effects | Natural circles | Tall ellipses (aspect correction handles this) |
181
+ | Particle explosions | Wide spread | Tall spread |
182
+ | Text stacking | 3-4 lines comfortable | 8-10 lines comfortable |
183
+ | Quote layout | 2-3 wide lines | 5-6 short lines |
184
+
185
+ **Portrait-optimized patterns:**
186
+ - Vertical rain/matrix effects are naturally enhanced — longer column travel
187
+ - Fire columns rise through more screen space
188
+ - Rising embers/particles have more vertical runway
189
+ - Text can be stacked more aggressively with more lines
190
+ - Radial effects work if aspect correction is applied (GridLayer handles this automatically)
191
+ - Spectrum bars can be rotated 90 degrees (vertical bars from bottom)
192
+
193
+ **Portrait text layout:**
194
+ ```python
195
+ def layout_text_portrait(text, max_chars_per_line=25, grid=None):
196
+ """Break text into short lines for portrait display."""
197
+ words = text.split()
198
+ lines = []; current = ""
199
+ for w in words:
200
+ if len(current) + len(w) + 1 > max_chars_per_line:
201
+ lines.append(current.strip())
202
+ current = w + " "
203
+ else:
204
+ current += w + " "
205
+ if current.strip():
206
+ lines.append(current.strip())
207
+ return lines
208
+ ```
209
+
210
+ ## Performance Budget
211
+
212
+ Target: 100-200ms per frame (5-10 fps single-threaded, 40-80 fps across 8 workers).
213
+
214
+ | Component | Time | Notes |
215
+ |-----------|------|-------|
216
+ | Feature extraction | 1-5ms | Pre-computed for all frames before render |
217
+ | Effect function | 2-15ms | Vectorized numpy, avoid Python loops |
218
+ | Character render | 80-150ms | **Bottleneck** -- per-cell Python loop |
219
+ | Shader pipeline | 5-25ms | Depends on active shaders |
220
+ | ffmpeg encode | ~5ms | Amortized by pipe buffering |
221
+
222
+ ## Bitmap Pre-Rasterization
223
+
224
+ Rasterize every character at init, not per-frame:
225
+
226
+ ```python
227
+ # At init time -- done once
228
+ for c in all_characters:
229
+ img = Image.new("L", (cell_w, cell_h), 0)
230
+ ImageDraw.Draw(img).text((0, 0), c, fill=255, font=font)
231
+ bitmaps[c] = np.array(img, dtype=np.float32) / 255.0 # float32 for fast multiply
232
+
233
+ # At render time -- fast lookup
234
+ bitmap = bitmaps[char]
235
+ canvas[y:y+ch, x:x+cw] = np.maximum(canvas[y:y+ch, x:x+cw],
236
+ (bitmap[:,:,None] * color).astype(np.uint8))
237
+ ```
238
+
239
+ Collect all characters from all palettes + overlay text into the init set. Lazy-init for any missed characters.
240
+
241
+ ## Pre-Rendered Background Textures
242
+
243
+ Alternative to `_render_vf()` for backgrounds where characters don't need to change every frame. Pre-bake a static ASCII texture once at init, then multiply by a per-cell color field each frame. One matrix multiply vs thousands of bitmap blits.
244
+
245
+ Use when: background layer uses a fixed character palette and only color/brightness varies per frame. NOT suitable for layers where character selection depends on a changing value field.
246
+
247
+ ### Init: Bake the Texture
248
+
249
+ ```python
250
+ # In GridLayer.__init__:
251
+ self._bg_row_idx = np.clip(
252
+ (np.arange(VH) - self.oy) // self.ch, 0, self.rows - 1
253
+ )
254
+ self._bg_col_idx = np.clip(
255
+ (np.arange(VW) - self.ox) // self.cw, 0, self.cols - 1
256
+ )
257
+ self._bg_textures = {}
258
+
259
+ def make_bg_texture(self, palette):
260
+ """Pre-render a static ASCII texture (grayscale float32) once."""
261
+ if palette not in self._bg_textures:
262
+ texture = np.zeros((VH, VW), dtype=np.float32)
263
+ rng = random.Random(12345)
264
+ ch_list = [c for c in palette if c != " " and c in self.bm]
265
+ if not ch_list:
266
+ ch_list = list(self.bm.keys())[:5]
267
+ for row in range(self.rows):
268
+ y = self.oy + row * self.ch
269
+ if y + self.ch > VH:
270
+ break
271
+ for col in range(self.cols):
272
+ x = self.ox + col * self.cw
273
+ if x + self.cw > VW:
274
+ break
275
+ bm = self.bm[rng.choice(ch_list)]
276
+ texture[y:y+self.ch, x:x+self.cw] = bm
277
+ self._bg_textures[palette] = texture
278
+ return self._bg_textures[palette]
279
+ ```
280
+
281
+ ### Render: Color Field x Cached Texture
282
+
283
+ ```python
284
+ def render_bg(self, color_field, palette=PAL_CIRCUIT):
285
+ """Fast background: pre-rendered ASCII texture * per-cell color field.
286
+ color_field: (rows, cols, 3) uint8. Returns (VH, VW, 3) uint8."""
287
+ texture = self.make_bg_texture(palette)
288
+ # Expand cell colors to pixel coords via pre-computed index maps
289
+ color_px = color_field[
290
+ self._bg_row_idx[:, None], self._bg_col_idx[None, :]
291
+ ].astype(np.float32)
292
+ return (texture[:, :, None] * color_px).astype(np.uint8)
293
+ ```
294
+
295
+ ### Usage in a Scene
296
+
297
+ ```python
298
+ # Build per-cell color from effect fields (cheap — rows*cols, not VH*VW)
299
+ hue = ((t * 0.05 + val * 0.2) % 1.0).astype(np.float32)
300
+ R, G, B = hsv2rgb(hue, np.full_like(val, 0.5), val)
301
+ color_field = mkc(R, G, B, g.rows, g.cols) # (rows, cols, 3) uint8
302
+
303
+ # Render background — single matrix multiply, no per-cell loop
304
+ canvas_bg = g.render_bg(color_field, PAL_DENSE)
305
+ ```
306
+
307
+ The texture init loop runs once and is cached per palette. Per-frame cost is one fancy-index lookup + one broadcast multiply — orders of magnitude faster than the per-cell bitmap blit loop in `render()` for dense backgrounds.
308
+
309
+ ## Coordinate Array Caching
310
+
311
+ Pre-compute all grid-relative coordinate arrays at init, not per-frame:
312
+
313
+ ```python
314
+ # These are O(rows*cols) and used in every effect
315
+ self.rr = np.arange(rows)[:, None] # row indices
316
+ self.cc = np.arange(cols)[None, :] # col indices
317
+ self.dist = np.sqrt(dx**2 + dy**2) # distance from center
318
+ self.angle = np.arctan2(dy, dx) # angle from center
319
+ self.dist_n = ... # normalized distance
320
+ ```
321
+
322
+ ## Vectorized Effect Patterns
323
+
324
+ ### Avoid Per-Cell Python Loops in Effects
325
+
326
+ The render loop (compositing bitmaps) is unavoidably per-cell. But effect functions must be fully vectorized numpy -- never iterate over rows/cols in Python.
327
+
328
+ Bad (O(rows*cols) Python loop):
329
+ ```python
330
+ for r in range(rows):
331
+ for c in range(cols):
332
+ val[r, c] = math.sin(c * 0.1 + t) * math.cos(r * 0.1 - t)
333
+ ```
334
+
335
+ Good (vectorized):
336
+ ```python
337
+ val = np.sin(g.cc * 0.1 + t) * np.cos(g.rr * 0.1 - t)
338
+ ```
339
+
340
+ ### Vectorized Matrix Rain
341
+
342
+ The naive per-column per-trail-pixel loop is the second biggest bottleneck after the render loop. Use numpy fancy indexing:
343
+
344
+ ```python
345
+ # Instead of nested Python loops over columns and trail pixels:
346
+ # Build row index arrays for all active trail pixels at once
347
+ all_rows = []
348
+ all_cols = []
349
+ all_fades = []
350
+ for c in range(cols):
351
+ head = int(S["ry"][c])
352
+ trail_len = S["rln"][c]
353
+ for i in range(trail_len):
354
+ row = head - i
355
+ if 0 <= row < rows:
356
+ all_rows.append(row)
357
+ all_cols.append(c)
358
+ all_fades.append(1.0 - i / trail_len)
359
+
360
+ # Vectorized assignment
361
+ ar = np.array(all_rows)
362
+ ac = np.array(all_cols)
363
+ af = np.array(all_fades, dtype=np.float32)
364
+ # Assign chars and colors in bulk using fancy indexing
365
+ ch[ar, ac] = ... # vectorized char assignment
366
+ co[ar, ac, 1] = (af * bri * 255).astype(np.uint8) # green channel
367
+ ```
368
+
369
+ ### Vectorized Fire Columns
370
+
371
+ Same pattern -- accumulate index arrays, assign in bulk:
372
+
373
+ ```python
374
+ fire_val = np.zeros((rows, cols), dtype=np.float32)
375
+ for fi in range(n_cols):
376
+ fx_c = int((fi * cols / n_cols + np.sin(t * 2 + fi * 0.7) * 3) % cols)
377
+ height = int(energy * rows * 0.7)
378
+ dy = np.arange(min(height, rows))
379
+ fr = rows - 1 - dy
380
+ frac = dy / max(height, 1)
381
+ # Width spread: base columns wider at bottom
382
+ for dx in range(-1, 2): # 3-wide columns
383
+ c = fx_c + dx
384
+ if 0 <= c < cols:
385
+ fire_val[fr, c] = np.maximum(fire_val[fr, c],
386
+ (1 - frac * 0.6) * (0.5 + rms * 0.5))
387
+ # Now map fire_val to chars and colors in one vectorized pass
388
+ ```
389
+
390
+ ## PIL String Rendering for Text-Heavy Scenes
391
+
392
+ Alternative to per-cell bitmap blitting when rendering many long text strings (scrolling tickers, typewriter sequences, idea floods). Uses PIL's native `ImageDraw.text()` which renders an entire string in one C call, vs one Python-loop bitmap blit per character.
393
+
394
+ Typical win: a scene with 56 ticker rows renders 56 PIL `text()` calls instead of ~10K individual bitmap blits.
395
+
396
+ Use when: scene renders many rows of readable text strings. NOT suitable for sparse or spatially-scattered single characters (use normal `render()` for those).
397
+
398
+ ```python
399
+ from PIL import Image, ImageDraw
400
+
401
+ def render_text_layer(grid, rows_data, font):
402
+ """Render dense text rows via PIL instead of per-cell bitmap blitting.
403
+
404
+ Args:
405
+ grid: GridLayer instance (for oy, ch, ox, font metrics)
406
+ rows_data: list of (row_index, text_string, rgb_tuple) — one per row
407
+ font: PIL ImageFont instance (grid.font)
408
+
409
+ Returns:
410
+ uint8 array (VH, VW, 3) — canvas with rendered text
411
+ """
412
+ img = Image.new("RGB", (VW, VH), (0, 0, 0))
413
+ draw = ImageDraw.Draw(img)
414
+ for row_idx, text, color in rows_data:
415
+ y = grid.oy + row_idx * grid.ch
416
+ if y + grid.ch > VH:
417
+ break
418
+ draw.text((grid.ox, y), text, fill=color, font=font)
419
+ return np.array(img)
420
+ ```
421
+
422
+ ### Usage in a Ticker Scene
423
+
424
+ ```python
425
+ # Build ticker data (text + color per row)
426
+ rows_data = []
427
+ for row in range(n_tickers):
428
+ text = build_ticker_text(row, t) # scrolling substring
429
+ color = hsv2rgb_scalar(hue, 0.85, bri) # (R, G, B) tuple
430
+ rows_data.append((row, text, color))
431
+
432
+ # One PIL pass instead of thousands of bitmap blits
433
+ canvas_tickers = render_text_layer(g_md, rows_data, g_md.font)
434
+
435
+ # Blend with other layers normally
436
+ result = blend_canvas(canvas_bg, canvas_tickers, "screen", 0.9)
437
+ ```
438
+
439
+ This is purely a rendering optimization — same visual output, fewer draw calls. The grid's `render()` method is still needed for sparse character fields where characters are placed individually based on value fields.
440
+
441
+ ## Bloom Optimization
442
+
443
+ **Do NOT use `scipy.ndimage.uniform_filter`** -- measured at 424ms/frame.
444
+
445
+ Use 4x downsample + manual box blur instead -- 84ms/frame (5x faster):
446
+
447
+ ```python
448
+ sm = canvas[::4, ::4].astype(np.float32) # 4x downsample
449
+ br = np.where(sm > threshold, sm, 0)
450
+ for _ in range(3): # 3-pass manual box blur
451
+ p = np.pad(br, ((1,1),(1,1),(0,0)), mode='edge')
452
+ br = (p[:-2,:-2] + p[:-2,1:-1] + p[:-2,2:] +
453
+ p[1:-1,:-2] + p[1:-1,1:-1] + p[1:-1,2:] +
454
+ p[2:,:-2] + p[2:,1:-1] + p[2:,2:]) / 9.0
455
+ bl = np.repeat(np.repeat(br, 4, axis=0), 4, axis=1)[:H, :W]
456
+ ```
457
+
458
+ ## Vignette Caching
459
+
460
+ Distance field is resolution- and strength-dependent, never changes per frame:
461
+
462
+ ```python
463
+ _vig_cache = {}
464
+ def sh_vignette(canvas, strength):
465
+ key = (canvas.shape[0], canvas.shape[1], round(strength, 2))
466
+ if key not in _vig_cache:
467
+ Y = np.linspace(-1, 1, H)[:, None]
468
+ X = np.linspace(-1, 1, W)[None, :]
469
+ _vig_cache[key] = np.clip(1.0 - np.sqrt(X**2+Y**2) * strength, 0.15, 1).astype(np.float32)
470
+ return np.clip(canvas * _vig_cache[key][:,:,None], 0, 255).astype(np.uint8)
471
+ ```
472
+
473
+ Same pattern for CRT barrel distortion (cache remap coordinates).
474
+
475
+ ## Film Grain Optimization
476
+
477
+ Generate noise at half resolution, tile up:
478
+
479
+ ```python
480
+ noise = np.random.randint(-amt, amt+1, (H//2, W//2, 1), dtype=np.int16)
481
+ noise = np.repeat(np.repeat(noise, 2, axis=0), 2, axis=1)[:H, :W]
482
+ ```
483
+
484
+ 2x blocky grain looks like film grain and costs 1/4 the random generation.
485
+
486
+ ## Parallel Rendering
487
+
488
+ ### Worker Architecture
489
+
490
+ ```python
491
+ hw = detect_hardware()
492
+ N_WORKERS = hw["workers"]
493
+
494
+ # Batch splitting (for non-clip architectures)
495
+ batch_size = (n_frames + N_WORKERS - 1) // N_WORKERS
496
+ batches = [(i, i*batch_size, min((i+1)*batch_size, n_frames), features, seg_path) ...]
497
+
498
+ with multiprocessing.Pool(N_WORKERS) as pool:
499
+ segments = pool.starmap(render_batch, batches)
500
+ ```
501
+
502
+ ### Per-Clip Parallelism (Preferred for Segmented Videos)
503
+
504
+ ```python
505
+ from concurrent.futures import ProcessPoolExecutor, as_completed
506
+
507
+ with ProcessPoolExecutor(max_workers=N_WORKERS) as pool:
508
+ futures = {pool.submit(render_clip, seg, features, path): seg["id"]
509
+ for seg, path in clip_args}
510
+ for fut in as_completed(futures):
511
+ clip_id = futures[fut]
512
+ try:
513
+ fut.result()
514
+ log(f" {clip_id} done")
515
+ except Exception as e:
516
+ log(f" {clip_id} FAILED: {e}")
517
+ raise RuntimeError(f"Render failed for {clip_id}") from e
518
+ ```
519
+
520
+ ### Worker Isolation
521
+
522
+ Each worker:
523
+ - Creates its own `Renderer` instance (with full grid + bitmap init)
524
+ - Opens its own ffmpeg subprocess
525
+ - Has independent random seed (`random.seed(batch_id * 10000)`)
526
+ - Writes to its own segment file and stderr log
527
+
528
+ ### ffmpeg Pipe Safety
529
+
530
+ **CRITICAL**: Never `stderr=subprocess.PIPE` with long-running ffmpeg. The stderr buffer fills at ~64KB and deadlocks:
531
+
532
+ ```python
533
+ # WRONG -- will deadlock
534
+ pipe = subprocess.Popen(cmd, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
535
+
536
+ # RIGHT -- stderr to file
537
+ stderr_fh = open(err_path, "w")
538
+ pipe = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.DEVNULL, stderr=stderr_fh)
539
+ # ... write all frames ...
540
+ pipe.stdin.close()
541
+ pipe.wait()
542
+ stderr_fh.close()
543
+ ```
544
+
545
+ ### Concatenation
546
+
547
+ ```python
548
+ with open(concat_file, "w") as cf:
549
+ for seg in segments:
550
+ cf.write(f"file '{seg}'\n")
551
+
552
+ cmd = ["ffmpeg", "-y", "-f", "concat", "-safe", "0", "-i", concat_file]
553
+ if audio_path:
554
+ cmd += ["-i", audio_path, "-c:v", "copy", "-c:a", "aac", "-b:a", "192k", "-shortest"]
555
+ else:
556
+ cmd += ["-c:v", "copy"]
557
+ cmd.append(output_path)
558
+ subprocess.run(cmd, capture_output=True, check=True)
559
+ ```
560
+
561
+ ## Particle System Performance
562
+
563
+ Cap particle counts based on quality profile:
564
+
565
+ | System | Low | Standard | High |
566
+ |--------|-----|----------|------|
567
+ | Explosion | 300 | 1000 | 2500 |
568
+ | Embers | 500 | 1500 | 3000 |
569
+ | Starfield | 300 | 800 | 1500 |
570
+ | Dissolve | 200 | 600 | 1200 |
571
+
572
+ Cull by truncating lists:
573
+ ```python
574
+ MAX_PARTICLES = profile.get("particles_max", 1200)
575
+ if len(S["px"]) > MAX_PARTICLES:
576
+ for k in ("px", "py", "vx", "vy", "life", "char"):
577
+ S[k] = S[k][-MAX_PARTICLES:] # keep newest
578
+ ```
579
+
580
+ ## Memory Management
581
+
582
+ - Feature arrays: pre-computed for all frames, shared across workers via fork semantics (COW)
583
+ - Canvas: allocated once per worker, reused (`np.zeros(...)`)
584
+ - Character arrays: allocated per frame (cheap -- rows*cols U1 strings)
585
+ - Bitmap cache: ~500KB per grid size, initialized once per worker
586
+
587
+ Total memory per worker: ~50-150MB. Total: ~400-800MB for 8 workers.
588
+
589
+ For low-memory systems (< 4GB), reduce worker count and use smaller grids.
590
+
591
+ ## Brightness Verification
592
+
593
+ After render, spot-check brightness at sample timestamps:
594
+
595
+ ```python
596
+ for t in [2, 30, 60, 120, 180]:
597
+ cmd = ["ffmpeg", "-ss", str(t), "-i", output_path,
598
+ "-frames:v", "1", "-f", "rawvideo", "-pix_fmt", "rgb24", "-"]
599
+ r = subprocess.run(cmd, capture_output=True)
600
+ arr = np.frombuffer(r.stdout, dtype=np.uint8)
601
+ print(f"t={t}s mean={arr.mean():.1f} max={arr.max()}")
602
+ ```
603
+
604
+ Target: mean > 5 for quiet sections, mean > 15 for active sections. If consistently below, increase brightness floor in effects and/or global boost multiplier.
605
+
606
+ ## Render Time Estimates
607
+
608
+ Scale with hardware. Baseline: 1080p, 24fps, ~180ms/frame/worker.
609
+
610
+ | Duration | Frames | 4 workers | 8 workers | 16 workers |
611
+ |----------|--------|-----------|-----------|------------|
612
+ | 30s | 720 | ~3 min | ~2 min | ~1 min |
613
+ | 2 min | 2,880 | ~13 min | ~7 min | ~4 min |
614
+ | 3.5 min | 5,040 | ~23 min | ~12 min | ~6 min |
615
+ | 5 min | 7,200 | ~33 min | ~17 min | ~9 min |
616
+ | 10 min | 14,400 | ~65 min | ~33 min | ~17 min |
617
+
618
+ At 720p: multiply times by ~0.5. At 4K: multiply by ~4.
619
+
620
+ Heavier effects (many particles, dense grids, extra shader passes) add ~20-50%.
621
+
622
+ ---
623
+
624
+ ## Temp File Cleanup
625
+
626
+ Rendering generates intermediate files that accumulate across runs. Clean up after the final concat/mux step.
627
+
628
+ ### Files to Clean
629
+
630
+ | File type | Source | Location |
631
+ |-----------|--------|----------|
632
+ | WAV extracts | `ffmpeg -i input.mp3 ... tmp.wav` | task-local NamedTemporaryFile registered in owned_files |
633
+ | Segment clips | `render_clip()` output | `segments/seg_00.mp4` etc. |
634
+ | Concat list | ffmpeg concat demuxer input | `segments/concat.txt` |
635
+ | ffmpeg stderr logs | piped to file for debugging | `*.log` in project dir |
636
+ | Feature cache | pickled numpy arrays | `*.pkl` or `*.npz` |
637
+
638
+ ### Cleanup Function
639
+
640
+ ```python
641
+ import os
642
+ from pathlib import Path
643
+
644
+ def cleanup_render_artifacts(task_dir, owned_files, final_output):
645
+ """Only unlink explicitly registered files inside this task directory."""
646
+ if os.environ.get("KEEP_INTERMEDIATES") == "1":
647
+ return []
648
+ root = Path(task_dir).resolve(strict=True)
649
+ final = Path(final_output).resolve(strict=True)
650
+ if not final.is_file() or final.stat().st_size == 0:
651
+ raise ValueError("Verify the final artifact before cleanup")
652
+ candidates = []
653
+ for name in owned_files:
654
+ path = Path(name)
655
+ if not path.is_absolute():
656
+ path = root / path
657
+ # Reject symlinks (including ancestor links), directories and escapes.
658
+ resolved = path.resolve(strict=True)
659
+ if resolved != path.absolute() or not resolved.is_relative_to(root):
660
+ raise ValueError("Artifact escapes its owning task")
661
+ if resolved == final or not resolved.is_file():
662
+ raise ValueError("Not a disposable task file")
663
+ candidates.append(resolved)
664
+ # Validate the complete manifest before deleting anything.
665
+ for path in candidates:
666
+ path.unlink()
667
+ return [str(path) for path in candidates]
668
+ ```
669
+
670
+ ### Integration with Render Pipeline
671
+
672
+ Create a private task directory first, register each generated intermediate in owned_files, and validate the final artifact with ffprobe/playback before cleanup. Never include user inputs or cache files in this manifest:
673
+
674
+ ```python
675
+ # At end of main()
676
+ if os.path.exists(output_path) and os.path.getsize(output_path) > 1000:
677
+ cleanup_render_artifacts(task_dir, owned_files, output_path)
678
+ print(f"Done. Output: {output_path}")
679
+ else:
680
+ print("WARNING: final output missing or empty — skipping cleanup")
681
+ ```
682
+
683
+ ### Temp File Best Practices
684
+
685
+ - Use `tempfile.mkdtemp()` for segment directories — avoids polluting the project dir
686
+ - Create WAV extracts with `tempfile.NamedTemporaryFile(suffix=".wav", delete=False)` inside the task directory and register their exact paths
687
+ - For debugging, set `KEEP_INTERMEDIATES=1` env var to skip cleanup
688
+ - Feature caches (`.npz`) are cheap to store and expensive to recompute — default to keeping them