@rosetears/aili-pi 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -0
  3. package/THIRD_PARTY_NOTICES.md +64 -0
  4. package/extensions/index.ts +6 -0
  5. package/install.sh +5 -0
  6. package/manifests/adapter-evidence.json +45 -0
  7. package/manifests/capabilities.json +124 -0
  8. package/manifests/live-verification.json +26 -0
  9. package/manifests/provenance.json +71 -0
  10. package/manifests/roles.json +474 -0
  11. package/manifests/sbom.json +7797 -0
  12. package/manifests/skill-compatibility.json +8100 -0
  13. package/manifests/subagent-provenance.json +37 -0
  14. package/package.json +91 -0
  15. package/prompts/build.md +8 -0
  16. package/prompts/define.md +8 -0
  17. package/prompts/ideate.md +8 -0
  18. package/prompts/local-review.md +8 -0
  19. package/prompts/ship.md +8 -0
  20. package/roles/agent-evaluator.md +47 -0
  21. package/roles/ai-regression-scout.md +47 -0
  22. package/roles/browser-qa-runner.md +47 -0
  23. package/roles/code-reviewer.md +47 -0
  24. package/roles/code-scout.md +47 -0
  25. package/roles/convergence-reviewer.md +55 -0
  26. package/roles/doc-researcher.md +47 -0
  27. package/roles/e2e-artifact-runner.md +47 -0
  28. package/roles/implementer.md +47 -0
  29. package/roles/opensource-sanitizer.md +47 -0
  30. package/roles/plan-auditor.md +47 -0
  31. package/roles/pr-test-analyzer.md +47 -0
  32. package/roles/security-auditor.md +47 -0
  33. package/roles/silent-failure-reviewer.md +47 -0
  34. package/roles/spec-miner.md +47 -0
  35. package/roles/test-coverage-reviewer.md +47 -0
  36. package/roles/test-engineer.md +48 -0
  37. package/roles/web-performance-auditor.md +47 -0
  38. package/roles/web-researcher.md +47 -0
  39. package/scripts/apply-adapter-evidence.ts +73 -0
  40. package/scripts/bootstrap.sh +180 -0
  41. package/scripts/generate-provenance.ts +143 -0
  42. package/scripts/local-package-e2e.ts +51 -0
  43. package/scripts/sync-roles.ts +213 -0
  44. package/scripts/sync-skills.ts +356 -0
  45. package/scripts/validate-runtime.ts +11 -0
  46. package/skills/academic-paper-review/SKILL.md +81 -0
  47. package/skills/agents-md-initialization/SKILL.md +121 -0
  48. package/skills/agents-md-initialization/references/agents-template.md +83 -0
  49. package/skills/agents-md-initialization/references/agents_md.py +215 -0
  50. package/skills/ai-regression-scout/SKILL.md +24 -0
  51. package/skills/aili-delivery-flow/SKILL.md +125 -0
  52. package/skills/aili-delivery-flow/references/artifact-contracts.md +138 -0
  53. package/skills/aili-delivery-flow/references/backend-routing.md +40 -0
  54. package/skills/aili-delivery-flow/references/build-execution-loop.md +113 -0
  55. package/skills/aili-delivery-flow/references/build-goal-mode.md +3 -0
  56. package/skills/aili-delivery-flow/references/direct-vs-delegated-work.md +38 -0
  57. package/skills/aili-delivery-flow/references/implementation-packages.md +54 -0
  58. package/skills/aili-delivery-flow/references/lifecycle.md +127 -0
  59. package/skills/aili-delivery-flow/references/protocols/acceptance-test-plan.md +18 -0
  60. package/skills/aili-delivery-flow/references/protocols/alignment-questionnaire.md +10 -0
  61. package/skills/aili-delivery-flow/references/protocols/closeout-report.md +101 -0
  62. package/skills/aili-delivery-flow/references/protocols/compact-evidence-pack.md +46 -0
  63. package/skills/aili-delivery-flow/references/protocols/idea-brief.md +10 -0
  64. package/skills/aili-delivery-flow/references/protocols/implementation-package.md +53 -0
  65. package/skills/aili-delivery-flow/references/protocols/research-evidence-pack.md +19 -0
  66. package/skills/aili-delivery-flow/references/protocols/review-report.md +7 -0
  67. package/skills/aili-delivery-flow/references/protocols/spec-draft.md +12 -0
  68. package/skills/aili-delivery-flow/references/protocols/subagent-result.md +60 -0
  69. package/skills/aili-delivery-flow/references/protocols/subagent-task-packet.md +29 -0
  70. package/skills/aili-delivery-flow/references/protocols/worktree-context.md +109 -0
  71. package/skills/aili-delivery-flow/references/questionnaire-policy.md +62 -0
  72. package/skills/aili-delivery-flow/references/review-repair-loop.md +16 -0
  73. package/skills/aili-delivery-flow/references/test-document-policy.md +35 -0
  74. package/skills/android-native-dev/SKILL.md +722 -0
  75. package/skills/android-native-dev/references/accessibility.md +209 -0
  76. package/skills/android-native-dev/references/adaptive-screens.md +231 -0
  77. package/skills/android-native-dev/references/design-style-guide.md +365 -0
  78. package/skills/android-native-dev/references/functional-requirements.md +229 -0
  79. package/skills/android-native-dev/references/motion-system.md +203 -0
  80. package/skills/android-native-dev/references/performance-stability.md +223 -0
  81. package/skills/android-native-dev/references/privacy-security.md +244 -0
  82. package/skills/android-native-dev/references/testing.md +554 -0
  83. package/skills/android-native-dev/references/visual-design.md +246 -0
  84. package/skills/api-and-interface-design/SKILL.md +318 -0
  85. package/skills/browser-qa/SKILL.md +32 -0
  86. package/skills/browser-testing-with-devtools/SKILL.md +323 -0
  87. package/skills/build-failure-repair/SKILL.md +49 -0
  88. package/skills/chart-visualization/SKILL.md +73 -0
  89. package/skills/ci-cd-and-automation/SKILL.md +353 -0
  90. package/skills/code-review-and-quality/SKILL.md +375 -0
  91. package/skills/code-review-quality-gates/SKILL.md +132 -0
  92. package/skills/code-simplification/SKILL.md +371 -0
  93. package/skills/comment-accuracy-review/SKILL.md +37 -0
  94. package/skills/consulting-analysis/SKILL.md +69 -0
  95. package/skills/context-engineering/SKILL.md +375 -0
  96. package/skills/coverage-review/SKILL.md +24 -0
  97. package/skills/data-analysis/SKILL.md +74 -0
  98. package/skills/deprecation-and-migration/SKILL.md +222 -0
  99. package/skills/documentation-and-adrs/SKILL.md +330 -0
  100. package/skills/e2e-artifact-handling/SKILL.md +30 -0
  101. package/skills/evidence-scoped-retrospective/SKILL.md +156 -0
  102. package/skills/explain-by-allegory/SKILL.md +99 -0
  103. package/skills/flutter-dev/SKILL.md +162 -0
  104. package/skills/flutter-dev/references/animations.md +497 -0
  105. package/skills/flutter-dev/references/bloc-state.md +281 -0
  106. package/skills/flutter-dev/references/forms.md +656 -0
  107. package/skills/flutter-dev/references/gorouter-navigation.md +257 -0
  108. package/skills/flutter-dev/references/localization.md +510 -0
  109. package/skills/flutter-dev/references/networking.md +566 -0
  110. package/skills/flutter-dev/references/performance.md +305 -0
  111. package/skills/flutter-dev/references/platform-specific.md +417 -0
  112. package/skills/flutter-dev/references/project-structure.md +273 -0
  113. package/skills/flutter-dev/references/riverpod-state.md +232 -0
  114. package/skills/flutter-dev/references/testing.md +364 -0
  115. package/skills/flutter-dev/references/widget-patterns.md +233 -0
  116. package/skills/frontend-dev/SKILL.md +468 -0
  117. package/skills/frontend-dev/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  118. package/skills/frontend-dev/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  119. package/skills/frontend-dev/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  120. package/skills/frontend-dev/canvas-fonts/BigShoulders-OFL.txt +93 -0
  121. package/skills/frontend-dev/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  122. package/skills/frontend-dev/canvas-fonts/Boldonse-OFL.txt +93 -0
  123. package/skills/frontend-dev/canvas-fonts/Boldonse-Regular.ttf +0 -0
  124. package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  125. package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  126. package/skills/frontend-dev/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  127. package/skills/frontend-dev/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  128. package/skills/frontend-dev/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  129. package/skills/frontend-dev/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  130. package/skills/frontend-dev/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  131. package/skills/frontend-dev/canvas-fonts/DMMono-OFL.txt +93 -0
  132. package/skills/frontend-dev/canvas-fonts/DMMono-Regular.ttf +0 -0
  133. package/skills/frontend-dev/canvas-fonts/EricaOne-OFL.txt +94 -0
  134. package/skills/frontend-dev/canvas-fonts/EricaOne-Regular.ttf +0 -0
  135. package/skills/frontend-dev/canvas-fonts/GeistMono-Bold.ttf +0 -0
  136. package/skills/frontend-dev/canvas-fonts/GeistMono-OFL.txt +93 -0
  137. package/skills/frontend-dev/canvas-fonts/GeistMono-Regular.ttf +0 -0
  138. package/skills/frontend-dev/canvas-fonts/Gloock-OFL.txt +93 -0
  139. package/skills/frontend-dev/canvas-fonts/Gloock-Regular.ttf +0 -0
  140. package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  141. package/skills/frontend-dev/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  142. package/skills/frontend-dev/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  143. package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  144. package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  145. package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  146. package/skills/frontend-dev/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  147. package/skills/frontend-dev/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  148. package/skills/frontend-dev/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  149. package/skills/frontend-dev/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  150. package/skills/frontend-dev/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  151. package/skills/frontend-dev/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  152. package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  153. package/skills/frontend-dev/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  154. package/skills/frontend-dev/canvas-fonts/Italiana-OFL.txt +93 -0
  155. package/skills/frontend-dev/canvas-fonts/Italiana-Regular.ttf +0 -0
  156. package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  157. package/skills/frontend-dev/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  158. package/skills/frontend-dev/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  159. package/skills/frontend-dev/canvas-fonts/Jura-Light.ttf +0 -0
  160. package/skills/frontend-dev/canvas-fonts/Jura-Medium.ttf +0 -0
  161. package/skills/frontend-dev/canvas-fonts/Jura-OFL.txt +93 -0
  162. package/skills/frontend-dev/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  163. package/skills/frontend-dev/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  164. package/skills/frontend-dev/canvas-fonts/Lora-Bold.ttf +0 -0
  165. package/skills/frontend-dev/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  166. package/skills/frontend-dev/canvas-fonts/Lora-Italic.ttf +0 -0
  167. package/skills/frontend-dev/canvas-fonts/Lora-OFL.txt +93 -0
  168. package/skills/frontend-dev/canvas-fonts/Lora-Regular.ttf +0 -0
  169. package/skills/frontend-dev/canvas-fonts/NationalPark-Bold.ttf +0 -0
  170. package/skills/frontend-dev/canvas-fonts/NationalPark-OFL.txt +93 -0
  171. package/skills/frontend-dev/canvas-fonts/NationalPark-Regular.ttf +0 -0
  172. package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  173. package/skills/frontend-dev/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  174. package/skills/frontend-dev/canvas-fonts/Outfit-Bold.ttf +0 -0
  175. package/skills/frontend-dev/canvas-fonts/Outfit-OFL.txt +93 -0
  176. package/skills/frontend-dev/canvas-fonts/Outfit-Regular.ttf +0 -0
  177. package/skills/frontend-dev/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  178. package/skills/frontend-dev/canvas-fonts/PixelifySans-OFL.txt +93 -0
  179. package/skills/frontend-dev/canvas-fonts/PoiretOne-OFL.txt +93 -0
  180. package/skills/frontend-dev/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  181. package/skills/frontend-dev/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  182. package/skills/frontend-dev/canvas-fonts/RedHatMono-OFL.txt +93 -0
  183. package/skills/frontend-dev/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  184. package/skills/frontend-dev/canvas-fonts/Silkscreen-OFL.txt +93 -0
  185. package/skills/frontend-dev/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  186. package/skills/frontend-dev/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  187. package/skills/frontend-dev/canvas-fonts/SmoochSans-OFL.txt +93 -0
  188. package/skills/frontend-dev/canvas-fonts/Tektur-Medium.ttf +0 -0
  189. package/skills/frontend-dev/canvas-fonts/Tektur-OFL.txt +93 -0
  190. package/skills/frontend-dev/canvas-fonts/Tektur-Regular.ttf +0 -0
  191. package/skills/frontend-dev/canvas-fonts/WorkSans-Bold.ttf +0 -0
  192. package/skills/frontend-dev/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  193. package/skills/frontend-dev/canvas-fonts/WorkSans-Italic.ttf +0 -0
  194. package/skills/frontend-dev/canvas-fonts/WorkSans-OFL.txt +93 -0
  195. package/skills/frontend-dev/canvas-fonts/WorkSans-Regular.ttf +0 -0
  196. package/skills/frontend-dev/canvas-fonts/YoungSerif-OFL.txt +93 -0
  197. package/skills/frontend-dev/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  198. package/skills/frontend-dev/references/asset-prompt-guide.md +43 -0
  199. package/skills/frontend-dev/references/env-setup.md +33 -0
  200. package/skills/frontend-dev/references/minimax-cli-reference.md +133 -0
  201. package/skills/frontend-dev/references/minimax-image-guide.md +65 -0
  202. package/skills/frontend-dev/references/minimax-music-guide.md +216 -0
  203. package/skills/frontend-dev/references/minimax-tts-guide.md +78 -0
  204. package/skills/frontend-dev/references/minimax-video-guide.md +82 -0
  205. package/skills/frontend-dev/references/minimax-voice-catalog.md +685 -0
  206. package/skills/frontend-dev/references/motion-recipes.md +407 -0
  207. package/skills/frontend-dev/references/troubleshooting.md +85 -0
  208. package/skills/frontend-dev/scripts/minimax_image.py +137 -0
  209. package/skills/frontend-dev/scripts/minimax_music.py +157 -0
  210. package/skills/frontend-dev/scripts/minimax_tts.py +127 -0
  211. package/skills/frontend-dev/scripts/minimax_video.py +187 -0
  212. package/skills/frontend-dev/templates/generator_template.js +223 -0
  213. package/skills/frontend-dev/templates/viewer.html +599 -0
  214. package/skills/frontend-ui-engineering/SKILL.md +367 -0
  215. package/skills/fullstack-dev/SKILL.md +819 -0
  216. package/skills/fullstack-dev/references/api-design.md +444 -0
  217. package/skills/fullstack-dev/references/auth-flow.md +165 -0
  218. package/skills/fullstack-dev/references/db-schema.md +706 -0
  219. package/skills/fullstack-dev/references/django-best-practices.md +466 -0
  220. package/skills/fullstack-dev/references/environment-management.md +78 -0
  221. package/skills/fullstack-dev/references/release-checklist.md +278 -0
  222. package/skills/fullstack-dev/references/technology-selection.md +254 -0
  223. package/skills/fullstack-dev/references/testing-strategy.md +404 -0
  224. package/skills/git-workflow-and-versioning/SKILL.md +446 -0
  225. package/skills/github-evidence-triage/SKILL.md +115 -0
  226. package/skills/harness-evolution/SKILL.md +59 -0
  227. package/skills/harness-evolution/references/activation-matrix.md +13 -0
  228. package/skills/harness-evolution/references/approval-policy.md +20 -0
  229. package/skills/harness-evolution/references/change-report-template.md +33 -0
  230. package/skills/harness-evolution/references/component-taxonomy.md +19 -0
  231. package/skills/harness-evolution/references/verdict-policy.md +13 -0
  232. package/skills/harness-issue-triage/SKILL.md +72 -0
  233. package/skills/harness-issue-triage/references/component-diagnosis.md +25 -0
  234. package/skills/harness-issue-triage/references/triage-report-template.md +34 -0
  235. package/skills/harness-optimization-audit/SKILL.md +125 -0
  236. package/skills/idea-refine/SKILL.md +191 -0
  237. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
  238. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
  239. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/SKILL.upstream.md +178 -0
  240. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/examples.md +238 -0
  241. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/frameworks.md +99 -0
  242. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/refinement-criteria.md +113 -0
  243. package/skills/idea-refine/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/idea-refine/scripts/idea-refine.upstream.sh +15 -0
  244. package/skills/incremental-implementation/SKILL.md +252 -0
  245. package/skills/ios-application-dev/SKILL.md +212 -0
  246. package/skills/ios-application-dev/references/accessibility.md +259 -0
  247. package/skills/ios-application-dev/references/graphics-animation.md +350 -0
  248. package/skills/ios-application-dev/references/layout-system.md +199 -0
  249. package/skills/ios-application-dev/references/metal-shader.md +178 -0
  250. package/skills/ios-application-dev/references/navigation-patterns.md +175 -0
  251. package/skills/ios-application-dev/references/swift-coding-standards.md +757 -0
  252. package/skills/ios-application-dev/references/swiftui-design-guidelines.md +1167 -0
  253. package/skills/ios-application-dev/references/system-integration.md +401 -0
  254. package/skills/ios-application-dev/references/uikit-components.md +297 -0
  255. package/skills/local-review-gate/SKILL.md +207 -0
  256. package/skills/local-review-gate/references/addyosmani-code-review-rubric.md +33 -0
  257. package/skills/local-review-gate/references/codex-github-compatibility.md +26 -0
  258. package/skills/local-review-gate/references/ecc-code-review-adaptation.md +40 -0
  259. package/skills/local-review-gate/references/graphify-local-review.md +33 -0
  260. package/skills/local-review-gate/references/orchestration-adaptation.md +51 -0
  261. package/skills/local-review-gate/references/review-repair-lane-adaptation.md +46 -0
  262. package/skills/local-review-gate/references/upstream-provenance.md +61 -0
  263. package/skills/mature-project-pattern-research/SKILL.md +155 -0
  264. package/skills/mature-project-pattern-research/references/research-rubric.md +45 -0
  265. package/skills/minimax-docx/LICENSE +21 -0
  266. package/skills/minimax-docx/SKILL.md +273 -0
  267. package/skills/minimax-docx/assets/styles/academic_styles.xml +250 -0
  268. package/skills/minimax-docx/assets/styles/corporate_styles.xml +284 -0
  269. package/skills/minimax-docx/assets/styles/default_styles.xml +449 -0
  270. package/skills/minimax-docx/assets/xsd/aesthetic-rules.xsd +470 -0
  271. package/skills/minimax-docx/assets/xsd/business-rules.xsd +130 -0
  272. package/skills/minimax-docx/assets/xsd/common-types.xsd +159 -0
  273. package/skills/minimax-docx/assets/xsd/wml-subset.xsd +589 -0
  274. package/skills/minimax-docx/references/cjk_typography.md +357 -0
  275. package/skills/minimax-docx/references/cjk_university_template_guide.md +184 -0
  276. package/skills/minimax-docx/references/comments_guide.md +191 -0
  277. package/skills/minimax-docx/references/design_good_bad_examples.md +829 -0
  278. package/skills/minimax-docx/references/design_principles.md +819 -0
  279. package/skills/minimax-docx/references/openxml_element_order.md +308 -0
  280. package/skills/minimax-docx/references/openxml_encyclopedia_part1.md +4061 -0
  281. package/skills/minimax-docx/references/openxml_encyclopedia_part2.md +2820 -0
  282. package/skills/minimax-docx/references/openxml_encyclopedia_part3.md +3381 -0
  283. package/skills/minimax-docx/references/openxml_namespaces.md +82 -0
  284. package/skills/minimax-docx/references/openxml_units.md +72 -0
  285. package/skills/minimax-docx/references/scenario_a_create.md +284 -0
  286. package/skills/minimax-docx/references/scenario_b_edit_content.md +295 -0
  287. package/skills/minimax-docx/references/scenario_c_apply_template.md +456 -0
  288. package/skills/minimax-docx/references/track_changes_guide.md +200 -0
  289. package/skills/minimax-docx/references/troubleshooting.md +506 -0
  290. package/skills/minimax-docx/references/typography_guide.md +294 -0
  291. package/skills/minimax-docx/references/xsd_validation_guide.md +158 -0
  292. package/skills/minimax-docx/scripts/doc_to_docx.sh +40 -0
  293. package/skills/minimax-docx/scripts/docx_preview.sh +37 -0
  294. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/MiniMaxAIDocx.Cli.csproj +19 -0
  295. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Cli/Program.cs +18 -0
  296. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/AnalyzeCommand.cs +147 -0
  297. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ApplyTemplateCommand.cs +322 -0
  298. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/CreateCommand.cs +324 -0
  299. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/DiffCommand.cs +155 -0
  300. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/EditContentCommand.cs +487 -0
  301. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/FixOrderCommand.cs +108 -0
  302. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/MergeRunsCommand.cs +122 -0
  303. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Commands/ValidateCommand.cs +107 -0
  304. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/MiniMaxAIDocx.Core.csproj +15 -0
  305. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/CommentSynchronizer.cs +169 -0
  306. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/ElementOrder.cs +80 -0
  307. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/NamespaceConstants.cs +42 -0
  308. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/RunMerger.cs +81 -0
  309. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/StyleAnalyzer.cs +81 -0
  310. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/TrackChangesHelper.cs +99 -0
  311. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/OpenXml/UnitConverter.cs +23 -0
  312. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples.cs +1832 -0
  313. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch1.cs +910 -0
  314. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch2.cs +999 -0
  315. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch3.cs +1048 -0
  316. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/AestheticRecipeSamples_Batch4.cs +1038 -0
  317. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/CharacterFormattingSamples.cs +1020 -0
  318. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/DocumentCreationSamples.cs +1121 -0
  319. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FieldAndTocSamples.cs +624 -0
  320. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/FootnoteAndCommentSamples.cs +675 -0
  321. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/HeaderFooterSamples.cs +838 -0
  322. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ImageSamples.cs +917 -0
  323. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ListAndNumberingSamples.cs +826 -0
  324. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/ParagraphFormattingSamples.cs +1199 -0
  325. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/StyleSystemSamples.cs +1487 -0
  326. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TableSamples.cs +1163 -0
  327. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Samples/TrackChangesSamples.cs +595 -0
  328. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/CjkHelper.cs +39 -0
  329. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/FontDefaults.cs +24 -0
  330. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Typography/PageSizes.cs +20 -0
  331. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/BusinessRuleValidator.cs +224 -0
  332. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/GateCheckValidator.cs +148 -0
  333. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/ValidationResult.cs +23 -0
  334. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.Core/Validation/XsdValidator.cs +69 -0
  335. package/skills/minimax-docx/scripts/dotnet/MiniMaxAIDocx.slnx +4 -0
  336. package/skills/minimax-docx/scripts/env_check.sh +196 -0
  337. package/skills/minimax-docx/scripts/setup.ps1 +274 -0
  338. package/skills/minimax-docx/scripts/setup.sh +504 -0
  339. package/skills/minimax-pdf/README.md +222 -0
  340. package/skills/minimax-pdf/SKILL.md +218 -0
  341. package/skills/minimax-pdf/design/design.md +381 -0
  342. package/skills/minimax-pdf/scripts/cover.py +1579 -0
  343. package/skills/minimax-pdf/scripts/fill_inspect.py +200 -0
  344. package/skills/minimax-pdf/scripts/fill_write.py +242 -0
  345. package/skills/minimax-pdf/scripts/make.sh +491 -0
  346. package/skills/minimax-pdf/scripts/merge.py +112 -0
  347. package/skills/minimax-pdf/scripts/palette.py +521 -0
  348. package/skills/minimax-pdf/scripts/reformat_parse.py +374 -0
  349. package/skills/minimax-pdf/scripts/render_body.py +1052 -0
  350. package/skills/minimax-pdf/scripts/render_cover.js +111 -0
  351. package/skills/minimax-xlsx/SKILL.md +156 -0
  352. package/skills/minimax-xlsx/references/create.md +691 -0
  353. package/skills/minimax-xlsx/references/edit.md +684 -0
  354. package/skills/minimax-xlsx/references/fix.md +37 -0
  355. package/skills/minimax-xlsx/references/format.md +768 -0
  356. package/skills/minimax-xlsx/references/ooxml-cheatsheet.md +231 -0
  357. package/skills/minimax-xlsx/references/read-analyze.md +97 -0
  358. package/skills/minimax-xlsx/references/validate.md +772 -0
  359. package/skills/minimax-xlsx/scripts/formula_check.py +422 -0
  360. package/skills/minimax-xlsx/scripts/libreoffice_recalc.py +248 -0
  361. package/skills/minimax-xlsx/scripts/shared_strings_builder.py +163 -0
  362. package/skills/minimax-xlsx/scripts/style_audit.py +575 -0
  363. package/skills/minimax-xlsx/scripts/xlsx_add_column.py +395 -0
  364. package/skills/minimax-xlsx/scripts/xlsx_insert_row.py +274 -0
  365. package/skills/minimax-xlsx/scripts/xlsx_pack.py +87 -0
  366. package/skills/minimax-xlsx/scripts/xlsx_reader.py +362 -0
  367. package/skills/minimax-xlsx/scripts/xlsx_shift_rows.py +396 -0
  368. package/skills/minimax-xlsx/scripts/xlsx_unpack.py +130 -0
  369. package/skills/minimax-xlsx/templates/minimal_xlsx/[Content_Types].xml +9 -0
  370. package/skills/minimax-xlsx/templates/minimal_xlsx/_rels/.rels +6 -0
  371. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/_rels/workbook.xml.rels +19 -0
  372. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/sharedStrings.xml +33 -0
  373. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/styles.xml +160 -0
  374. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/workbook.xml +30 -0
  375. package/skills/minimax-xlsx/templates/minimal_xlsx/xl/worksheets/sheet1.xml +70 -0
  376. package/skills/newsletter-generation/SKILL.md +71 -0
  377. package/skills/oss-release-readiness/SKILL.md +47 -0
  378. package/skills/parallel-subagent-dispatch/SKILL.md +58 -0
  379. package/skills/performance-optimization/SKILL.md +364 -0
  380. package/skills/planning-and-task-breakdown/SKILL.md +290 -0
  381. package/skills/pptx-generator/SKILL.md +275 -0
  382. package/skills/pptx-generator/references/design-system.md +392 -0
  383. package/skills/pptx-generator/references/editing.md +162 -0
  384. package/skills/pptx-generator/references/pitfalls.md +112 -0
  385. package/skills/pptx-generator/references/pptxgenjs.md +420 -0
  386. package/skills/pptx-generator/references/slide-types.md +413 -0
  387. package/skills/pr-test-analysis/SKILL.md +24 -0
  388. package/skills/react-native-dev/SKILL.md +180 -0
  389. package/skills/react-native-dev/references/animations.md +254 -0
  390. package/skills/react-native-dev/references/components.md +124 -0
  391. package/skills/react-native-dev/references/engineering.md +527 -0
  392. package/skills/react-native-dev/references/forms.md +300 -0
  393. package/skills/react-native-dev/references/native-capabilities.md +163 -0
  394. package/skills/react-native-dev/references/navigation.md +271 -0
  395. package/skills/react-native-dev/references/networking.md +346 -0
  396. package/skills/react-native-dev/references/performance.md +215 -0
  397. package/skills/react-native-dev/references/state-management.md +230 -0
  398. package/skills/react-native-dev/references/styling.md +117 -0
  399. package/skills/react-native-dev/references/testing.md +341 -0
  400. package/skills/requirements-grilling/SKILL.md +447 -0
  401. package/skills/requirements-grilling/references/ADR-FORMAT.md +46 -0
  402. package/skills/requirements-grilling/references/CONTEXT-FORMAT.md +41 -0
  403. package/skills/requirements-grilling/references/INTERVIEW-PACKET-FORMAT.md +62 -0
  404. package/skills/requirements-grilling/references/MIT-LICENSE-MATT-POCOCK.md +25 -0
  405. package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
  406. package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
  407. package/skills/requirements-grilling/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/interview-me/SKILL.upstream.md +225 -0
  408. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/LICENSE +21 -0
  409. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/NOTICE.md +12 -0
  410. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/batch-grill-me/SKILL.upstream.md +15 -0
  411. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grill-me/SKILL.upstream.md +7 -0
  412. package/skills/requirements-grilling/references/upstream/mattpocock-skills/9603c1cc8118d08bc1b3bf34cf714f62178dea3b/grilling/SKILL.upstream.md +12 -0
  413. package/skills/review-pipeline/SKILL.md +38 -0
  414. package/skills/rose-memory/SKILL.md +210 -0
  415. package/skills/rose-memory/references/README.md +48 -0
  416. package/skills/rose-memory/references/memory_cli.py +2384 -0
  417. package/skills/rose-memory/references/schema.sql +315 -0
  418. package/skills/security-and-hardening/SKILL.md +369 -0
  419. package/skills/session-handoff/SKILL.md +88 -0
  420. package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
  421. package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
  422. package/skills/session-handoff/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/handoff/SKILL.upstream.md +16 -0
  423. package/skills/session-handoff/scripts/session_handoff.py +764 -0
  424. package/skills/shader-dev/SKILL.md +316 -0
  425. package/skills/shader-dev/reference/ambient-occlusion.md +382 -0
  426. package/skills/shader-dev/reference/analytic-ray-tracing.md +651 -0
  427. package/skills/shader-dev/reference/anti-aliasing.md +71 -0
  428. package/skills/shader-dev/reference/atmospheric-scattering.md +571 -0
  429. package/skills/shader-dev/reference/camera-effects.md +80 -0
  430. package/skills/shader-dev/reference/cellular-automata.md +635 -0
  431. package/skills/shader-dev/reference/color-palette.md +481 -0
  432. package/skills/shader-dev/reference/csg-boolean-operations.md +466 -0
  433. package/skills/shader-dev/reference/domain-repetition.md +436 -0
  434. package/skills/shader-dev/reference/domain-warping.md +419 -0
  435. package/skills/shader-dev/reference/fluid-simulation.md +425 -0
  436. package/skills/shader-dev/reference/fractal-rendering.md +525 -0
  437. package/skills/shader-dev/reference/lighting-model.md +639 -0
  438. package/skills/shader-dev/reference/matrix-transform.md +535 -0
  439. package/skills/shader-dev/reference/multipass-buffer.md +571 -0
  440. package/skills/shader-dev/reference/normal-estimation.md +418 -0
  441. package/skills/shader-dev/reference/particle-system.md +589 -0
  442. package/skills/shader-dev/reference/path-tracing-gi.md +602 -0
  443. package/skills/shader-dev/reference/polar-uv-manipulation.md +521 -0
  444. package/skills/shader-dev/reference/post-processing.md +375 -0
  445. package/skills/shader-dev/reference/procedural-2d-pattern.md +439 -0
  446. package/skills/shader-dev/reference/procedural-noise.md +551 -0
  447. package/skills/shader-dev/reference/ray-marching.md +396 -0
  448. package/skills/shader-dev/reference/sdf-2d.md +724 -0
  449. package/skills/shader-dev/reference/sdf-3d.md +805 -0
  450. package/skills/shader-dev/reference/sdf-tricks.md +63 -0
  451. package/skills/shader-dev/reference/shadow-techniques.md +476 -0
  452. package/skills/shader-dev/reference/simulation-physics.md +644 -0
  453. package/skills/shader-dev/reference/sound-synthesis.md +578 -0
  454. package/skills/shader-dev/reference/terrain-rendering.md +839 -0
  455. package/skills/shader-dev/reference/texture-mapping-advanced.md +87 -0
  456. package/skills/shader-dev/reference/texture-sampling.md +553 -0
  457. package/skills/shader-dev/reference/volumetric-rendering.md +608 -0
  458. package/skills/shader-dev/reference/voronoi-cellular-noise.md +486 -0
  459. package/skills/shader-dev/reference/voxel-rendering.md +701 -0
  460. package/skills/shader-dev/reference/water-ocean.md +445 -0
  461. package/skills/shader-dev/reference/webgl-pitfalls.md +41 -0
  462. package/skills/shader-dev/techniques/ambient-occlusion.md +364 -0
  463. package/skills/shader-dev/techniques/analytic-ray-tracing.md +542 -0
  464. package/skills/shader-dev/techniques/anti-aliasing.md +124 -0
  465. package/skills/shader-dev/techniques/atmospheric-scattering.md +522 -0
  466. package/skills/shader-dev/techniques/camera-effects.md +115 -0
  467. package/skills/shader-dev/techniques/cellular-automata.md +531 -0
  468. package/skills/shader-dev/techniques/color-palette.md +380 -0
  469. package/skills/shader-dev/techniques/csg-boolean-operations.md +491 -0
  470. package/skills/shader-dev/techniques/domain-repetition.md +333 -0
  471. package/skills/shader-dev/techniques/domain-warping.md +414 -0
  472. package/skills/shader-dev/techniques/fluid-simulation.md +1175 -0
  473. package/skills/shader-dev/techniques/fractal-rendering.md +436 -0
  474. package/skills/shader-dev/techniques/lighting-model.md +527 -0
  475. package/skills/shader-dev/techniques/matrix-transform.md +455 -0
  476. package/skills/shader-dev/techniques/multipass-buffer.md +922 -0
  477. package/skills/shader-dev/techniques/normal-estimation.md +318 -0
  478. package/skills/shader-dev/techniques/particle-system.md +1203 -0
  479. package/skills/shader-dev/techniques/path-tracing-gi.md +623 -0
  480. package/skills/shader-dev/techniques/polar-uv-manipulation.md +373 -0
  481. package/skills/shader-dev/techniques/post-processing.md +788 -0
  482. package/skills/shader-dev/techniques/procedural-2d-pattern.md +346 -0
  483. package/skills/shader-dev/techniques/procedural-noise.md +554 -0
  484. package/skills/shader-dev/techniques/ray-marching.md +467 -0
  485. package/skills/shader-dev/techniques/sdf-2d.md +631 -0
  486. package/skills/shader-dev/techniques/sdf-3d.md +589 -0
  487. package/skills/shader-dev/techniques/sdf-tricks.md +100 -0
  488. package/skills/shader-dev/techniques/shadow-techniques.md +776 -0
  489. package/skills/shader-dev/techniques/simulation-physics.md +1542 -0
  490. package/skills/shader-dev/techniques/sound-synthesis.md +490 -0
  491. package/skills/shader-dev/techniques/terrain-rendering.md +408 -0
  492. package/skills/shader-dev/techniques/texture-mapping-advanced.md +121 -0
  493. package/skills/shader-dev/techniques/texture-sampling.md +382 -0
  494. package/skills/shader-dev/techniques/volumetric-rendering.md +375 -0
  495. package/skills/shader-dev/techniques/voronoi-cellular-noise.md +458 -0
  496. package/skills/shader-dev/techniques/voxel-rendering.md +985 -0
  497. package/skills/shader-dev/techniques/water-ocean.md +490 -0
  498. package/skills/shader-dev/techniques/webgl-pitfalls.md +170 -0
  499. package/skills/shipping-and-launch/SKILL.md +334 -0
  500. package/skills/silent-failure-hunting/SKILL.md +24 -0
  501. package/skills/source-driven-development/SKILL.md +223 -0
  502. package/skills/spec-driven-development/SKILL.md +235 -0
  503. package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/LICENSE +21 -0
  504. package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/NOTICE.md +9 -0
  505. package/skills/spec-driven-development/references/upstream/addyosmani-agent-skills/6bcfeb9dae52b11eaad23511acc165109746dbc3/spec-driven-development/SKILL.upstream.md +206 -0
  506. package/skills/strategy-stress-test/SKILL.md +185 -0
  507. package/skills/systematic-literature-review/SKILL.md +77 -0
  508. package/skills/test-document-generator/SKILL.md +152 -0
  509. package/skills/test-document-generator/references/test-document-template.md +45 -0
  510. package/skills/test-driven-development/SKILL.md +399 -0
  511. package/skills/write-skills/GLOSSARY.md +113 -0
  512. package/skills/write-skills/SKILL.md +133 -0
  513. package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/LICENSE +21 -0
  514. package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/NOTICE.md +9 -0
  515. package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/GLOSSARY.md +201 -0
  516. package/skills/write-skills/references/upstream/mattpocock-skills/391a2701dd948f94f56a39f7533f8eea9a859c87/productivity/writing-great-skills/SKILL.upstream.md +83 -0
  517. package/src/runtime/child-guard.ts +70 -0
  518. package/src/runtime/conflicts.ts +25 -0
  519. package/src/runtime/contracts.ts +9 -0
  520. package/src/runtime/doctor.ts +134 -0
  521. package/src/runtime/global-resources.ts +152 -0
  522. package/src/runtime/index.ts +23 -0
  523. package/src/runtime/lifecycle.ts +19 -0
  524. package/src/runtime/native-integrations.ts +44 -0
  525. package/src/runtime/path-boundaries.ts +69 -0
  526. package/src/runtime/registry.ts +213 -0
  527. package/src/runtime/roles.ts +64 -0
  528. package/src/runtime/rose-context.ts +24 -0
  529. package/src/runtime/subagents.ts +426 -0
  530. package/templates/APPEND_SYSTEM.md +12 -0
  531. package/upstream/aili-workflows.lock.json +3226 -0
@@ -0,0 +1,788 @@
1
+ ## WebGL2 Adaptation Requirements
2
+
3
+ **IMPORTANT: Critical Warning for Standalone HTML Deployment**: Post-processing effects require an input texture to work. When generating standalone HTML, you must:
4
+ 1. Set `#define USE_DEMO_SCENE 1` to use the built-in demo scene (recommended), or
5
+ 2. Pass a valid input texture to the `iChannel0` channel, otherwise the screen will be completely black
6
+ 3. **Critical**: When USE_DEMO_SCENE=1, ensure the #else branch code does not reference non-existent uniforms (e.g., iChannel0)
7
+
8
+ **IMPORTANT: GLSL Type Strictness Rules**:
9
+ - `vec2 = float` is illegal — must use `vec2(x, x)` or `vec2(x)`
10
+ - Function parameters must be defined before use; using a variable name in its own initializer is forbidden (e.g., `float w = filmicCurve(w, w)` is an error)
11
+ - Variables must be declared before use
12
+ - **#version must be the very first line of shader code**: No characters (including whitespace or comments) may precede `#version 300 es`
13
+ - **Code in preprocessor branches is still compiled**: Even if `#if USE_DEMO_SCENE` is true, the `#else` branch code is still compiled by the GPU — all branches must be valid GLSL code
14
+
15
+ Code templates in this document use ShaderToy GLSL style. When generating standalone HTML pages, you must adapt to WebGL2:
16
+
17
+ - Use `canvas.getContext("webgl2")`
18
+ - First line of shader: `#version 300 es`, add `precision highp float;` for fragment shaders
19
+ - Vertex shader: `attribute` → `in`, `varying` → `out`
20
+ - Fragment shader: `varying` → `in`, `gl_FragColor` → custom `out vec4 fragColor`, `texture2D()` → `texture()`
21
+ - ShaderToy's `void mainImage(out vec4 fragColor, in vec2 fragCoord)` must be adapted to standard `void main()` entry
22
+ - Must create Framebuffers and render to texture before post-processing
23
+
24
+ ### Complete WebGL2 Standalone HTML Template
25
+
26
+ ```html
27
+ <!DOCTYPE html>
28
+ <html>
29
+ <head>
30
+ <meta charset="utf-8">
31
+ <title>Post-Processing Shader</title>
32
+ <style>
33
+ body { margin: 0; overflow: hidden; background: #000; }
34
+ canvas { display: block; width: 100vw; height: 100vh; }
35
+ </style>
36
+ </head>
37
+ <body>
38
+ <canvas id="canvas"></canvas>
39
+
40
+ <!-- Vertex Shader: #version must be the first line -->
41
+ <script id="vs" type="x-shader/x-vertex">
42
+ #version 300 es
43
+ in vec2 a_position;
44
+ out vec2 v_uv;
45
+ void main() {
46
+ v_uv = a_position * 0.5 + 0.5;
47
+ gl_Position = vec4(a_position, 0.0, 1.0);
48
+ }
49
+ </script>
50
+
51
+ <!-- Fragment Shader: #version must be the first line, precision follows -->
52
+ <script id="fs" type="x-shader/x-fragment">
53
+ #version 300 es
54
+ precision highp float;
55
+
56
+ in vec2 v_uv;
57
+ out vec4 fragColor;
58
+
59
+ uniform float iTime;
60
+ uniform vec2 iResolution;
61
+ // Note: Do not use iChannel0 in standalone HTML unless a valid texture is bound
62
+ // Recommended: Use USE_DEMO_SCENE=1 for the built-in demo scene
63
+
64
+ #define USE_DEMO_SCENE 1 // Recommended: use built-in demo scene
65
+
66
+ // Demo scene function (replaces iChannel0 sampling)
67
+ vec3 demoScene(vec2 uv, float time) {
68
+ vec3 col = 0.5 + 0.5 * cos(time + uv.xyx + vec3(0.0, 2.0, 4.0));
69
+ float d = length(uv - 0.5) - 0.12;
70
+ col += vec3(3.0, 2.5, 1.8) * smoothstep(0.02, 0.0, d);
71
+ return col;
72
+ }
73
+
74
+ // Tone mapping and other post-processing functions...
75
+ // Note: Do not reference iChannel0 in the #else branch of #if USE_DEMO_SCENE
76
+ // If you need iChannel0, use #ifdef or ensure the texture is bound when USE_DEMO_SCENE=0
77
+
78
+ void main() {
79
+ vec2 uv = v_uv;
80
+ vec3 color;
81
+
82
+ #if USE_DEMO_SCENE
83
+ color = demoScene(uv, iTime);
84
+ #else
85
+ // This branch only executes when USE_DEMO_SCENE=0 and a texture is bound
86
+ // Requires binding in JavaScript: gl.bindTexture(gl.TEXTURE_2D, texture);
87
+ color = vec3(0.0); // fallback
88
+ #endif
89
+
90
+ fragColor = vec4(color, 1.0);
91
+ }
92
+ </script>
93
+
94
+ <script>
95
+ const canvas = document.getElementById('canvas');
96
+ const gl = canvas.getContext('webgl2');
97
+
98
+ // Compile shader
99
+ function createShader(gl, type, source) {
100
+ const shader = gl.createShader(type);
101
+ gl.shaderSource(shader, source);
102
+ gl.compileShader(shader);
103
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
104
+ console.error(gl.getShaderInfoLog(shader));
105
+ gl.deleteShader(shader);
106
+ return null;
107
+ }
108
+ return shader;
109
+ }
110
+
111
+ // Create program
112
+ const vs = createShader(gl, gl.VERTEX_SHADER, document.getElementById('vs').textContent);
113
+ const fs = createShader(gl, gl.FRAGMENT_SHADER, document.getElementById('fs').textContent);
114
+ const program = gl.createProgram();
115
+ gl.attachShader(program, vs);
116
+ gl.attachShader(program, fs);
117
+ gl.linkProgram(program);
118
+
119
+ // Fullscreen quad
120
+ const positions = new Float32Array([-1,-1, 1,-1, -1,1, 1,1]);
121
+ const vao = gl.createVertexArray();
122
+ gl.bindVertexArray(vao);
123
+ const buffer = gl.createBuffer();
124
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
125
+ gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);
126
+
127
+ const posLoc = gl.getAttribLocation(program, 'a_position');
128
+ gl.enableVertexAttribArray(posLoc);
129
+ gl.vertexAttribPointer(posLoc, 2, gl.FLOAT, false, 0, 0);
130
+
131
+ // Uniform locations
132
+ const timeLoc = gl.getUniformLocation(program, 'iTime');
133
+ const resLoc = gl.getUniformLocation(program, 'iResolution');
134
+
135
+ // Render loop
136
+ function render(time) {
137
+ canvas.width = window.innerWidth;
138
+ canvas.height = window.innerHeight;
139
+ gl.viewport(0, 0, canvas.width, canvas.height);
140
+
141
+ gl.useProgram(program);
142
+ gl.uniform1f(timeLoc, time * 0.001);
143
+ gl.uniform2f(resLoc, canvas.width, canvas.height);
144
+
145
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
146
+ requestAnimationFrame(render);
147
+ }
148
+ requestAnimationFrame(render);
149
+ </script>
150
+ </body>
151
+ </html>
152
+ ```
153
+
154
+ ### Multi-Pass Post-Processing HTML Template (with FBO)
155
+
156
+ Bloom separable blur, TAA, multi-step post-processing pipelines, etc. require rendering to intermediate textures. The following skeleton demonstrates the pattern: render scene to FBO → post-processing reads FBO → output to screen:
157
+
158
+ ```html
159
+ <!DOCTYPE html>
160
+ <html>
161
+ <head>
162
+ <meta charset="utf-8">
163
+ <title>Multi-Pass Post-Processing</title>
164
+ <style>
165
+ body { margin: 0; overflow: hidden; background: #000; }
166
+ canvas { display: block; width: 100vw; height: 100vh; }
167
+ </style>
168
+ </head>
169
+ <body>
170
+ <canvas id="c"></canvas>
171
+ <script>
172
+ let frameCount = 0;
173
+
174
+ const canvas = document.getElementById('c');
175
+ const gl = canvas.getContext('webgl2');
176
+ const ext = gl.getExtension('EXT_color_buffer_float');
177
+
178
+ function createShader(type, src) {
179
+ const s = gl.createShader(type);
180
+ gl.shaderSource(s, src);
181
+ gl.compileShader(s);
182
+ if (!gl.getShaderParameter(s, gl.COMPILE_STATUS))
183
+ console.error(gl.getShaderInfoLog(s));
184
+ return s;
185
+ }
186
+ function createProgram(vsSrc, fsSrc) {
187
+ const p = gl.createProgram();
188
+ gl.attachShader(p, createShader(gl.VERTEX_SHADER, vsSrc));
189
+ gl.attachShader(p, createShader(gl.FRAGMENT_SHADER, fsSrc));
190
+ gl.linkProgram(p);
191
+ return p;
192
+ }
193
+
194
+ const vsSource = `#version 300 es
195
+ in vec2 pos;
196
+ void main(){ gl_Position=vec4(pos,0,1); }`;
197
+
198
+ // fsScene: Scene rendering shader (outputs HDR color to FBO)
199
+ // fsPost: Post-processing shader (samples scene texture from iChannel0, applies bloom/tonemap/etc)
200
+ const progScene = createProgram(vsSource, fsScene);
201
+ const progPost = createProgram(vsSource, fsPost);
202
+
203
+ function createFBO(w, h) {
204
+ const tex = gl.createTexture();
205
+ gl.bindTexture(gl.TEXTURE_2D, tex);
206
+ // IMPORTANT: Critical: Check for float texture extension, fall back to RGBA8 if unsupported
207
+ const fmt = ext ? gl.RGBA16F : gl.RGBA;
208
+ const typ = ext ? gl.FLOAT : gl.UNSIGNED_BYTE;
209
+ gl.texImage2D(gl.TEXTURE_2D, 0, fmt, w, h, 0, gl.RGBA, typ, null);
210
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
211
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
212
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
213
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
214
+ const fbo = gl.createFramebuffer();
215
+ gl.bindFramebuffer(gl.FRAMEBUFFER, fbo);
216
+ gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, tex, 0);
217
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
218
+ return { fbo, tex };
219
+ }
220
+
221
+ let W, H, sceneFBO;
222
+
223
+ const vao = gl.createVertexArray();
224
+ gl.bindVertexArray(vao);
225
+ const vbo = gl.createBuffer();
226
+ gl.bindBuffer(gl.ARRAY_BUFFER, vbo);
227
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1,-1, 1,-1, -1,1, 1,1]), gl.STATIC_DRAW);
228
+ gl.enableVertexAttribArray(0);
229
+ gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
230
+
231
+ function resize() {
232
+ canvas.width = W = innerWidth;
233
+ canvas.height = H = innerHeight;
234
+ sceneFBO = createFBO(W, H);
235
+ }
236
+ addEventListener('resize', resize);
237
+ resize();
238
+
239
+ function render(t) {
240
+ t *= 0.001;
241
+ // Pass 1: Scene rendering → FBO
242
+ gl.useProgram(progScene);
243
+ gl.bindFramebuffer(gl.FRAMEBUFFER, sceneFBO.fbo);
244
+ gl.viewport(0, 0, W, H);
245
+ gl.uniform2f(gl.getUniformLocation(progScene, 'iResolution'), W, H);
246
+ gl.uniform1f(gl.getUniformLocation(progScene, 'iTime'), t);
247
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
248
+
249
+ // Pass 2: Post-processing reads scene texture → screen
250
+ gl.useProgram(progPost);
251
+ gl.bindFramebuffer(gl.FRAMEBUFFER, null);
252
+ gl.viewport(0, 0, W, H);
253
+ gl.activeTexture(gl.TEXTURE0);
254
+ gl.bindTexture(gl.TEXTURE_2D, sceneFBO.tex);
255
+ gl.uniform1i(gl.getUniformLocation(progPost, 'iChannel0'), 0);
256
+ gl.uniform2f(gl.getUniformLocation(progPost, 'iResolution'), W, H);
257
+ gl.uniform1f(gl.getUniformLocation(progPost, 'iTime'), t);
258
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
259
+
260
+ frameCount++;
261
+ requestAnimationFrame(render);
262
+ }
263
+ requestAnimationFrame(render);
264
+ </script>
265
+ </body>
266
+ </html>
267
+ ```
268
+
269
+ # Screen-Space Post-Processing Effects
270
+
271
+ ## Use Cases
272
+
273
+ Screen-space image enhancement on already-rendered scenes: Tone Mapping, Bloom, Vignette, Chromatic Aberration, Motion Blur, DoF, FXAA/TAA, Color Grading, Film Grain, Lens Flare, etc.
274
+
275
+ Typical pipeline order: Scene Rendering → AA → Bloom → Chromatic Aberration → Motion Blur/DoF → Tone Mapping → Color Grading → Contrast → Vignette → Film Grain → Gamma → Dithering.
276
+
277
+ ## Core Principles
278
+
279
+ The essence of post-processing is **per-pixel transformation of an already-rendered image** — input is a framebuffer texture, output is the transformed color value.
280
+
281
+ - **Tone Mapping**: HDR [0, ∞) → LDR [0, 1]. Reinhard `c/(1+c)`, Filmic Reinhard (white point/shoulder parameters), ACES (3×3 matrix + rational polynomial), generic rational polynomial
282
+ - **Gaussian Blur**: 2D Gaussian kernel is separable into two 1D passes, O(n²) → O(2n)
283
+ - **Bloom**: Bright-pass extraction → multi-level Gaussian blur → additive blend back to original
284
+ - **Vignette**: Brightness falloff based on pixel distance to center. Multiplicative or radial
285
+ - **Chromatic Aberration**: Sample the same texture at different scales for R/G/B channels
286
+
287
+ ## Implementation Steps
288
+
289
+ ### Step 1: Tone Mapping
290
+
291
+ ```glsl
292
+ // Reinhard
293
+ vec3 reinhard(vec3 color) { return color / (1.0 + color); }
294
+
295
+ // Filmic Reinhard (W=white point, T2=shoulder parameter)
296
+ // IMPORTANT: GLSL critical rule: function parameters must be defined before use; using a variable name in its own initializer is forbidden
297
+ const float W = 1.2, T2 = 7.5; // adjustable
298
+ float filmic_reinhard_curve(float x) {
299
+ float q = (T2 * T2 + 1.0) * x * x;
300
+ return q / (q + x + T2 * T2);
301
+ }
302
+ vec3 filmic_reinhard(vec3 x) {
303
+ float w = filmic_reinhard_curve(W); // compute w using constant W first
304
+ return vec3(filmic_reinhard_curve(x.r), filmic_reinhard_curve(x.g), filmic_reinhard_curve(x.b)) / w;
305
+ }
306
+
307
+ // ACES industry standard
308
+ vec3 aces_tonemap(vec3 color) {
309
+ mat3 m1 = mat3(0.59719,0.07600,0.02840, 0.35458,0.90834,0.13383, 0.04823,0.01566,0.83777);
310
+ mat3 m2 = mat3(1.60475,-0.10208,-0.00327, -0.53108,1.10813,-0.07276, -0.07367,-0.00605,1.07602);
311
+ vec3 v = m1 * color;
312
+ vec3 a = v * (v + 0.0245786) - 0.000090537;
313
+ vec3 b = v * (0.983729 * v + 0.4329510) + 0.238081;
314
+ return clamp(m2 * (a / b), 0.0, 1.0);
315
+ }
316
+
317
+ // Generic rational polynomial
318
+ vec3 rational_tonemap(vec3 x) {
319
+ float a=0.010, b=0.132, c=0.010, d=0.163, e=0.101; // adjustable
320
+ return (x * (a * x + b)) / (x * (c * x + d) + e);
321
+ }
322
+ ```
323
+
324
+ ### Step 2: Gamma Correction
325
+
326
+ ```glsl
327
+ color = pow(color, vec3(1.0 / 2.2)); // after tone mapping; ACES already includes gamma, skip this step
328
+ ```
329
+
330
+ ### Step 3: Contrast Enhancement (Hermite S-Curve)
331
+
332
+ ```glsl
333
+ color = clamp(color, 0.0, 1.0);
334
+ color = color * color * (3.0 - 2.0 * color);
335
+ // Controllable intensity: color = mix(color, color*color*(3.0-2.0*color), strength);
336
+ // smoothstep equivalent: color = smoothstep(-0.025, 1.0, color);
337
+ ```
338
+
339
+ ### Step 4: Color Grading
340
+
341
+ ```glsl
342
+ color = color * vec3(1.11, 0.89, 0.79); // per-channel multiply (warm tone), adjustable
343
+ color = pow(color, vec3(1.3, 1.2, 1.0)); // pow color grading, adjustable
344
+ // HSV hue shift: hsv.x = fract(hsv.x + 0.05); hsv.y *= 1.1;
345
+ // Desaturation: color = mix(color, vec3(dot(color, vec3(0.299,0.587,0.114))), 0.2);
346
+ ```
347
+
348
+ ### Step 5: Vignette
349
+
350
+ ```glsl
351
+ // Option A: Multiplicative
352
+ vec2 q = fragCoord / iResolution.xy;
353
+ float vignette = pow(16.0 * q.x * q.y * (1.0 - q.x) * (1.0 - q.y), 0.25);
354
+ color *= 0.5 + 0.5 * vignette;
355
+
356
+ // Option B: Radial distance
357
+ vec2 centered = (uv - 0.5) * vec2(iResolution.x / iResolution.y, 1.0);
358
+ float vig = mix(1.0, max(0.0, 1.0 - pow(length(centered)/1.414 * 0.6, 3.0)), 0.5);
359
+ color *= vig;
360
+
361
+ // Option C: Inverse quadratic falloff
362
+ vec2 p = 1.0 - 2.0 * fragCoord / iResolution.xy;
363
+ p.y *= iResolution.y / iResolution.x;
364
+ float vig2 = 1.25 / (1.1 + 1.1 * dot(p, p)); vig2 *= vig2;
365
+ color *= mix(1.0, smoothstep(0.1, 1.1, vig2), 0.25);
366
+ ```
367
+
368
+ ### Step 6: Gaussian Blur
369
+
370
+ ```glsl
371
+ float normpdf(float x, float sigma) {
372
+ return 0.39894 * exp(-0.5 * x * x / (sigma * sigma)) / sigma;
373
+ }
374
+ vec3 gaussianBlur(sampler2D tex, vec2 fragCoord, vec2 resolution) {
375
+ const int KERNEL_SIZE = 11, HALF = 5; // adjustable: KERNEL_SIZE must be odd
376
+ float sigma = 7.0; // adjustable
377
+ float kernel[KERNEL_SIZE]; float Z = 0.0;
378
+ for (int j = 0; j <= HALF; ++j)
379
+ kernel[HALF + j] = kernel[HALF - j] = normpdf(float(j), sigma);
380
+ for (int j = 0; j < KERNEL_SIZE; ++j) Z += kernel[j];
381
+ vec3 result = vec3(0.0);
382
+ for (int i = -HALF; i <= HALF; ++i)
383
+ for (int j = -HALF; j <= HALF; ++j)
384
+ result += kernel[HALF+j] * kernel[HALF+i]
385
+ * texture(tex, (fragCoord + vec2(float(i), float(j))) / resolution).rgb;
386
+ return result / (Z * Z);
387
+ }
388
+ ```
389
+
390
+ ### Step 7: Bloom (Single Pass, Hardware Mipmap)
391
+
392
+ ```glsl
393
+ vec3 simpleBloom(sampler2D tex, vec2 uv) {
394
+ vec3 bloom = vec3(0.0); float tw = 0.0; float maxB = 5.0; // adjustable
395
+ for (int x = -1; x <= 1; x++)
396
+ for (int y = -1; y <= 1; y++) {
397
+ vec2 off = vec2(float(x), float(y)) / iResolution.xy; float w = 1.0;
398
+ bloom += w * min(vec3(maxB), textureLod(tex, uv+off*exp2(5.0), 5.0).rgb); tw += w;
399
+ bloom += w * min(vec3(maxB), textureLod(tex, uv+off*exp2(6.0), 6.0).rgb); tw += w;
400
+ bloom += w * min(vec3(maxB), textureLod(tex, uv+off*exp2(7.0), 7.0).rgb); tw += w;
401
+ }
402
+ return pow(bloom / tw, vec3(1.5)) * 0.3; // adjustable: gamma and intensity
403
+ }
404
+ // Usage: color = color * 0.8 + simpleBloom(iChannel0, uv);
405
+ ```
406
+
407
+ ### Step 8: Chromatic Aberration
408
+
409
+ ```glsl
410
+ #define CA_SAMPLES 8 // adjustable
411
+ #define CA_STRENGTH 0.003 // adjustable
412
+ vec3 chromaticAberration(sampler2D tex, vec2 uv) {
413
+ vec2 center = uv - 0.5; vec3 color = vec3(0.0);
414
+ float rf = 1.0, gf = 1.0, bf = 1.0, f = 1.0 / float(CA_SAMPLES);
415
+ for (int i = 0; i < CA_SAMPLES; ++i) {
416
+ color.r += f * texture(tex, 0.5 - 0.5 * (center * 2.0 * rf)).r;
417
+ color.g += f * texture(tex, 0.5 - 0.5 * (center * 2.0 * gf)).g;
418
+ color.b += f * texture(tex, 0.5 - 0.5 * (center * 2.0 * bf)).b;
419
+ rf *= 1.0 - CA_STRENGTH; gf *= 1.0 - CA_STRENGTH*0.3; bf *= 1.0 + CA_STRENGTH*0.4;
420
+ }
421
+ return clamp(color, 0.0, 1.0);
422
+ }
423
+ ```
424
+
425
+ ### Step 9: Film Grain
426
+
427
+ ```glsl
428
+ float hash(float c) { return fract(sin(dot(c, vec2(12.9898, 78.233))) * 43758.5453); }
429
+ #define GRAIN_STRENGTH 0.012 // adjustable
430
+ color += vec3(GRAIN_STRENGTH * hash(length(fragCoord / iResolution.xy) + iTime));
431
+
432
+ // Bayer matrix ordered dithering (eliminates color banding)
433
+ const mat4 bayerMatrix = mat4(
434
+ vec4(0.,8.,2.,10.), vec4(12.,4.,14.,6.), vec4(3.,11.,1.,9.), vec4(15.,7.,13.,5.));
435
+ float orderedDither(vec2 fc) {
436
+ return (bayerMatrix[int(fc.x)&3][int(fc.y)&3] + 1.0) / 17.0;
437
+ }
438
+ color += (orderedDither(fragCoord) - 0.5) * 4.0 / 255.0;
439
+ ```
440
+
441
+ ### Step 10: Demo Scene (Required for Standalone HTML!)
442
+
443
+ **IMPORTANT: Critical Warning**: Standalone HTML deployment must provide an input texture, otherwise post-processing effects will output solid black.
444
+
445
+ ```glsl
446
+ // Demo scene fallback: used when no valid input texture is available
447
+ vec3 demoScene(vec2 uv, float time) {
448
+ // Dynamic gradient background
449
+ vec3 col = 0.5 + 0.5 * cos(time + uv.xyx + vec3(0, 2, 4));
450
+
451
+ // Center glowing sphere (for testing bloom)
452
+ float d = length(uv - 0.5) - 0.15;
453
+ col += vec3(2.0) * smoothstep(0.02, 0.0, d); // extremely bright region
454
+
455
+ // Moving highlight bar (for testing bloom bleed)
456
+ float bar = step(0.48, uv.y) * step(uv.y, 0.52);
457
+ bar *= step(0.0, sin(uv.x * 10.0 - time * 2.0));
458
+ col += vec3(1.5, 0.8, 0.3) * bar;
459
+
460
+ // Colored blocks (for testing chromatic aberration and tone mapping)
461
+ vec2 id = floor(uv * 4.0);
462
+ float rand = fract(sin(dot(id, vec2(12.9898, 78.233))) * 43758.5453);
463
+ vec2 rect = fract(uv * 4.0);
464
+ float box = step(0.1, rect.x) * step(rect.x, 0.9) * step(0.1, rect.y) * step(rect.y, 0.9);
465
+ col += vec3(rand, 1.0 - rand, 0.5) * box * 0.5;
466
+
467
+ return col;
468
+ }
469
+ ```
470
+
471
+ ### Step 10: Motion Blur
472
+
473
+ ```glsl
474
+ #define MB_SAMPLES 32 // adjustable
475
+ #define MB_STRENGTH 0.25 // adjustable
476
+ vec3 motionBlur(sampler2D tex, vec2 uv, vec2 velocity) {
477
+ vec2 dir = velocity * MB_STRENGTH; vec3 color = vec3(0.0); float tw = 0.0;
478
+ for (int i = 0; i < MB_SAMPLES; i++) {
479
+ float t = float(i) / float(MB_SAMPLES - 1), w = 1.0 - t;
480
+ color += w * textureLod(tex, uv + dir * t, 0.0).rgb; tw += w;
481
+ }
482
+ return color / tw;
483
+ }
484
+ ```
485
+
486
+ ### Step 11: Depth of Field
487
+
488
+ ```glsl
489
+ #define DOF_SAMPLES 64
490
+ #define DOF_FOCAL_LENGTH 0.03
491
+ float getCoC(float depth, float focusDist) {
492
+ float aperture = min(1.0, focusDist * focusDist * 0.5);
493
+ return abs(aperture * (DOF_FOCAL_LENGTH * (depth - focusDist))
494
+ / (depth * (focusDist - DOF_FOCAL_LENGTH)));
495
+ }
496
+ float goldenAngle = 3.14159265 * (3.0 - sqrt(5.0));
497
+ vec3 depthOfField(sampler2D tex, vec2 uv, float depth, float focusDist) {
498
+ float coc = getCoC(depth, focusDist);
499
+ vec3 result = texture(tex, uv).rgb * max(0.001, coc);
500
+ float tw = max(0.001, coc);
501
+ for (int i = 1; i < DOF_SAMPLES; i++) {
502
+ float fi = float(i);
503
+ float theta = fi * goldenAngle * float(DOF_SAMPLES);
504
+ float r = coc * sqrt(fi) / sqrt(float(DOF_SAMPLES));
505
+ vec2 tapUV = uv + vec2(sin(theta), cos(theta)) * r;
506
+ vec4 s = textureLod(tex, tapUV, 0.0);
507
+ float w = max(0.001, getCoC(s.w, focusDist));
508
+ result += s.rgb * w; tw += w;
509
+ }
510
+ return result / tw;
511
+ }
512
+ ```
513
+
514
+ ### Step 12: FXAA
515
+
516
+ ```glsl
517
+ vec3 fxaa(sampler2D tex, vec2 fragCoord, vec2 resolution) {
518
+ vec2 pp = 1.0 / resolution;
519
+ vec4 color = texture(tex, fragCoord * pp);
520
+ vec3 luma = vec3(0.299, 0.587, 0.114);
521
+ float lumaNW = dot(texture(tex, (fragCoord+vec2(-1.,-1.))*pp).rgb, luma);
522
+ float lumaNE = dot(texture(tex, (fragCoord+vec2( 1.,-1.))*pp).rgb, luma);
523
+ float lumaSW = dot(texture(tex, (fragCoord+vec2(-1., 1.))*pp).rgb, luma);
524
+ float lumaSE = dot(texture(tex, (fragCoord+vec2( 1., 1.))*pp).rgb, luma);
525
+ float lumaM = dot(color.rgb, luma);
526
+ float lumaMin = min(lumaM, min(min(lumaNW,lumaNE), min(lumaSW,lumaSE)));
527
+ float lumaMax = max(lumaM, max(max(lumaNW,lumaNE), max(lumaSW,lumaSE)));
528
+ vec2 dir = vec2(-((lumaNW+lumaNE)-(lumaSW+lumaSE)), ((lumaNW+lumaSW)-(lumaNE+lumaSE)));
529
+ float dirReduce = max((lumaNW+lumaNE+lumaSW+lumaSE)*0.03125, 1.0/128.0);
530
+ dir = clamp(dir * 2.5/(min(abs(dir.x),abs(dir.y))+dirReduce), vec2(-8.0), vec2(8.0)) * pp;
531
+ vec3 rgbA = 0.5 * (texture(tex, fragCoord*pp+dir*(1./3.-0.5)).rgb
532
+ + texture(tex, fragCoord*pp+dir*(2./3.-0.5)).rgb);
533
+ vec3 rgbB = rgbA*0.5 + 0.25*(texture(tex, fragCoord*pp+dir*-0.5).rgb
534
+ + texture(tex, fragCoord*pp+dir*0.5).rgb);
535
+ float lumaB = dot(rgbB, luma);
536
+ return (lumaB < lumaMin || lumaB > lumaMax) ? rgbA : rgbB;
537
+ }
538
+ ```
539
+
540
+ ## Complete Code Template
541
+
542
+ Can be run directly in ShaderToy. `iChannel0` is the scene texture.
543
+
544
+ **IMPORTANT: Important Warning**: For standalone HTML deployment, you must:
545
+ 1. Pass a valid input texture to iChannel0 (or uChannel0)
546
+ 2. Or set `#define USE_DEMO_SCENE 1` to use the built-in demo scene
547
+
548
+ ```glsl
549
+ // Post-Processing Pipeline — ShaderToy Template
550
+ #define ENABLE_TONEMAP 1
551
+ #define ENABLE_BLOOM 1
552
+ #define ENABLE_CA 1
553
+ #define ENABLE_VIGNETTE 1
554
+ #define ENABLE_GRAIN 1
555
+ #define ENABLE_CONTRAST 1
556
+ #define USE_DEMO_SCENE 1 // set to 1 to use built-in demo scene (required for standalone HTML)
557
+ #define TONEMAP_MODE 2 // 0=Reinhard, 1=Filmic, 2=ACES
558
+ #define BRIGHTNESS 1.0
559
+ #define WHITE_POINT 1.2
560
+ #define SHOULDER 7.5
561
+ #define BLOOM_STRENGTH 0.08
562
+ #define BLOOM_LOD_START 4.0
563
+ #define COLOR_TINT vec3(1.11, 0.89, 0.79)
564
+ #define CA_SAMPLES 8
565
+ #define CA_INTENSITY 0.003
566
+ #define VIG_POWER 0.25
567
+ #define GRAIN_AMOUNT 0.012
568
+
569
+ float hash11(float p) { return fract(sin(p * 12.9898) * 43758.5453); }
570
+
571
+ // Demo scene fallback: used when no input texture is available
572
+ vec3 demoScene(vec2 uv, float time) {
573
+ // Dynamic gradient background
574
+ vec3 col = 0.5 + 0.5 * cos(time + uv.xyx + vec3(0, 2, 4));
575
+ // Center glowing sphere (for testing bloom)
576
+ float d = length(uv - 0.5) - 0.15;
577
+ col += vec3(2.0) * smoothstep(0.02, 0.0, d);
578
+ // Moving highlight bar (for testing bloom bleed)
579
+ float bar = step(0.48, uv.y) * step(uv.y, 0.52);
580
+ bar *= step(0.0, sin(uv.x * 10.0 - time * 2.0));
581
+ col += vec3(1.5, 0.8, 0.3) * bar;
582
+ // Colored blocks (for testing chromatic aberration and tone mapping)
583
+ vec2 id = floor(uv * 4.0);
584
+ float rand = fract(sin(dot(id, vec2(12.9898, 78.233))) * 43758.5453);
585
+ vec2 rect = fract(uv * 4.0);
586
+ float box = step(0.1, rect.x) * step(rect.x, 0.9) * step(0.1, rect.y) * step(rect.y, 0.9);
587
+ col += vec3(rand, 1.0 - rand, 0.5) * box * 0.5;
588
+ return col;
589
+ }
590
+
591
+ vec3 tonemapReinhard(vec3 c) { return c / (1.0 + c); }
592
+ // IMPORTANT: Critical: filmicCurve takes only one parameter x; w is computed externally via WHITE_POINT
593
+ float filmicCurve(float x) {
594
+ float q = (SHOULDER*SHOULDER+1.0)*x*x; return q/(q+x+SHOULDER*SHOULDER);
595
+ }
596
+ vec3 tonemapFilmic(vec3 c) {
597
+ float w = filmicCurve(WHITE_POINT); // compute w using WHITE_POINT constant first
598
+ return vec3(filmicCurve(c.r), filmicCurve(c.g), filmicCurve(c.b)) / w;
599
+ }
600
+ vec3 tonemapACES(vec3 color) {
601
+ mat3 m1 = mat3(0.59719,0.07600,0.02840, 0.35458,0.90834,0.13383, 0.04823,0.01566,0.83777);
602
+ mat3 m2 = mat3(1.60475,-0.10208,-0.00327, -0.53108,1.10813,-0.07276, -0.07367,-0.00605,1.07602);
603
+ vec3 v = m1*color;
604
+ vec3 a = v*(v+0.0245786)-0.000090537;
605
+ vec3 b = v*(0.983729*v+0.4329510)+0.238081;
606
+ return clamp(m2*(a/b), 0.0, 1.0);
607
+ }
608
+ vec3 applyTonemap(vec3 c) {
609
+ c *= BRIGHTNESS;
610
+ #if TONEMAP_MODE == 0
611
+ return tonemapReinhard(c);
612
+ #elif TONEMAP_MODE == 1
613
+ return tonemapFilmic(c);
614
+ #else
615
+ return tonemapACES(c);
616
+ #endif
617
+ }
618
+
619
+ vec3 sampleBloom(sampler2D tex, vec2 uv) {
620
+ vec3 bloom = vec3(0.0); float tw = 0.0;
621
+ for (int x = -1; x <= 1; x++)
622
+ for (int y = -1; y <= 1; y++) {
623
+ vec2 off = vec2(float(x),float(y))/iResolution.xy; float w = 1.0;
624
+ bloom += w*textureLod(tex, uv+off*exp2(BLOOM_LOD_START), BLOOM_LOD_START).rgb;
625
+ bloom += w*textureLod(tex, uv+off*exp2(BLOOM_LOD_START+1.0), BLOOM_LOD_START+1.0).rgb;
626
+ bloom += w*textureLod(tex, uv+off*exp2(BLOOM_LOD_START+2.0), BLOOM_LOD_START+2.0).rgb;
627
+ tw += w*3.0;
628
+ }
629
+ return bloom / tw;
630
+ }
631
+
632
+ vec3 applyChromaticAberration(sampler2D tex, vec2 uv) {
633
+ vec2 center = 1.0 - 2.0*uv; vec3 color = vec3(0.0);
634
+ float rf=1.0, gf=1.0, bf=1.0, f=1.0/float(CA_SAMPLES);
635
+ for (int i = 0; i < CA_SAMPLES; ++i) {
636
+ color.r += f*texture(tex, 0.5-0.5*(center*rf)).r;
637
+ color.g += f*texture(tex, 0.5-0.5*(center*gf)).g;
638
+ color.b += f*texture(tex, 0.5-0.5*(center*bf)).b;
639
+ rf *= 1.0-CA_INTENSITY; gf *= 1.0-CA_INTENSITY*0.3; bf *= 1.0+CA_INTENSITY*0.4;
640
+ }
641
+ return clamp(color, 0.0, 1.0);
642
+ }
643
+
644
+ void mainImage(out vec4 fragColor, in vec2 fragCoord) {
645
+ vec2 uv = fragCoord / iResolution.xy;
646
+
647
+ // Get input color: demo scene or input texture
648
+ #if USE_DEMO_SCENE
649
+ vec3 color = demoScene(uv, iTime);
650
+ #else
651
+ #if ENABLE_CA
652
+ vec3 color = applyChromaticAberration(iChannel0, uv);
653
+ #else
654
+ vec3 color = texture(iChannel0, uv).rgb;
655
+ #endif
656
+ #endif
657
+
658
+ #if ENABLE_BLOOM && !USE_DEMO_SCENE
659
+ color += sampleBloom(iChannel0, uv) * BLOOM_STRENGTH;
660
+ #else
661
+ // In demo scene mode, use simplified bloom sampling from itself
662
+ #if ENABLE_BLOOM
663
+ vec3 bloom = vec3(0.0); float tw = 0.0;
664
+ for (int x = -1; x <= 1; x++)
665
+ for (int y = -1; y <= 1; y++) {
666
+ vec2 off = vec2(float(x),float(y))/iResolution.xy * 0.02;
667
+ vec3 s = demoScene(uv + off, iTime);
668
+ float w = 1.0;
669
+ bloom += w * min(vec3(5.0), s); tw += w;
670
+ }
671
+ color += bloom / tw * BLOOM_STRENGTH;
672
+ #endif
673
+ #endif
674
+
675
+ color *= COLOR_TINT;
676
+ #if ENABLE_TONEMAP
677
+ #if TONEMAP_MODE == 2
678
+ color = applyTonemap(color);
679
+ #else
680
+ color = applyTonemap(color);
681
+ color = pow(color, vec3(1.0/2.2));
682
+ #endif
683
+ #else
684
+ color = pow(color, vec3(1.0/2.2));
685
+ #endif
686
+ #if ENABLE_CONTRAST
687
+ color = clamp(color, 0.0, 1.0);
688
+ color = color*color*(3.0-2.0*color);
689
+ #endif
690
+ #if ENABLE_VIGNETTE
691
+ vec2 q = fragCoord/iResolution.xy;
692
+ color *= 0.5 + 0.5*pow(16.0*q.x*q.y*(1.0-q.x)*(1.0-q.y), VIG_POWER);
693
+ #endif
694
+ #if ENABLE_GRAIN
695
+ color += GRAIN_AMOUNT * hash11(dot(uv, vec2(12.9898,78.233)) + iTime);
696
+ #endif
697
+ fragColor = vec4(clamp(color, 0.0, 1.0), 1.0);
698
+ }
699
+ ```
700
+
701
+ ## Common Variants
702
+
703
+ ### Variant 1: Multi-Pass Separable Bloom
704
+
705
+ ```glsl
706
+ // Buffer A: Horizontal Gaussian blur + bright-pass
707
+ #define BLOOM_THRESHOLD vec3(0.2)
708
+ #define BLOOM_DOWNSAMPLE 3
709
+ #define BLUR_RADIUS 16
710
+ void mainImage(out vec4 fragColor, in vec2 fragCoord) {
711
+ ivec2 xy = ivec2(fragCoord);
712
+ if (xy.x >= int(iResolution.x)/BLOOM_DOWNSAMPLE) { fragColor = vec4(0); return; }
713
+ vec3 sum = vec3(0.0); float tw = 0.0;
714
+ for (int k = -BLUR_RADIUS; k <= BLUR_RADIUS; ++k) {
715
+ vec3 texel = max(vec3(0.0), texelFetch(iChannel0, (xy+ivec2(k,0))*BLOOM_DOWNSAMPLE, 0).rgb - BLOOM_THRESHOLD);
716
+ float w = exp(-8.0 * pow(abs(float(k))/float(BLUR_RADIUS), 2.0));
717
+ sum += texel*w; tw += w;
718
+ }
719
+ fragColor = vec4(sum/tw, 1.0);
720
+ }
721
+ // Buffer B: Vertical blur, same as above but with direction changed to ivec2(0, k)
722
+ ```
723
+
724
+ ### Variant 2: ACES + Full Color Pipeline (with Built-in Gamma)
725
+
726
+ ```glsl
727
+ vec3 aces_tonemap(vec3 color) {
728
+ mat3 m1 = mat3(0.59719,0.07600,0.02840, 0.35458,0.90834,0.13383, 0.04823,0.01566,0.83777);
729
+ mat3 m2 = mat3(1.60475,-0.10208,-0.00327, -0.53108,1.10813,-0.07276, -0.07367,-0.00605,1.07602);
730
+ vec3 v = m1*color;
731
+ vec3 a = v*(v+0.0245786)-0.000090537;
732
+ vec3 b = v*(0.983729*v+0.4329510)+0.238081;
733
+ return pow(clamp(m2*(a/b), 0.0, 1.0), vec3(1.0/2.2));
734
+ }
735
+ ```
736
+
737
+ ### Variant 3: DoF + Motion Blur Combination
738
+
739
+ ```glsl
740
+ for (int i = 1; i < BLUR_TAPS; i++) {
741
+ float t = float(i)/float(BLUR_TAPS);
742
+ float randomT = hash(iTime + t + uv.x + uv.y*12.345);
743
+ vec2 tapUV = mix(currentUV, prevFrameUV, (randomT-0.5)*shutterAngle); // motion blur
744
+ float theta = t*goldenAngle*float(BLUR_TAPS);
745
+ float r = coc*sqrt(t*float(BLUR_TAPS))/sqrt(float(BLUR_TAPS));
746
+ tapUV += vec2(sin(theta), cos(theta))*r; // DoF
747
+ vec4 tap = textureLod(sceneTex, tapUV, 0.0);
748
+ float w = max(0.001, getCoC(decodeDepth(tap.w), focusDistance));
749
+ result += tap.rgb*w; totalWeight += w;
750
+ }
751
+ ```
752
+
753
+ ### Variant 4: TAA Temporal Anti-Aliasing
754
+
755
+ ```glsl
756
+ vec4 current = textureLod(currentFrame, uv - jitterOffset/iResolution.xy, 0.0);
757
+ vec3 vMin = vec3(1e5), vMax = vec3(-1e5);
758
+ for (int iy = -1; iy <= 1; iy++)
759
+ for (int ix = -1; ix <= 1; ix++) {
760
+ vec3 s = texelFetch(currentFrame, ivec2(fragCoord)+ivec2(ix,iy), 0).rgb;
761
+ vMin = min(vMin, s); vMax = max(vMax, s);
762
+ }
763
+ vec4 history = textureLod(historyBuffer, reprojectToPrevFrame(worldPos, prevViewProjMatrix), 0.0);
764
+ float blend = (all(greaterThanEqual(history.rgb, vMin)) && all(lessThanEqual(history.rgb, vMax))) ? 0.9 : 0.0;
765
+ color = mix(current.rgb, history.rgb, blend);
766
+ ```
767
+
768
+ ### Variant 5: Lens Flare + Starburst
769
+
770
+ ```glsl
771
+ #define NUM_APERTURE_BLADES 8.0
772
+ vec2 toSun = normalize(sunScreenPos - uv);
773
+ float angle = atan(toSun.y, toSun.x);
774
+ float starburst = pow(0.5+0.5*cos(1.5*3.14159+angle*NUM_APERTURE_BLADES),
775
+ max(1.0, 500.0-sunDist*sunDist*501.0));
776
+ float ghost = smoothstep(0.015, 0.0, length(ghostCenter-uv)-ghostRadius);
777
+ totalFlare += wavelengthToRGB(300.0+fract((length(ghostCenter-uv)-ghostRadius)*5.0)*500.0) * ghost * 0.25;
778
+ ```
779
+
780
+ ## Performance & Composition
781
+
782
+ **Performance**: Separable blur 121→22 samples | `textureLod` hardware mipmap for free downsampling | Downsample 2-4x before blurring | Sample counts: MB 16-32, DoF 32-64, CA 4-8 | Inter-texel sampling = free bilinear | `#define` switches have zero cost | Use `mix`/`step`/`smoothstep` instead of branches
783
+
784
+ **Composition**: Bloom+ToneMap (compute bloom in HDR space then tonemap, not reversible) | TAA+MB+DoF (shared sampling loop) | CA+Vignette+Grain (lens trio) | ColorGrading+ToneMap+Contrast (grade in linear space → HDR compression → gamma-space S-curve) | Bloom+LensFlare (shared bright-pass) | Multi-pass pipeline: BufA scene → BufB/C Bloom H/V → BufD TAA → Image compositing
785
+
786
+ ## Further Reading
787
+
788
+ For complete step-by-step tutorials, mathematical derivations, and advanced usage, see [reference](../reference/post-processing.md)