@prismer/runtime 2.0.8 → 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.
- package/CHANGELOG.md +4004 -0
- package/README.md +34 -12
- package/apc/skills/FIELD-DICTIONARY.md +111 -0
- package/apc/skills/bug-reproduce/SKILL.md +150 -0
- package/apc/skills/bug-reproduce/skill.json +96 -0
- package/apc/skills/code-review/SKILL.md +198 -0
- package/apc/skills/code-review/skill.json +124 -0
- package/apc/skills/design-review/SKILL.md +122 -0
- package/apc/skills/design-review/skill.json +88 -0
- package/apc/skills/doc-sync/SKILL.md +168 -0
- package/apc/skills/doc-sync/skill.json +81 -0
- package/apc/skills/env-doctor/SKILL.md +194 -0
- package/apc/skills/env-doctor/skill.json +209 -0
- package/apc/skills/git-ops/SKILL.md +189 -0
- package/apc/skills/git-ops/skill.json +94 -0
- package/apc/skills/impact-trace/SKILL.md +168 -0
- package/apc/skills/impact-trace/skill.json +104 -0
- package/apc/skills/observability/SKILL.md +195 -0
- package/apc/skills/observability/skill.json +116 -0
- package/apc/skills/release-db-config-sync/SKILL.md +186 -0
- package/apc/skills/release-db-config-sync/skill.json +109 -0
- package/apc/skills/release-ota-promote/SKILL.md +195 -0
- package/apc/skills/release-ota-promote/skill.json +176 -0
- package/apc/skills/release-preflight/SKILL.md +174 -0
- package/apc/skills/release-preflight/skill.json +175 -0
- package/apc/skills/release-rollback/SKILL.md +214 -0
- package/apc/skills/release-rollback/skill.json +230 -0
- package/apc/skills/release-tag/SKILL.md +194 -0
- package/apc/skills/release-tag/skill.json +94 -0
- package/apc/skills/releasing-prod/SKILL.md +49 -0
- package/apc/skills/releasing-test/SKILL.md +144 -0
- package/apc/skills/sdk-release/SKILL.md +200 -0
- package/apc/skills/spec-intake/SKILL.md +169 -0
- package/apc/skills/spec-intake/skill.json +93 -0
- package/apc/skills/test-result-feedback/SKILL.md +239 -0
- package/apc/skills/test-result-feedback/skill.json +193 -0
- package/apc/skills/test-runner/SKILL.md +169 -0
- package/apc/skills/test-runner/skill.json +103 -0
- package/apc/skills/ui-align/SKILL.md +209 -0
- package/apc/skills/ui-align/skill.json +114 -0
- package/apc/skills/ui-canvas/SKILL.md +148 -0
- package/apc/skills/ui-canvas/skill.json +127 -0
- package/built-in-skills/agent-coordination/SKILL.md +77 -38
- package/built-in-skills/agent-meta/SKILL.md +12 -0
- package/built-in-skills/assets/SKILL.md +9 -7
- package/built-in-skills/browser-use/SKILL.md +93 -0
- package/built-in-skills/canvas-design/SKILL.md +4 -3
- package/built-in-skills/canvas-design/canvas-fonts/IBMPlexSerif-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/InstrumentSerif-OFL.txt +93 -0
- package/built-in-skills/canvas-design/canvas-fonts/LICENSE-SOURCES.md +16 -0
- package/built-in-skills/claim-agent-ownership/SKILL.md +10 -5
- package/built-in-skills/claude-api/SKILL.md +2 -1
- package/built-in-skills/claude-api/python/claude-api/README.md +2 -2
- package/built-in-skills/claude-api/python/claude-api/tool-use.md +9 -5
- package/built-in-skills/claude-api/python/managed-agents/README.md +11 -1
- package/built-in-skills/claude-api/shared/error-codes.md +4 -4
- package/built-in-skills/claude-api/shared/managed-agents-client-patterns.md +4 -2
- package/built-in-skills/claude-api/shared/managed-agents-core.md +1 -2
- package/built-in-skills/claude-api/shared/managed-agents-events.md +41 -22
- package/built-in-skills/claude-api/shared/managed-agents-multiagent.md +5 -3
- package/built-in-skills/claude-api/shared/managed-agents-self-hosted-sandboxes.md +1 -1
- package/built-in-skills/claude-api/shared/managed-agents-tools.md +2 -3
- package/built-in-skills/claude-api/shared/model-migration.md +3 -3
- package/built-in-skills/claude-api/shared/models.md +1 -1
- package/built-in-skills/claude-api/typescript/claude-api/batches.md +1 -1
- package/built-in-skills/claude-api/typescript/claude-api/files-api.md +3 -1
- package/built-in-skills/claude-api/typescript/claude-api/tool-use.md +8 -2
- package/built-in-skills/claude-api/typescript/managed-agents/README.md +8 -2
- package/built-in-skills/codebase-design/DEEPENING.md +37 -0
- package/built-in-skills/codebase-design/DESIGN-IT-TWICE.md +44 -0
- package/built-in-skills/codebase-design/LICENSE +21 -0
- package/built-in-skills/codebase-design/SKILL.md +130 -0
- package/built-in-skills/codebase-design/references/requesting-code-review/GUIDE.md +291 -0
- package/built-in-skills/codebase-design/references/requesting-code-review/LICENSE +21 -0
- package/built-in-skills/codebase-design/references/requesting-code-review/LICENSE.superpowers +21 -0
- package/built-in-skills/codebase-design/references/requesting-code-review/NOTICE.md +37 -0
- package/built-in-skills/codebase-design/references/sdlc-review/GUIDE.md +130 -0
- package/built-in-skills/codebase-design/references/sdlc-review/LICENSE +21 -0
- package/built-in-skills/codebase-design/references/sdlc-review/NOTICE.md +17 -0
- package/built-in-skills/codebase-design/references/simplify-code/GUIDE.md +269 -0
- package/built-in-skills/codebase-design/references/simplify-code/LICENSE +21 -0
- package/built-in-skills/codebase-design/references/simplify-code/NOTICE.md +37 -0
- package/built-in-skills/competitor-intelligence/LICENSE +21 -0
- package/built-in-skills/competitor-intelligence/NOTICE.md +6 -0
- package/built-in-skills/competitor-intelligence/SKILL.md +125 -0
- package/built-in-skills/competitor-intelligence/scripts/watch_state.py +160 -0
- package/built-in-skills/conversation-compaction/SKILL.md +117 -0
- package/built-in-skills/council-creator/SKILL.md +427 -0
- package/built-in-skills/diagnosing-bugs/LICENSE +21 -0
- package/built-in-skills/diagnosing-bugs/SKILL.md +148 -0
- package/built-in-skills/diagnosing-bugs/references/desktop-dom/GUIDE.md +64 -0
- package/built-in-skills/diagnosing-bugs/references/desktop-dom/LICENSE +21 -0
- package/built-in-skills/diagnosing-bugs/references/desktop-dom/NOTICE.md +17 -0
- package/built-in-skills/diagnosing-bugs/references/systematic-debugging/GUIDE.md +410 -0
- package/built-in-skills/diagnosing-bugs/references/systematic-debugging/LICENSE +21 -0
- package/built-in-skills/diagnosing-bugs/references/systematic-debugging/LICENSE.superpowers +21 -0
- package/built-in-skills/diagnosing-bugs/references/systematic-debugging/NOTICE.md +37 -0
- package/built-in-skills/diagnosing-bugs/scripts/hitl-loop.template.sh +41 -0
- package/built-in-skills/doc-coauthoring/SKILL.md +7 -0
- package/built-in-skills/doc-coauthoring/references/humanizer/GUIDE.md +647 -0
- package/built-in-skills/doc-coauthoring/references/humanizer/LICENSE +21 -0
- package/built-in-skills/doc-coauthoring/references/humanizer/LICENSE.hermes +21 -0
- package/built-in-skills/doc-coauthoring/references/humanizer/PROVENANCE.md +7 -0
- package/built-in-skills/document-actions/LICENSE +21 -0
- package/built-in-skills/document-actions/NOTICE.md +21 -0
- package/built-in-skills/document-actions/SKILL.md +46 -0
- package/built-in-skills/domain-modeling/ADR-FORMAT.md +47 -0
- package/built-in-skills/domain-modeling/CONTEXT-FORMAT.md +60 -0
- package/built-in-skills/domain-modeling/LICENSE +21 -0
- package/built-in-skills/domain-modeling/SKILL.md +76 -0
- package/built-in-skills/evidence-citations/LICENSE +21 -0
- package/built-in-skills/evidence-citations/NOTICE.md +21 -0
- package/built-in-skills/evidence-citations/SKILL.md +46 -0
- package/built-in-skills/evidence-citations/references/citation-formats.md +68 -0
- package/built-in-skills/evidence-citations/references/grounding-rationale.md +64 -0
- package/built-in-skills/evidence-citations/scripts/sources.py +720 -0
- package/built-in-skills/frontend-design/SKILL.md +7 -0
- package/built-in-skills/frontend-design/references/claude-design/GUIDE.md +650 -0
- package/built-in-skills/frontend-design/references/claude-design/LICENSE +21 -0
- package/built-in-skills/frontend-design/references/claude-design/LICENSE.hermes +21 -0
- package/built-in-skills/frontend-design/references/claude-design/PROVENANCE.md +7 -0
- package/built-in-skills/human-approval/SKILL.md +17 -2
- package/built-in-skills/image-generate/SKILL.md +107 -301
- package/built-in-skills/image-generate/scripts/generate-and-deliver.mjs +310 -0
- package/built-in-skills/ingest/SKILL.md +13 -45
- package/built-in-skills/internal-comms/SKILL.md +1 -0
- package/built-in-skills/liteparse/SKILL.md +130 -110
- package/built-in-skills/mcp-builder/SKILL.md +1 -0
- package/built-in-skills/mcp-builder/reference/evaluation.md +11 -2
- package/built-in-skills/mcp-builder/reference/node_mcp_server.md +34 -5
- package/built-in-skills/mcp-builder/reference/python_mcp_server.md +6 -2
- package/built-in-skills/mcp-builder/scripts/connections.py +1 -1
- package/built-in-skills/mcp-builder/scripts/evaluation.py +52 -34
- package/built-in-skills/mcp-builder/scripts/requirements.txt +2 -2
- package/built-in-skills/meeting-actions/LICENSE +21 -0
- package/built-in-skills/meeting-actions/NOTICE.md +21 -0
- package/built-in-skills/meeting-actions/SKILL.md +48 -0
- package/built-in-skills/memory/SKILL.md +444 -55
- package/built-in-skills/memory/references/llm-wiki/GUIDE.md +468 -0
- package/built-in-skills/memory/references/llm-wiki/LICENSE +21 -0
- package/built-in-skills/memory/references/llm-wiki/NOTICE.md +4 -0
- package/built-in-skills/memory/references/llm-wiki/scripts/lint_wiki.py +84 -0
- package/built-in-skills/memory/references/llm-wiki/scripts/requirements.txt +1 -0
- package/built-in-skills/memory/references/llm-wiki/templates/SCHEMA.md +19 -0
- package/built-in-skills/memory/references/llm-wiki/templates/index.md +9 -0
- package/built-in-skills/memory/references/llm-wiki/templates/log.md +4 -0
- package/built-in-skills/memory-dream/SKILL.md +332 -0
- package/built-in-skills/memory-import/SKILL.md +51 -0
- package/built-in-skills/office-artifacts/NOTICE.md +15 -0
- package/built-in-skills/office-artifacts/SKILL.md +37 -4
- package/built-in-skills/office-artifacts/references/RESOURCE-LIMITS.md +44 -0
- package/built-in-skills/office-artifacts/references/document-generation/GUIDE.md +105 -0
- package/built-in-skills/office-artifacts/references/docx/GUIDE.md +196 -0
- package/built-in-skills/office-artifacts/references/docx/LICENSE +21 -0
- package/built-in-skills/office-artifacts/references/docx/NOTICE.md +21 -0
- package/built-in-skills/office-artifacts/references/docx/references/revisions-and-comments.md +88 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_comments.py +292 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_common.py +93 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_create.py +177 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_edit.py +250 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_read.py +169 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_revisions.py +149 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_template.py +70 -0
- package/built-in-skills/office-artifacts/references/docx/scripts/docx_validate.py +155 -0
- package/built-in-skills/office-artifacts/references/docx/tests/test_docx_skill.py +525 -0
- package/built-in-skills/office-artifacts/references/pdf/GUIDE.md +125 -0
- package/built-in-skills/office-artifacts/references/pdf/LICENSE +21 -0
- package/built-in-skills/office-artifacts/references/pdf/NOTICE.md +21 -0
- package/built-in-skills/office-artifacts/references/pdf/references/forms.md +99 -0
- package/built-in-skills/office-artifacts/references/pdf/references/nano-pdf-editing.md +40 -0
- package/built-in-skills/office-artifacts/references/pdf/references/ocr-extraction.md +165 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/_raster.py +87 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/extract_marker.py +95 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/extract_pymupdf.py +107 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_create.py +153 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_fill_form.py +97 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_form_layout.py +168 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_make_form.py +145 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_merge.py +50 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_meta.py +123 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_page_image.py +101 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_read.py +153 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_secure.py +71 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_split.py +86 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_stamp.py +145 -0
- package/built-in-skills/office-artifacts/references/pdf/scripts/pdf_watermark.py +51 -0
- package/built-in-skills/office-artifacts/references/pdf/tests/test_pdf_skill.py +414 -0
- package/built-in-skills/office-artifacts/references/powerpoint/GUIDE.md +220 -0
- package/built-in-skills/office-artifacts/references/powerpoint/LICENSE +21 -0
- package/built-in-skills/office-artifacts/references/powerpoint/NOTICE.md +21 -0
- package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_create.py +214 -0
- package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_edit.py +442 -0
- package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_from_template.py +88 -0
- package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_read.py +131 -0
- package/built-in-skills/office-artifacts/references/powerpoint/scripts/pptx_render.py +104 -0
- package/built-in-skills/office-artifacts/references/powerpoint/tests/test_powerpoint_skill.py +478 -0
- package/built-in-skills/office-artifacts/references/xlsx/GUIDE.md +196 -0
- package/built-in-skills/office-artifacts/references/xlsx/LICENSE +21 -0
- package/built-in-skills/office-artifacts/references/xlsx/NOTICE.md +21 -0
- package/built-in-skills/office-artifacts/references/xlsx/references/restructuring.md +74 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/csv_to_xlsx.py +108 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_create.py +259 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_edit.py +269 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_read.py +160 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_recalc.py +111 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_restructure.py +418 -0
- package/built-in-skills/office-artifacts/references/xlsx/scripts/xlsx_to_csv.py +69 -0
- package/built-in-skills/office-artifacts/references/xlsx/tests/test_xlsx_skill.py +542 -0
- package/built-in-skills/office-artifacts/tests/test_resource_regressions.py +272 -0
- package/built-in-skills/okr/SKILL.md +154 -0
- package/built-in-skills/persona/SKILL.md +81 -0
- package/built-in-skills/persona-generator/SKILL.md +296 -0
- package/built-in-skills/pkf-svg/SKILL.md +258 -0
- package/built-in-skills/pkf-svg/references/architecture-diagram/GUIDE.md +148 -0
- package/built-in-skills/pkf-svg/references/architecture-diagram/LICENSE +21 -0
- package/built-in-skills/pkf-svg/references/architecture-diagram/LICENSE.hermes +21 -0
- package/built-in-skills/pkf-svg/references/architecture-diagram/PROVENANCE.md +7 -0
- package/built-in-skills/pkf-svg/references/architecture-diagram/templates/template.html +345 -0
- package/built-in-skills/pkf-writing/SKILL.md +258 -0
- package/built-in-skills/prismer-airtable/LICENSE +21 -0
- package/built-in-skills/prismer-airtable/NOTICE.md +11 -0
- package/built-in-skills/prismer-airtable/SKILL.md +248 -0
- package/built-in-skills/prismer-airtable/scripts/airtable_client.py +76 -0
- package/built-in-skills/prismer-apple-notes/LICENSE +21 -0
- package/built-in-skills/prismer-apple-notes/NOTICE.md +17 -0
- package/built-in-skills/prismer-apple-notes/SKILL.md +118 -0
- package/built-in-skills/prismer-apple-notes/scripts/readiness.py +47 -0
- package/built-in-skills/prismer-apple-reminders/LICENSE +21 -0
- package/built-in-skills/prismer-apple-reminders/NOTICE.md +17 -0
- package/built-in-skills/prismer-apple-reminders/SKILL.md +155 -0
- package/built-in-skills/prismer-apple-reminders/scripts/readiness.py +47 -0
- package/built-in-skills/prismer-ascii-video/LICENSE +21 -0
- package/built-in-skills/prismer-ascii-video/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-ascii-video/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-ascii-video/README.md +290 -0
- package/built-in-skills/prismer-ascii-video/SKILL.md +252 -0
- package/built-in-skills/prismer-ascii-video/provenance/category-DESCRIPTION.md +3 -0
- package/built-in-skills/prismer-ascii-video/references/architecture.md +807 -0
- package/built-in-skills/prismer-ascii-video/references/composition.md +900 -0
- package/built-in-skills/prismer-ascii-video/references/effects.md +1877 -0
- package/built-in-skills/prismer-ascii-video/references/inputs.md +693 -0
- package/built-in-skills/prismer-ascii-video/references/optimization.md +688 -0
- package/built-in-skills/prismer-ascii-video/references/scenes.md +1018 -0
- package/built-in-skills/prismer-ascii-video/references/shaders.md +1408 -0
- package/built-in-skills/prismer-ascii-video/references/troubleshooting.md +360 -0
- package/built-in-skills/prismer-baoyu-infographic/LICENSE +21 -0
- package/built-in-skills/prismer-baoyu-infographic/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-baoyu-infographic/LICENSE.origin +21 -0
- package/built-in-skills/prismer-baoyu-infographic/PORT_NOTES.md +37 -0
- package/built-in-skills/prismer-baoyu-infographic/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-baoyu-infographic/SKILL.md +240 -0
- package/built-in-skills/prismer-baoyu-infographic/references/analysis-framework.md +182 -0
- package/built-in-skills/prismer-baoyu-infographic/references/base-prompt.md +43 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/bento-grid.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/binary-comparison.md +48 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/bridge.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/circular-flow.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/comic-strip.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/comparison-matrix.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/dashboard.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/dense-modules.md +72 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/funnel.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/hierarchical-layers.md +48 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/hub-spoke.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/iceberg.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/isometric-map.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/jigsaw.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/linear-progression.md +48 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/periodic-table.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/story-mountain.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/structural-breakdown.md +48 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/tree-branching.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/venn-diagram.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/layouts/winding-roadmap.md +41 -0
- package/built-in-skills/prismer-baoyu-infographic/references/structured-content-template.md +244 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/aged-academia.md +36 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/bold-graphic.md +36 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/chalkboard.md +61 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/claymation.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/corporate-memphis.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/craft-handmade.md +44 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/cyberpunk-neon.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/hand-drawn-edu.md +63 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/ikea-manual.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/kawaii.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/knolling.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/lego-brick.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/morandi-journal.md +60 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/origami.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/pixel-art.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/pop-laboratory.md +48 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/retro-pop-grid.md +47 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/storybook-watercolor.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/subway-map.md +29 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/technical-schematic.md +36 -0
- package/built-in-skills/prismer-baoyu-infographic/references/styles/ui-wireframe.md +29 -0
- package/built-in-skills/prismer-blocked-page-recovery/LICENSE +21 -0
- package/built-in-skills/prismer-blocked-page-recovery/NOTICE.md +17 -0
- package/built-in-skills/prismer-blocked-page-recovery/SKILL.md +158 -0
- package/built-in-skills/prismer-blocked-page-recovery/scripts/recover_page.py +311 -0
- package/built-in-skills/prismer-box/LICENSE +21 -0
- package/built-in-skills/prismer-box/NOTICE.md +11 -0
- package/built-in-skills/prismer-box/SKILL.md +147 -0
- package/built-in-skills/prismer-box/references/bulk-operations.md +43 -0
- package/built-in-skills/prismer-box/references/cli-guide.md +133 -0
- package/built-in-skills/prismer-box/references/content-workflows.md +86 -0
- package/built-in-skills/prismer-box/references/hubs.md +77 -0
- package/built-in-skills/prismer-box/references/oauth-setup.md +92 -0
- package/built-in-skills/prismer-box/references/rest-api.md +37 -0
- package/built-in-skills/prismer-box/references/sdk-development.md +85 -0
- package/built-in-skills/prismer-box/references/search-and-ai.md +147 -0
- package/built-in-skills/prismer-box/references/troubleshooting.md +33 -0
- package/built-in-skills/prismer-box/references/webhooks-and-events.md +43 -0
- package/built-in-skills/prismer-codebase-inspection/LICENSE +21 -0
- package/built-in-skills/prismer-codebase-inspection/NOTICE.md +17 -0
- package/built-in-skills/prismer-codebase-inspection/SKILL.md +141 -0
- package/built-in-skills/prismer-computer-use/LICENSE +21 -0
- package/built-in-skills/prismer-computer-use/NOTICE.md +17 -0
- package/built-in-skills/prismer-computer-use/SKILL.md +372 -0
- package/built-in-skills/prismer-design-md/LICENSE +21 -0
- package/built-in-skills/prismer-design-md/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-design-md/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-design-md/SKILL.md +227 -0
- package/built-in-skills/prismer-design-md/templates/starter.md +99 -0
- package/built-in-skills/prismer-email-inbox-triage/LICENSE +21 -0
- package/built-in-skills/prismer-email-inbox-triage/NOTICE.md +11 -0
- package/built-in-skills/prismer-email-inbox-triage/SKILL.md +116 -0
- package/built-in-skills/prismer-findmy/LICENSE +21 -0
- package/built-in-skills/prismer-findmy/NOTICE.md +17 -0
- package/built-in-skills/prismer-findmy/SKILL.md +150 -0
- package/built-in-skills/prismer-findmy/scripts/readiness.py +47 -0
- package/built-in-skills/prismer-gif-search/LICENSE +21 -0
- package/built-in-skills/prismer-gif-search/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-gif-search/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-gif-search/SKILL.md +97 -0
- package/built-in-skills/prismer-gif-search/scripts/tenor.py +81 -0
- package/built-in-skills/prismer-github/LICENSE +21 -0
- package/built-in-skills/prismer-github/NOTICE.md +17 -0
- package/built-in-skills/prismer-github/SKILL.md +74 -0
- package/built-in-skills/prismer-github/references/auth.md +91 -0
- package/built-in-skills/prismer-github/references/ci-troubleshooting.md +193 -0
- package/built-in-skills/prismer-github/references/code-review.md +465 -0
- package/built-in-skills/prismer-github/references/conventional-commits.md +81 -0
- package/built-in-skills/prismer-github/references/github-api-cheatsheet.md +177 -0
- package/built-in-skills/prismer-github/references/issue-to-pr.md +74 -0
- package/built-in-skills/prismer-github/references/issues.md +336 -0
- package/built-in-skills/prismer-github/references/pr-workflow.md +346 -0
- package/built-in-skills/prismer-github/references/repo-management.md +484 -0
- package/built-in-skills/prismer-github/references/review-output-template.md +84 -0
- package/built-in-skills/prismer-github/scripts/ensure-gh.py +132 -0
- package/built-in-skills/prismer-github/scripts/gh-env.sh +25 -0
- package/built-in-skills/prismer-github/scripts/git-credential-token.py +68 -0
- package/built-in-skills/prismer-github/scripts/github-api.py +71 -0
- package/built-in-skills/prismer-github/scripts/github-context.py +28 -0
- package/built-in-skills/prismer-github/templates/bug-report.md +35 -0
- package/built-in-skills/prismer-github/templates/feature-request.md +31 -0
- package/built-in-skills/prismer-github/templates/pr-body-bugfix.md +35 -0
- package/built-in-skills/prismer-github/templates/pr-body-feature.md +33 -0
- package/built-in-skills/prismer-google-workspace/LICENSE +21 -0
- package/built-in-skills/prismer-google-workspace/NOTICE.md +11 -0
- package/built-in-skills/prismer-google-workspace/SKILL.md +369 -0
- package/built-in-skills/prismer-google-workspace/references/daily-brief.md +65 -0
- package/built-in-skills/prismer-google-workspace/references/gmail-search-syntax.md +63 -0
- package/built-in-skills/prismer-google-workspace/scripts/_hermes_home.py +17 -0
- package/built-in-skills/prismer-google-workspace/scripts/_private_state.py +39 -0
- package/built-in-skills/prismer-google-workspace/scripts/google_api.py +1339 -0
- package/built-in-skills/prismer-google-workspace/scripts/gws_bridge.py +121 -0
- package/built-in-skills/prismer-google-workspace/scripts/setup.py +563 -0
- package/built-in-skills/prismer-google-workspace/tests/test_productivity_regressions.py +214 -0
- package/built-in-skills/prismer-hermes-agent/LICENSE +21 -0
- package/built-in-skills/prismer-hermes-agent/NOTICE.md +17 -0
- package/built-in-skills/prismer-hermes-agent/SKILL.md +247 -0
- package/built-in-skills/prismer-hermes-agent/references/background-systems.md +108 -0
- package/built-in-skills/prismer-hermes-agent/references/cli-reference.md +158 -0
- package/built-in-skills/prismer-hermes-agent/references/configuration.md +96 -0
- package/built-in-skills/prismer-hermes-agent/references/contributor-guide.md +151 -0
- package/built-in-skills/prismer-hermes-agent/references/delegate-task-concurrency-diagnosis.md +47 -0
- package/built-in-skills/prismer-hermes-agent/references/desktop-plugins.md +215 -0
- package/built-in-skills/prismer-hermes-agent/references/native-mcp.md +351 -0
- package/built-in-skills/prismer-hermes-agent/references/petdex.md +82 -0
- package/built-in-skills/prismer-hermes-agent/references/portal-auth-for-third-party-apps.md +135 -0
- package/built-in-skills/prismer-hermes-agent/references/project-context-files.md +55 -0
- package/built-in-skills/prismer-hermes-agent/references/providers-and-models.md +81 -0
- package/built-in-skills/prismer-hermes-agent/references/security-privacy.md +73 -0
- package/built-in-skills/prismer-hermes-agent/references/slash-commands.md +119 -0
- package/built-in-skills/prismer-hermes-agent/references/themes.md +134 -0
- package/built-in-skills/prismer-hermes-agent/references/troubleshooting.md +87 -0
- package/built-in-skills/prismer-hermes-agent/references/tui-widgets.md +144 -0
- package/built-in-skills/prismer-hermes-agent/references/webhooks.md +219 -0
- package/built-in-skills/prismer-hermes-agent/references/windows-quirks.md +64 -0
- package/built-in-skills/prismer-hermes-agent/templates/clock.mjs +51 -0
- package/built-in-skills/prismer-hermes-agent/templates/plugin.js +97 -0
- package/built-in-skills/prismer-hermes-agent/templates/skin.yaml +49 -0
- package/built-in-skills/prismer-himalaya/LICENSE +21 -0
- package/built-in-skills/prismer-himalaya/NOTICE.md +11 -0
- package/built-in-skills/prismer-himalaya/SKILL.md +340 -0
- package/built-in-skills/prismer-himalaya/references/configuration.md +227 -0
- package/built-in-skills/prismer-himalaya/references/message-composition.md +206 -0
- package/built-in-skills/prismer-himalaya/scripts/compose_draft.py +48 -0
- package/built-in-skills/prismer-im-collab/SKILL.md +27 -7
- package/built-in-skills/prismer-imessage/LICENSE +21 -0
- package/built-in-skills/prismer-imessage/NOTICE.md +17 -0
- package/built-in-skills/prismer-imessage/SKILL.md +128 -0
- package/built-in-skills/prismer-imessage/scripts/readiness.py +47 -0
- package/built-in-skills/prismer-manim-video/LICENSE +21 -0
- package/built-in-skills/prismer-manim-video/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-manim-video/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-manim-video/README.md +23 -0
- package/built-in-skills/prismer-manim-video/SKILL.md +279 -0
- package/built-in-skills/prismer-manim-video/references/animation-design-thinking.md +161 -0
- package/built-in-skills/prismer-manim-video/references/animations.md +282 -0
- package/built-in-skills/prismer-manim-video/references/camera-and-3d.md +135 -0
- package/built-in-skills/prismer-manim-video/references/decorations.md +202 -0
- package/built-in-skills/prismer-manim-video/references/equations.md +216 -0
- package/built-in-skills/prismer-manim-video/references/graphs-and-data.md +163 -0
- package/built-in-skills/prismer-manim-video/references/mobjects.md +333 -0
- package/built-in-skills/prismer-manim-video/references/paper-explainer.md +255 -0
- package/built-in-skills/prismer-manim-video/references/production-quality.md +190 -0
- package/built-in-skills/prismer-manim-video/references/rendering.md +187 -0
- package/built-in-skills/prismer-manim-video/references/scene-planning.md +118 -0
- package/built-in-skills/prismer-manim-video/references/troubleshooting.md +135 -0
- package/built-in-skills/prismer-manim-video/references/updaters-and-trackers.md +260 -0
- package/built-in-skills/prismer-manim-video/references/visual-design.md +124 -0
- package/built-in-skills/prismer-manim-video/scripts/setup.sh +15 -0
- package/built-in-skills/prismer-maps/LICENSE +21 -0
- package/built-in-skills/prismer-maps/NOTICE.md +11 -0
- package/built-in-skills/prismer-maps/SKILL.md +240 -0
- package/built-in-skills/prismer-maps/scripts/maps_client.py +1324 -0
- package/built-in-skills/prismer-node-inspect-debugger/LICENSE +21 -0
- package/built-in-skills/prismer-node-inspect-debugger/NOTICE.md +17 -0
- package/built-in-skills/prismer-node-inspect-debugger/SKILL.md +347 -0
- package/built-in-skills/prismer-notion/LICENSE +21 -0
- package/built-in-skills/prismer-notion/NOTICE.md +11 -0
- package/built-in-skills/prismer-notion/SKILL.md +495 -0
- package/built-in-skills/prismer-notion/references/block-types.md +112 -0
- package/built-in-skills/prismer-obsidian/LICENSE +21 -0
- package/built-in-skills/prismer-obsidian/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-obsidian/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-obsidian/SKILL.md +80 -0
- package/built-in-skills/prismer-obsidian/provenance/category-DESCRIPTION.md +3 -0
- package/built-in-skills/prismer-obsidian/scripts/write_note.py +84 -0
- package/built-in-skills/prismer-p5js/LICENSE +21 -0
- package/built-in-skills/prismer-p5js/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-p5js/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-p5js/README.md +64 -0
- package/built-in-skills/prismer-p5js/SKILL.md +574 -0
- package/built-in-skills/prismer-p5js/references/animation.md +439 -0
- package/built-in-skills/prismer-p5js/references/color-systems.md +355 -0
- package/built-in-skills/prismer-p5js/references/core-api.md +410 -0
- package/built-in-skills/prismer-p5js/references/export-pipeline.md +534 -0
- package/built-in-skills/prismer-p5js/references/interaction.md +398 -0
- package/built-in-skills/prismer-p5js/references/shapes-and-geometry.md +300 -0
- package/built-in-skills/prismer-p5js/references/troubleshooting.md +532 -0
- package/built-in-skills/prismer-p5js/references/typography.md +302 -0
- package/built-in-skills/prismer-p5js/references/visual-effects.md +905 -0
- package/built-in-skills/prismer-p5js/references/webgl-and-3d.md +423 -0
- package/built-in-skills/prismer-p5js/scripts/export-frames.js +91 -0
- package/built-in-skills/prismer-p5js/scripts/render.sh +113 -0
- package/built-in-skills/prismer-p5js/scripts/serve.sh +25 -0
- package/built-in-skills/prismer-p5js/scripts/setup.sh +87 -0
- package/built-in-skills/prismer-p5js/templates/viewer.html +401 -0
- package/built-in-skills/prismer-popular-web-designs/LICENSE +21 -0
- package/built-in-skills/prismer-popular-web-designs/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-popular-web-designs/LICENSE.origin +21 -0
- package/built-in-skills/prismer-popular-web-designs/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-popular-web-designs/SKILL.md +218 -0
- package/built-in-skills/prismer-popular-web-designs/templates/airbnb.md +259 -0
- package/built-in-skills/prismer-popular-web-designs/templates/airtable.md +102 -0
- package/built-in-skills/prismer-popular-web-designs/templates/apple.md +326 -0
- package/built-in-skills/prismer-popular-web-designs/templates/bmw.md +193 -0
- package/built-in-skills/prismer-popular-web-designs/templates/cal.md +272 -0
- package/built-in-skills/prismer-popular-web-designs/templates/claude.md +325 -0
- package/built-in-skills/prismer-popular-web-designs/templates/clay.md +317 -0
- package/built-in-skills/prismer-popular-web-designs/templates/clickhouse.md +294 -0
- package/built-in-skills/prismer-popular-web-designs/templates/cohere.md +279 -0
- package/built-in-skills/prismer-popular-web-designs/templates/coinbase.md +142 -0
- package/built-in-skills/prismer-popular-web-designs/templates/composio.md +320 -0
- package/built-in-skills/prismer-popular-web-designs/templates/cursor.md +322 -0
- package/built-in-skills/prismer-popular-web-designs/templates/elevenlabs.md +278 -0
- package/built-in-skills/prismer-popular-web-designs/templates/expo.md +294 -0
- package/built-in-skills/prismer-popular-web-designs/templates/figma.md +233 -0
- package/built-in-skills/prismer-popular-web-designs/templates/framer.md +259 -0
- package/built-in-skills/prismer-popular-web-designs/templates/hashicorp.md +291 -0
- package/built-in-skills/prismer-popular-web-designs/templates/ibm.md +345 -0
- package/built-in-skills/prismer-popular-web-designs/templates/intercom.md +159 -0
- package/built-in-skills/prismer-popular-web-designs/templates/kraken.md +138 -0
- package/built-in-skills/prismer-popular-web-designs/templates/linear.app.md +380 -0
- package/built-in-skills/prismer-popular-web-designs/templates/lovable.md +311 -0
- package/built-in-skills/prismer-popular-web-designs/templates/minimax.md +270 -0
- package/built-in-skills/prismer-popular-web-designs/templates/mintlify.md +339 -0
- package/built-in-skills/prismer-popular-web-designs/templates/miro.md +121 -0
- package/built-in-skills/prismer-popular-web-designs/templates/mistral.ai.md +274 -0
- package/built-in-skills/prismer-popular-web-designs/templates/mongodb.md +279 -0
- package/built-in-skills/prismer-popular-web-designs/templates/notion.md +322 -0
- package/built-in-skills/prismer-popular-web-designs/templates/nvidia.md +306 -0
- package/built-in-skills/prismer-popular-web-designs/templates/ollama.md +280 -0
- package/built-in-skills/prismer-popular-web-designs/templates/opencode.ai.md +294 -0
- package/built-in-skills/prismer-popular-web-designs/templates/pinterest.md +243 -0
- package/built-in-skills/prismer-popular-web-designs/templates/posthog.md +269 -0
- package/built-in-skills/prismer-popular-web-designs/templates/raycast.md +281 -0
- package/built-in-skills/prismer-popular-web-designs/templates/replicate.md +274 -0
- package/built-in-skills/prismer-popular-web-designs/templates/resend.md +316 -0
- package/built-in-skills/prismer-popular-web-designs/templates/revolut.md +198 -0
- package/built-in-skills/prismer-popular-web-designs/templates/runwayml.md +257 -0
- package/built-in-skills/prismer-popular-web-designs/templates/sanity.md +370 -0
- package/built-in-skills/prismer-popular-web-designs/templates/sentry.md +275 -0
- package/built-in-skills/prismer-popular-web-designs/templates/spacex.md +207 -0
- package/built-in-skills/prismer-popular-web-designs/templates/spotify.md +259 -0
- package/built-in-skills/prismer-popular-web-designs/templates/stripe.md +335 -0
- package/built-in-skills/prismer-popular-web-designs/templates/supabase.md +268 -0
- package/built-in-skills/prismer-popular-web-designs/templates/superhuman.md +265 -0
- package/built-in-skills/prismer-popular-web-designs/templates/together.ai.md +276 -0
- package/built-in-skills/prismer-popular-web-designs/templates/uber.md +308 -0
- package/built-in-skills/prismer-popular-web-designs/templates/vercel.md +323 -0
- package/built-in-skills/prismer-popular-web-designs/templates/voltagent.md +336 -0
- package/built-in-skills/prismer-popular-web-designs/templates/warp.md +266 -0
- package/built-in-skills/prismer-popular-web-designs/templates/webflow.md +105 -0
- package/built-in-skills/prismer-popular-web-designs/templates/wise.md +186 -0
- package/built-in-skills/prismer-popular-web-designs/templates/x.ai.md +270 -0
- package/built-in-skills/prismer-popular-web-designs/templates/zapier.md +341 -0
- package/built-in-skills/prismer-product-price-monitor/LICENSE +21 -0
- package/built-in-skills/prismer-product-price-monitor/NOTICE.md +11 -0
- package/built-in-skills/prismer-product-price-monitor/SKILL.md +97 -0
- package/built-in-skills/prismer-product-price-monitor/scripts/watch_state.py +116 -0
- package/built-in-skills/prismer-python-debugpy/LICENSE +21 -0
- package/built-in-skills/prismer-python-debugpy/NOTICE.md +17 -0
- package/built-in-skills/prismer-python-debugpy/SKILL.md +377 -0
- package/built-in-skills/prismer-python-debugpy/scripts/dap_client.py +68 -0
- package/built-in-skills/prismer-songsee/LICENSE +21 -0
- package/built-in-skills/prismer-songsee/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-songsee/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-songsee/SKILL.md +91 -0
- package/built-in-skills/prismer-songwriting-and-ai-music/LICENSE +21 -0
- package/built-in-skills/prismer-songwriting-and-ai-music/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-songwriting-and-ai-music/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-songwriting-and-ai-music/SKILL.md +317 -0
- package/built-in-skills/prismer-spike/LICENSE +21 -0
- package/built-in-skills/prismer-spike/LICENSE.gsd +21 -0
- package/built-in-skills/prismer-spike/NOTICE.md +17 -0
- package/built-in-skills/prismer-spike/SKILL.md +212 -0
- package/built-in-skills/prismer-teams-meeting-pipeline/LICENSE +21 -0
- package/built-in-skills/prismer-teams-meeting-pipeline/NOTICE.md +11 -0
- package/built-in-skills/prismer-teams-meeting-pipeline/SKILL.md +156 -0
- package/built-in-skills/prismer-xurl/LICENSE +21 -0
- package/built-in-skills/prismer-xurl/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-xurl/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-xurl/SKILL.md +444 -0
- package/built-in-skills/prismer-xurl/provenance/category-DESCRIPTION.md +3 -0
- package/built-in-skills/prismer-youtube-content/LICENSE +21 -0
- package/built-in-skills/prismer-youtube-content/LICENSE.hermes +21 -0
- package/built-in-skills/prismer-youtube-content/PROVENANCE.md +7 -0
- package/built-in-skills/prismer-youtube-content/SKILL.md +86 -0
- package/built-in-skills/prismer-youtube-content/provenance/category-DESCRIPTION.md +3 -0
- package/built-in-skills/prismer-youtube-content/references/output-formats.md +56 -0
- package/built-in-skills/prismer-youtube-content/scripts/fetch_transcript.py +146 -0
- package/built-in-skills/proactivity/SKILL.md +84 -0
- package/built-in-skills/remotion/SKILL.md +431 -0
- package/built-in-skills/research-arxiv/LICENSE +21 -0
- package/built-in-skills/research-arxiv/NOTICE.md +4 -0
- package/built-in-skills/research-arxiv/SKILL.md +263 -0
- package/built-in-skills/research-arxiv/scripts/search_arxiv.py +111 -0
- package/built-in-skills/role-builder/SKILL.md +209 -0
- package/built-in-skills/role-builder/scripts/author-role.mjs +350 -0
- package/built-in-skills/role-builder/scripts/ingest-role.mjs +121 -0
- package/built-in-skills/role-builder/scripts/instantiate-and-run.mjs +304 -0
- package/built-in-skills/role-builder/scripts/operation-harness.mjs +269 -0
- package/built-in-skills/skill-creator/LICENSE.prismer +21 -0
- package/built-in-skills/skill-creator/NOTICE.md +18 -0
- package/built-in-skills/skill-creator/SKILL.md +182 -421
- package/built-in-skills/skill-creator/eval-viewer/generate_review.py +20 -31
- package/built-in-skills/skill-creator/eval-viewer/viewer.html +35 -23
- package/built-in-skills/skill-creator/references/external-library-import.md +110 -0
- package/built-in-skills/skill-creator/references/hermes-agent-skill-authoring/GUIDE.md +220 -0
- package/built-in-skills/skill-creator/references/hermes-agent-skill-authoring/LICENSE +21 -0
- package/built-in-skills/skill-creator/references/skill-authoring/GUIDE.md +134 -0
- package/built-in-skills/{skill-authoring/skill.json → skill-creator/references/skill-authoring/draft-contract.json} +3 -3
- package/built-in-skills/skill-creator/references/skill-builder/GUIDE.md +167 -0
- package/built-in-skills/skill-creator/references/skill-builder/scripts/ingest.mjs +93 -0
- package/built-in-skills/skill-creator/scripts/aggregate_benchmark.py +3 -2
- package/built-in-skills/skill-creator/scripts/import-library.mjs +498 -0
- package/built-in-skills/skill-creator/scripts/improve_description.py +14 -16
- package/built-in-skills/skill-creator/scripts/package_skill.py +16 -9
- package/built-in-skills/skill-creator/scripts/quick_validate.py +22 -5
- package/built-in-skills/skill-creator/scripts/run_eval.py +63 -144
- package/built-in-skills/skill-creator/scripts/run_loop.py +24 -16
- package/built-in-skills/slack-gif-creator/SKILL.md +20 -0
- package/built-in-skills/slack-gif-creator/core/gif_builder.py +13 -2
- package/built-in-skills/slack-gif-creator/core/validators.py +17 -7
- package/built-in-skills/tasks/SKILL.md +39 -24
- package/built-in-skills/tdd/LICENSE +21 -0
- package/built-in-skills/tdd/SKILL.md +117 -0
- package/built-in-skills/tdd/mocking.md +59 -0
- package/built-in-skills/tdd/refactoring.md +10 -0
- package/built-in-skills/tdd/references/test-driven-development/GUIDE.md +356 -0
- package/built-in-skills/tdd/references/test-driven-development/LICENSE +21 -0
- package/built-in-skills/tdd/references/test-driven-development/LICENSE.superpowers +21 -0
- package/built-in-skills/tdd/references/test-driven-development/NOTICE.md +37 -0
- package/built-in-skills/tdd/tests.md +61 -0
- package/built-in-skills/team/SKILL.md +3 -2
- package/built-in-skills/web-artifacts-builder/SKILL.md +4 -3
- package/built-in-skills/web-artifacts-builder/scripts/bundle-artifact.sh +9 -7
- package/built-in-skills/web-artifacts-builder/scripts/init-artifact.sh +28 -55
- package/built-in-skills/webapp-qa/LICENSE +21 -0
- package/built-in-skills/webapp-qa/NOTICE.md +37 -0
- package/built-in-skills/webapp-qa/SKILL.md +41 -0
- package/built-in-skills/webapp-qa/references/dogfood/GUIDE.md +161 -0
- package/built-in-skills/webapp-qa/references/issue-taxonomy.md +109 -0
- package/built-in-skills/webapp-qa/templates/dogfood-report-template.md +86 -0
- package/built-in-skills/webapp-testing/SKILL.md +10 -2
- package/built-in-skills/webapp-testing/examples/console_logging.py +10 -4
- package/built-in-skills/webapp-testing/examples/element_discovery.py +11 -4
- package/built-in-skills/webapp-testing/examples/static_html_automation.py +14 -9
- package/built-in-skills/webapp-testing/scripts/with_server.py +34 -10
- package/built-in-skills/wechat-pay/SKILL.md +59 -0
- package/built-in-skills/weekly-review/LICENSE +21 -0
- package/built-in-skills/weekly-review/NOTICE.md +21 -0
- package/built-in-skills/weekly-review/SKILL.md +49 -0
- package/components/eaas-pi-components.manifest.json +37 -0
- package/dist/cli.cjs +75799 -20210
- package/dist/cli.js +75900 -20248
- package/dist/index.cjs +76159 -20082
- package/dist/index.d.cts +4766 -766
- package/dist/index.d.ts +4766 -766
- package/dist/index.js +76040 -19960
- package/package.json +42 -6
- package/plugins/memory/prismer/__init__.py +1215 -0
- package/plugins/memory/prismer/plugin.yaml +8 -0
- package/plugins/memory/prismer/tool-schemas.generated.json +257 -0
- package/plugins/tools/prismer-recall/__init__.py +282 -0
- package/plugins/tools/prismer-recall/plugin.yaml +15 -0
- package/built-in-skills/memory-curation/SKILL.md +0 -135
- package/built-in-skills/skill-authoring/SKILL.md +0 -124
- package/built-in-skills/web-artifacts-builder/scripts/shadcn-components.tar.gz +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
|