@funpixel/tools 0.0.0-stage → 0.1.1

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 (2414) hide show
  1. package/LICENSE +115 -0
  2. package/NOTICE +28 -0
  3. package/README.md +110 -2
  4. package/bench/LICENSE +674 -0
  5. package/bench/README.md +10 -0
  6. package/bench/entrypoint.py +94 -0
  7. package/bench/handlers/__init__.py +53 -0
  8. package/bench/handlers/apply_skin.py +192 -0
  9. package/bench/handlers/apply_texture.py +195 -0
  10. package/bench/handlers/audit_clips.py +351 -0
  11. package/bench/handlers/author_clips.py +297 -0
  12. package/bench/handlers/author_motion.py +298 -0
  13. package/bench/handlers/bake_emissive.py +136 -0
  14. package/bench/handlers/build_level.py +395 -0
  15. package/bench/handlers/decimate.py +220 -0
  16. package/bench/handlers/fit_rig.py +273 -0
  17. package/bench/handlers/fracture.py +233 -0
  18. package/bench/handlers/humanoid.py +119 -0
  19. package/bench/handlers/inspect.py +212 -0
  20. package/bench/handlers/level_check.py +68 -0
  21. package/bench/handlers/level_geo.py +150 -0
  22. package/bench/handlers/level_proof.py +117 -0
  23. package/bench/handlers/level_props.py +135 -0
  24. package/bench/handlers/lod.py +83 -0
  25. package/bench/handlers/merge_clips.py +122 -0
  26. package/bench/handlers/mirror_limb.py +336 -0
  27. package/bench/handlers/motion_specs.json +11 -0
  28. package/bench/handlers/normalize_materials.py +182 -0
  29. package/bench/handlers/normalize_transform.py +174 -0
  30. package/bench/handlers/prune_clips.py +141 -0
  31. package/bench/handlers/raster.py +98 -0
  32. package/bench/handlers/render.py +239 -0
  33. package/bench/handlers/render_views.py +101 -0
  34. package/bench/handlers/retarget_clips.py +185 -0
  35. package/bench/handlers/scene.py +311 -0
  36. package/bench/handlers/sheet.py +118 -0
  37. package/bench/handlers/texels.py +176 -0
  38. package/bench/handlers/views.py +232 -0
  39. package/dist/api/generated/openapi.js +1 -0
  40. package/dist/api/http.js +71 -0
  41. package/dist/api/jobs.js +94 -0
  42. package/dist/assets/bakeoff.js +61 -0
  43. package/dist/assets/counts.js +60 -0
  44. package/dist/assets/gen.js +230 -0
  45. package/dist/assets/lock.js +77 -0
  46. package/dist/assets/manifest.js +236 -0
  47. package/dist/assets/palette-fit.js +99 -0
  48. package/dist/assets/pixelart.js +192 -0
  49. package/dist/assets/pixels.js +131 -0
  50. package/dist/assets/plan.js +169 -0
  51. package/dist/assets/process.js +209 -0
  52. package/dist/assets/script.js +194 -0
  53. package/dist/assets/steps.js +294 -0
  54. package/dist/bin.js +8 -0
  55. package/dist/board/board.js +99 -0
  56. package/dist/cast/library.js +102 -0
  57. package/dist/cast/measure.js +222 -0
  58. package/dist/cli.js +2917 -0
  59. package/dist/clip/clip.js +83 -0
  60. package/dist/commands/account.js +158 -0
  61. package/dist/commands/assets-pixels.js +106 -0
  62. package/dist/commands/assets.js +473 -0
  63. package/dist/commands/beats.js +77 -0
  64. package/dist/commands/board.js +162 -0
  65. package/dist/commands/boxes.js +89 -0
  66. package/dist/commands/capture-all.js +92 -0
  67. package/dist/commands/cast.js +84 -0
  68. package/dist/commands/character.js +58 -0
  69. package/dist/commands/check.js +404 -0
  70. package/dist/commands/clip.js +112 -0
  71. package/dist/commands/compare-takes.js +204 -0
  72. package/dist/commands/compare-target.js +149 -0
  73. package/dist/commands/compare.js +117 -0
  74. package/dist/commands/compose-variations.js +202 -0
  75. package/dist/commands/compose.js +163 -0
  76. package/dist/commands/cut.js +13 -0
  77. package/dist/commands/decide.js +90 -0
  78. package/dist/commands/depth.js +171 -0
  79. package/dist/commands/dev.js +138 -0
  80. package/dist/commands/directions.js +106 -0
  81. package/dist/commands/doctor.js +281 -0
  82. package/dist/commands/export.js +88 -0
  83. package/dist/commands/feedback.js +496 -0
  84. package/dist/commands/feel.js +144 -0
  85. package/dist/commands/fidelity.js +95 -0
  86. package/dist/commands/find.js +116 -0
  87. package/dist/commands/firstlook.js +138 -0
  88. package/dist/commands/flow.js +600 -0
  89. package/dist/commands/framing.js +53 -0
  90. package/dist/commands/gdd.js +227 -0
  91. package/dist/commands/gen.js +512 -0
  92. package/dist/commands/greenlight.js +148 -0
  93. package/dist/commands/hook.js +171 -0
  94. package/dist/commands/init.js +234 -0
  95. package/dist/commands/inspect.js +161 -0
  96. package/dist/commands/job.js +41 -0
  97. package/dist/commands/jobs.js +87 -0
  98. package/dist/commands/journal.js +58 -0
  99. package/dist/commands/journey.js +228 -0
  100. package/dist/commands/judge.js +191 -0
  101. package/dist/commands/lanes.js +571 -0
  102. package/dist/commands/lessons.js +74 -0
  103. package/dist/commands/life.js +134 -0
  104. package/dist/commands/login.js +134 -0
  105. package/dist/commands/look-3d.js +105 -0
  106. package/dist/commands/look-fit.js +116 -0
  107. package/dist/commands/look-hud.js +180 -0
  108. package/dist/commands/look-read.js +162 -0
  109. package/dist/commands/look-sheet.js +152 -0
  110. package/dist/commands/look-theme.js +136 -0
  111. package/dist/commands/look.js +373 -0
  112. package/dist/commands/loop.js +112 -0
  113. package/dist/commands/loudness.js +69 -0
  114. package/dist/commands/mobile-qa.js +119 -0
  115. package/dist/commands/model.js +256 -0
  116. package/dist/commands/models.js +93 -0
  117. package/dist/commands/motion.js +305 -0
  118. package/dist/commands/next.js +72 -0
  119. package/dist/commands/note.js +294 -0
  120. package/dist/commands/optimize.js +212 -0
  121. package/dist/commands/owner.js +109 -0
  122. package/dist/commands/pack.js +66 -0
  123. package/dist/commands/parts.js +635 -0
  124. package/dist/commands/phone.js +398 -0
  125. package/dist/commands/pick.js +146 -0
  126. package/dist/commands/pitch.js +205 -0
  127. package/dist/commands/places.js +89 -0
  128. package/dist/commands/play.js +368 -0
  129. package/dist/commands/playable.js +51 -0
  130. package/dist/commands/playtest.js +262 -0
  131. package/dist/commands/profile.js +292 -0
  132. package/dist/commands/progress.js +537 -0
  133. package/dist/commands/publish.js +165 -0
  134. package/dist/commands/reach.js +72 -0
  135. package/dist/commands/reel.js +177 -0
  136. package/dist/commands/review.js +112 -0
  137. package/dist/commands/rooms.js +180 -0
  138. package/dist/commands/schema.js +29 -0
  139. package/dist/commands/score.js +326 -0
  140. package/dist/commands/serve.js +67 -0
  141. package/dist/commands/setup.js +254 -0
  142. package/dist/commands/sim.js +179 -0
  143. package/dist/commands/simulator.js +154 -0
  144. package/dist/commands/smoke-build.js +305 -0
  145. package/dist/commands/smoke.js +37 -0
  146. package/dist/commands/spec.js +114 -0
  147. package/dist/commands/store.js +154 -0
  148. package/dist/commands/test.js +104 -0
  149. package/dist/commands/trailer.js +255 -0
  150. package/dist/commands/unity-editor.js +322 -0
  151. package/dist/commands/unity-player.js +672 -0
  152. package/dist/commands/unity.js +198 -0
  153. package/dist/commands/upgrade.js +186 -0
  154. package/dist/commands/variety.js +108 -0
  155. package/dist/commands/verify.js +293 -0
  156. package/dist/commands/walk.js +449 -0
  157. package/dist/commands/widen.js +133 -0
  158. package/dist/commands/world.js +175 -0
  159. package/dist/commands/wow.js +143 -0
  160. package/dist/commands/zero.js +71 -0
  161. package/dist/compose/adsheet.js +61 -0
  162. package/dist/compose/contract.js +248 -0
  163. package/dist/compose/facts.js +81 -0
  164. package/dist/compose/hyperframes.js +102 -0
  165. package/dist/compose/page.js +216 -0
  166. package/dist/compose/probe.js +160 -0
  167. package/dist/compose/run.js +170 -0
  168. package/dist/compose/sheet.js +92 -0
  169. package/dist/compose/starters.js +247 -0
  170. package/dist/compose/variations.js +203 -0
  171. package/dist/criteria.js +35 -0
  172. package/dist/depth/experience.js +61 -0
  173. package/dist/depth/fill.js +102 -0
  174. package/dist/depth/inventory.js +161 -0
  175. package/dist/depth/pacing.js +173 -0
  176. package/dist/depth/story.js +97 -0
  177. package/dist/dev/devtools.js +119 -0
  178. package/dist/dev/hold.js +46 -0
  179. package/dist/dev/lan.js +15 -0
  180. package/dist/dev/open.js +30 -0
  181. package/dist/dev/qr.js +124 -0
  182. package/dist/devtools/LICENSES/pixi.js.LICENSE +21 -0
  183. package/dist/devtools/LICENSES/preact.LICENSE +21 -0
  184. package/dist/devtools/LICENSES/source-map-js.LICENSE +28 -0
  185. package/dist/devtools/LICENSES/three.LICENSE +21 -0
  186. package/dist/devtools/inspector/funpixel-inspector.pixi.min.js +1 -0
  187. package/dist/devtools/inspector/funpixel-inspector.threejs.min.js +1 -0
  188. package/dist/devtools/inspector/hooked-engines/pixi.min.js +8 -0
  189. package/dist/devtools/inspector/hooked-engines/preact.min.js +1 -0
  190. package/dist/devtools/inspector/hooked-engines/threejs.min.js +12 -0
  191. package/dist/devtools/kapture/funpixel-kapture.min.js +1 -0
  192. package/dist/devtools/profiler/funpixel-profiler.pixi.min.js +1 -0
  193. package/dist/devtools/profiler/funpixel-profiler.threejs.min.js +1 -0
  194. package/dist/direct/moves.js +234 -0
  195. package/dist/direct/read.js +59 -0
  196. package/dist/direct/round.js +80 -0
  197. package/dist/doctor/host.js +245 -0
  198. package/dist/doctor/unity-checks.js +380 -0
  199. package/dist/doctor/unity-history.js +589 -0
  200. package/dist/doctor/unity-host.js +160 -0
  201. package/dist/doctor/unity-import-rules.js +874 -0
  202. package/dist/doctor/unity-meta.js +225 -0
  203. package/dist/doctor/unity-project.js +297 -0
  204. package/dist/doctor/unity.js +171 -0
  205. package/dist/export/export.js +165 -0
  206. package/dist/export/metadata.js +25 -0
  207. package/dist/export/runtime.js +119 -0
  208. package/dist/export/scan.js +78 -0
  209. package/dist/export/select.js +193 -0
  210. package/dist/export/strip.js +42 -0
  211. package/dist/feedback/ab.js +55 -0
  212. package/dist/feedback/auto.js +44 -0
  213. package/dist/feedback/learn.js +255 -0
  214. package/dist/feedback/measure.js +49 -0
  215. package/dist/feedback/page.js +66 -0
  216. package/dist/feel/feedback.js +85 -0
  217. package/dist/feel/judge.js +420 -0
  218. package/dist/feel/run.js +185 -0
  219. package/dist/feel/spec.js +124 -0
  220. package/dist/feel/sweep.js +156 -0
  221. package/dist/fidelity/consistency.js +205 -0
  222. package/dist/fidelity/match.js +675 -0
  223. package/dist/fidelity/run.js +107 -0
  224. package/dist/find/keywords.js +97 -0
  225. package/dist/find/names.js +45 -0
  226. package/dist/find/route.js +59 -0
  227. package/dist/firstlook/quality.js +261 -0
  228. package/dist/firstlook/render.js +111 -0
  229. package/dist/firstlook/set.js +218 -0
  230. package/dist/flow/flow.js +455 -0
  231. package/dist/flow/look.js +139 -0
  232. package/dist/frame/behaviour.js +53 -0
  233. package/dist/frame/clock.js +117 -0
  234. package/dist/frame/contract.js +111 -0
  235. package/dist/frame/genre.js +65 -0
  236. package/dist/frame/idle.js +58 -0
  237. package/dist/frame/opening.js +171 -0
  238. package/dist/frames/loop.js +52 -0
  239. package/dist/frames/sheet.js +69 -0
  240. package/dist/gdd/book.js +483 -0
  241. package/dist/gdd/chapters.js +71 -0
  242. package/dist/gdd/design.js +135 -0
  243. package/dist/gdd/doc.js +32 -0
  244. package/dist/gdd/levelmap.js +428 -0
  245. package/dist/gdd/measures.js +477 -0
  246. package/dist/gdd/page.js +111 -0
  247. package/dist/gdd/rubric.js +250 -0
  248. package/dist/gdd/size.js +83 -0
  249. package/dist/gdd/tiers.js +148 -0
  250. package/dist/gdd/world.js +98 -0
  251. package/dist/gdd/worth.js +507 -0
  252. package/dist/gen/kinds.js +451 -0
  253. package/dist/gen/local/doctor.js +25 -0
  254. package/dist/gen/local/index.js +3 -0
  255. package/dist/gen/local/kokoro.js +334 -0
  256. package/dist/gen/local/master.js +248 -0
  257. package/dist/gen/local/provider.js +65 -0
  258. package/dist/gen/local/voice-rules.js +156 -0
  259. package/dist/gen/models.generated.js +469 -0
  260. package/dist/gen/models.js +53 -0
  261. package/dist/gen/prompt-lint.js +35 -0
  262. package/dist/gen/record.js +73 -0
  263. package/dist/gen/save.js +101 -0
  264. package/dist/gen/title.js +55 -0
  265. package/dist/gen/unity.js +334 -0
  266. package/dist/goals/goals.js +204 -0
  267. package/dist/goals/run.js +90 -0
  268. package/dist/greenlight/ambition.js +42 -0
  269. package/dist/greenlight/bible.js +138 -0
  270. package/dist/greenlight/lock.js +48 -0
  271. package/dist/greenlight/match.js +19 -0
  272. package/dist/greenlight/md.js +82 -0
  273. package/dist/greenlight/page.js +100 -0
  274. package/dist/greenlight/pitches.js +66 -0
  275. package/dist/greenlight/worth.js +90 -0
  276. package/dist/guidance.js +24 -0
  277. package/dist/init/bare.js +114 -0
  278. package/dist/init/git.js +56 -0
  279. package/dist/init/starter.js +166 -0
  280. package/dist/init/starters.js +179 -0
  281. package/dist/inspect/describe.js +125 -0
  282. package/dist/inspect/devserver.js +40 -0
  283. package/dist/journey/diff.js +74 -0
  284. package/dist/journey/from-round.js +44 -0
  285. package/dist/journey/record.js +76 -0
  286. package/dist/journey/run.js +139 -0
  287. package/dist/journey/script.js +223 -0
  288. package/dist/judge/common.js +60 -0
  289. package/dist/judge/identity.js +68 -0
  290. package/dist/judge/sources.js +37 -0
  291. package/dist/judge/structure.js +59 -0
  292. package/dist/keys/device.js +145 -0
  293. package/dist/keys/store.js +167 -0
  294. package/dist/lanes/fence.js +108 -0
  295. package/dist/lanes/gate.js +123 -0
  296. package/dist/lanes/lanes.js +355 -0
  297. package/dist/lanes/union.js +62 -0
  298. package/dist/lanes/where.js +49 -0
  299. package/dist/lessons/motifs.js +97 -0
  300. package/dist/lessons/store.js +56 -0
  301. package/dist/look/anim.js +206 -0
  302. package/dist/look/boxes.js +209 -0
  303. package/dist/look/dressing.js +24 -0
  304. package/dist/look/feedback.js +50 -0
  305. package/dist/look/fit.js +123 -0
  306. package/dist/look/held.js +92 -0
  307. package/dist/look/hook.js +169 -0
  308. package/dist/look/hud.js +189 -0
  309. package/dist/look/image-io.js +50 -0
  310. package/dist/look/life.js +96 -0
  311. package/dist/look/light.js +42 -0
  312. package/dist/look/look.js +85 -0
  313. package/dist/look/loops.js +108 -0
  314. package/dist/look/made-of.js +242 -0
  315. package/dist/look/moments.js +32 -0
  316. package/dist/look/motion.js +44 -0
  317. package/dist/look/phone-play.js +142 -0
  318. package/dist/look/player.js +32 -0
  319. package/dist/look/png.js +117 -0
  320. package/dist/look/readability.js +100 -0
  321. package/dist/look/roles.js +109 -0
  322. package/dist/look/sheet.js +104 -0
  323. package/dist/look/theme.js +278 -0
  324. package/dist/look/touch.js +129 -0
  325. package/dist/look/ui-style.js +102 -0
  326. package/dist/machine/procs.js +117 -0
  327. package/dist/managed.js +15 -0
  328. package/dist/mcp/hosted.js +174 -0
  329. package/dist/mcp/models.generated.js +538 -0
  330. package/dist/mcp/models.js +35 -0
  331. package/dist/mcp/server.js +330 -0
  332. package/dist/memory/decisions.js +138 -0
  333. package/dist/memory/journal.js +108 -0
  334. package/dist/model/bench.js +83 -0
  335. package/dist/model/blender.js +106 -0
  336. package/dist/model/clips.js +34 -0
  337. package/dist/model/finalize.js +33 -0
  338. package/dist/motion/checks.js +173 -0
  339. package/dist/motion/contract.js +177 -0
  340. package/dist/motion/encode.js +37 -0
  341. package/dist/motion/render.js +167 -0
  342. package/dist/motion/starter.js +54 -0
  343. package/dist/optimize/check.js +29 -0
  344. package/dist/optimize/helper.js +80 -0
  345. package/dist/owner/bar.js +285 -0
  346. package/dist/owner/match.js +105 -0
  347. package/dist/pack/build.js +97 -0
  348. package/dist/pack/deps.js +28 -0
  349. package/dist/pack/leaks.js +77 -0
  350. package/dist/pack/limits.js +51 -0
  351. package/dist/pack/report.js +35 -0
  352. package/dist/phone/baguette.js +139 -0
  353. package/dist/phone/listen.js +65 -0
  354. package/dist/pipeline/pipeline.js +929 -0
  355. package/dist/plan/actions.js +18 -0
  356. package/dist/plan/notes.js +15 -0
  357. package/dist/play/clock.js +40 -0
  358. package/dist/play/condition.js +45 -0
  359. package/dist/play/frames.js +60 -0
  360. package/dist/play/input.js +118 -0
  361. package/dist/play/pointer.js +21 -0
  362. package/dist/play/report.js +124 -0
  363. package/dist/play/server.js +274 -0
  364. package/dist/play/session.js +231 -0
  365. package/dist/play/steps.js +192 -0
  366. package/dist/playable/build.js +90 -0
  367. package/dist/playable/cta.js +88 -0
  368. package/dist/playable/networks.js +33 -0
  369. package/dist/playable/scan.js +46 -0
  370. package/dist/playtest/after-round.js +60 -0
  371. package/dist/playtest/assemble.js +168 -0
  372. package/dist/playtest/experience-run.js +69 -0
  373. package/dist/playtest/experience.js +77 -0
  374. package/dist/playtest/facts.js +90 -0
  375. package/dist/playtest/fidelity.js +179 -0
  376. package/dist/playtest/history.js +115 -0
  377. package/dist/playtest/hits.js +48 -0
  378. package/dist/playtest/hosted.js +98 -0
  379. package/dist/playtest/keep.js +110 -0
  380. package/dist/playtest/ledger.js +77 -0
  381. package/dist/playtest/length.js +113 -0
  382. package/dist/playtest/measure.js +181 -0
  383. package/dist/playtest/mobile-qa.js +391 -0
  384. package/dist/playtest/mockups.js +198 -0
  385. package/dist/playtest/moments.js +28 -0
  386. package/dist/playtest/prepare.js +162 -0
  387. package/dist/playtest/rank.js +184 -0
  388. package/dist/playtest/report.js +209 -0
  389. package/dist/playtest/route.js +139 -0
  390. package/dist/playtest/seats.js +128 -0
  391. package/dist/playtest/sheet.js +38 -0
  392. package/dist/playtest/stop.js +54 -0
  393. package/dist/playtest/stuck.js +47 -0
  394. package/dist/production/contract.js +61 -0
  395. package/dist/production/mirror.js +96 -0
  396. package/dist/production/tier.js +66 -0
  397. package/dist/profile/compare.js +171 -0
  398. package/dist/progress/answers.js +35 -0
  399. package/dist/progress/holds.js +106 -0
  400. package/dist/progress/notify.js +25 -0
  401. package/dist/progress/progress.js +300 -0
  402. package/dist/publish/build.js +54 -0
  403. package/dist/publish/folder.js +106 -0
  404. package/dist/publish/funpixel.js +96 -0
  405. package/dist/publish/hosts.js +48 -0
  406. package/dist/reach/envelope.js +111 -0
  407. package/dist/reach/load.js +84 -0
  408. package/dist/reach/side.js +320 -0
  409. package/dist/reach/spec3d.js +338 -0
  410. package/dist/reach/tiles.js +163 -0
  411. package/dist/reel/encode.js +34 -0
  412. package/dist/reel/tour.js +81 -0
  413. package/dist/relay/bots.js +62 -0
  414. package/dist/relay/bridge.js +54 -0
  415. package/dist/relay/local.js +82 -0
  416. package/dist/relay/redis.js +40 -0
  417. package/dist/review/audio.js +72 -0
  418. package/dist/review/ledger.js +60 -0
  419. package/dist/review/media.js +114 -0
  420. package/dist/review/model.js +348 -0
  421. package/dist/review/picture.js +113 -0
  422. package/dist/review/specs.js +134 -0
  423. package/dist/review/video.js +248 -0
  424. package/dist/schema/game.js +308 -0
  425. package/dist/score/comfort.js +79 -0
  426. package/dist/score/light.js +62 -0
  427. package/dist/score/measure.js +386 -0
  428. package/dist/score/vision.js +59 -0
  429. package/dist/serve/webgl.js +415 -0
  430. package/dist/setup/lsp.js +42 -0
  431. package/dist/sim/curve.js +122 -0
  432. package/dist/sim/judge.js +240 -0
  433. package/dist/sim/skeleton.js +65 -0
  434. package/dist/simulator/lease.js +159 -0
  435. package/dist/simulator/orient.js +57 -0
  436. package/dist/simulator/screen.js +113 -0
  437. package/dist/simulator/simctl.js +79 -0
  438. package/dist/smoke/art.js +20 -0
  439. package/dist/smoke/checks.js +165 -0
  440. package/dist/smoke/logic.js +73 -0
  441. package/dist/smoke/orphans.js +78 -0
  442. package/dist/smoke/palette.js +16 -0
  443. package/dist/smoke/sources.js +36 -0
  444. package/dist/sound/beats.js +95 -0
  445. package/dist/sound/loudness.js +94 -0
  446. package/dist/spec/extract.js +123 -0
  447. package/dist/spec/lint.js +261 -0
  448. package/dist/spec/presets.js +30 -0
  449. package/dist/spec/rooms.js +188 -0
  450. package/dist/spec/scaffold.js +457 -0
  451. package/dist/spec/sections.js +16 -0
  452. package/dist/spec/tunables.js +74 -0
  453. package/dist/stage/harnessignore.js +90 -0
  454. package/dist/stage/stage.js +57 -0
  455. package/dist/stage/tar.js +41 -0
  456. package/dist/status/board.js +172 -0
  457. package/dist/status/file.js +112 -0
  458. package/dist/status/inbox.js +55 -0
  459. package/dist/status/status.js +311 -0
  460. package/dist/store/answers.js +47 -0
  461. package/dist/store/doctor.js +120 -0
  462. package/dist/store/images.js +65 -0
  463. package/dist/store/init.js +101 -0
  464. package/dist/store/lint.js +392 -0
  465. package/dist/store/plan.js +133 -0
  466. package/dist/store/sdks.js +107 -0
  467. package/dist/studio/forks.js +93 -0
  468. package/dist/studio/pitch.js +294 -0
  469. package/dist/studio/widen.js +212 -0
  470. package/dist/suite/node-run.js +81 -0
  471. package/dist/suite/test-types.js +71 -0
  472. package/dist/trailer/assemble.js +90 -0
  473. package/dist/trailer/beats.js +74 -0
  474. package/dist/trailer/cards.js +77 -0
  475. package/dist/trailer/cues.js +78 -0
  476. package/dist/trailer/cut.js +49 -0
  477. package/dist/trailer/find.js +33 -0
  478. package/dist/trailer/mix.js +109 -0
  479. package/dist/trailer/placement.js +30 -0
  480. package/dist/types.js +1 -0
  481. package/dist/ui.js +79 -0
  482. package/dist/unity/bridge.js +251 -0
  483. package/dist/unity/disk.js +666 -0
  484. package/dist/unity/editor.js +471 -0
  485. package/dist/unity/gc.js +140 -0
  486. package/dist/unity/mcp-stdio.js +141 -0
  487. package/dist/unity/probe/budgets.js +84 -0
  488. package/dist/unity/probe/client.js +93 -0
  489. package/dist/unity/probe/install.js +118 -0
  490. package/dist/unity/probe/player.js +255 -0
  491. package/dist/unity/probe/report.js +102 -0
  492. package/dist/unity/probe/script.js +225 -0
  493. package/dist/unity/queue.js +353 -0
  494. package/dist/unity/run.js +172 -0
  495. package/dist/update.js +111 -0
  496. package/dist/variety/compare.js +104 -0
  497. package/dist/variety/places.js +109 -0
  498. package/dist/variety/profile.js +127 -0
  499. package/dist/vendor/verify/README.md +19 -0
  500. package/dist/vendor/verify/package.json +14 -0
  501. package/dist/vendor/verify/src/index.d.ts +105 -0
  502. package/dist/vendor/verify/src/index.js +78 -0
  503. package/dist/vendor/verify/src/init/preview_shim.js +63 -0
  504. package/dist/vendor/verify/src/page/actors.js +258 -0
  505. package/dist/vendor/verify/src/page/audio.js +106 -0
  506. package/dist/vendor/verify/src/page/audio_cues.js +141 -0
  507. package/dist/vendor/verify/src/page/audio_files.js +56 -0
  508. package/dist/vendor/verify/src/page/bot_sweep.js +72 -0
  509. package/dist/vendor/verify/src/page/capture_view.js +164 -0
  510. package/dist/vendor/verify/src/page/context_loss_listener.js +23 -0
  511. package/dist/vendor/verify/src/page/dressing.js +106 -0
  512. package/dist/vendor/verify/src/page/enter_view.js +33 -0
  513. package/dist/vendor/verify/src/page/feel.js +126 -0
  514. package/dist/vendor/verify/src/page/feel_sweep.js +75 -0
  515. package/dist/vendor/verify/src/page/first_paint.js +54 -0
  516. package/dist/vendor/verify/src/page/fonts.js +50 -0
  517. package/dist/vendor/verify/src/page/frame_honesty.js +44 -0
  518. package/dist/vendor/verify/src/page/front_door.js +197 -0
  519. package/dist/vendor/verify/src/page/grounding.js +448 -0
  520. package/dist/vendor/verify/src/page/hooks.js +74 -0
  521. package/dist/vendor/verify/src/page/hud.js +261 -0
  522. package/dist/vendor/verify/src/page/inventory.js +15 -0
  523. package/dist/vendor/verify/src/page/layout.js +378 -0
  524. package/dist/vendor/verify/src/page/levels.js +40 -0
  525. package/dist/vendor/verify/src/page/life.js +123 -0
  526. package/dist/vendor/verify/src/page/life_anim.js +501 -0
  527. package/dist/vendor/verify/src/page/made_of.js +83 -0
  528. package/dist/vendor/verify/src/page/mechanic_check.js +272 -0
  529. package/dist/vendor/verify/src/page/moments.js +36 -0
  530. package/dist/vendor/verify/src/page/motion.js +139 -0
  531. package/dist/vendor/verify/src/page/perf.js +255 -0
  532. package/dist/vendor/verify/src/page/phone_check.js +229 -0
  533. package/dist/vendor/verify/src/page/play.js +117 -0
  534. package/dist/vendor/verify/src/page/play_act.js +164 -0
  535. package/dist/vendor/verify/src/page/preview.js +33 -0
  536. package/dist/vendor/verify/src/page/recorder.js +54 -0
  537. package/dist/vendor/verify/src/page/render_health.js +83 -0
  538. package/dist/vendor/verify/src/page/renderer.js +75 -0
  539. package/dist/vendor/verify/src/page/scene.js +222 -0
  540. package/dist/vendor/verify/src/page/self_test.js +25 -0
  541. package/dist/vendor/verify/src/page/step_clock.js +247 -0
  542. package/dist/vendor/verify/src/page/surfaces.js +261 -0
  543. package/dist/vendor/verify/src/page/world_actors.js +264 -0
  544. package/dist/verify/browser.js +245 -0
  545. package/dist/verify/console.js +34 -0
  546. package/dist/verify/fingerprint.js +72 -0
  547. package/dist/verify/gpu.js +33 -0
  548. package/dist/verify/health.js +172 -0
  549. package/dist/verify/hooks.js +34 -0
  550. package/dist/verify/judge.js +303 -0
  551. package/dist/verify/players.js +123 -0
  552. package/dist/verify/probe.js +236 -0
  553. package/dist/verify/reads.js +32 -0
  554. package/dist/verify/run.js +56 -0
  555. package/dist/verify/serve.js +36 -0
  556. package/dist/walk/film.js +37 -0
  557. package/dist/walk/judge.js +287 -0
  558. package/dist/walk/routes.js +199 -0
  559. package/dist/walk/world.js +292 -0
  560. package/dist/world/brief.js +86 -0
  561. package/dist/world/check.js +254 -0
  562. package/dist/world/forge.js +542 -0
  563. package/dist/world/format.js +40 -0
  564. package/dist/world/variety.js +59 -0
  565. package/dist/wow/catalogue.js +86 -0
  566. package/dist/wow/picks.js +74 -0
  567. package/package.json +51 -4
  568. package/panel/asset-identity.md +61 -0
  569. package/panel/asset-structure.md +55 -0
  570. package/panel/blockers.md +47 -0
  571. package/panel/brief.md +89 -0
  572. package/panel/clip.md +54 -0
  573. package/panel/experience-personas.json +4 -0
  574. package/panel/experience.md +96 -0
  575. package/panel/fidelity-ui.md +74 -0
  576. package/panel/fidelity.md +83 -0
  577. package/panel/greenlight-pitch.md +69 -0
  578. package/panel/greenlight.md +87 -0
  579. package/panel/mobile-qa.md +128 -0
  580. package/panel/personas.json +6 -0
  581. package/panel/reference-match.md +12 -0
  582. package/panel/versus.md +31 -0
  583. package/plugins/.agents/plugins/marketplace.json +18 -0
  584. package/plugins/.claude-plugin/marketplace.json +17 -0
  585. package/plugins/.cursor-plugin/marketplace.json +13 -0
  586. package/plugins/LICENSE +115 -0
  587. package/plugins/README.md +16 -0
  588. package/plugins/THIRD_PARTY_NOTICES.md +75 -0
  589. package/plugins/claude/.claude-plugin/plugin.json +19 -0
  590. package/plugins/claude/.mcp.json +10 -0
  591. package/plugins/claude/LICENSE +115 -0
  592. package/plugins/claude/README.md +14 -0
  593. package/plugins/claude/THIRD_PARTY_NOTICES.md +75 -0
  594. package/plugins/claude/agents/art-director.md +54 -0
  595. package/plugins/claude/agents/audio-director.md +51 -0
  596. package/plugins/claude/agents/critic.md +113 -0
  597. package/plugins/claude/agents/lane.md +38 -0
  598. package/plugins/claude/agents/level-designer.md +45 -0
  599. package/plugins/claude/agents/mobile-qa.md +71 -0
  600. package/plugins/claude/agents/player.md +144 -0
  601. package/plugins/claude/agents/qa-lead.md +52 -0
  602. package/plugins/claude/commands/first-look.md +59 -0
  603. package/plugins/claude/commands/flow.md +50 -0
  604. package/plugins/claude/commands/lanes.md +38 -0
  605. package/plugins/claude/commands/mobile-qa.md +28 -0
  606. package/plugins/claude/commands/new.md +94 -0
  607. package/plugins/claude/commands/playtest.md +66 -0
  608. package/plugins/claude/commands/publish.md +23 -0
  609. package/plugins/claude/commands/smoke-build.md +25 -0
  610. package/plugins/claude/commands/verify.md +20 -0
  611. package/plugins/claude/hooks/brief.md +135 -0
  612. package/plugins/claude/hooks/critic-receipts.mjs +86 -0
  613. package/plugins/claude/hooks/durable.mjs +56 -0
  614. package/plugins/claude/hooks/fence.mjs +30 -0
  615. package/plugins/claude/hooks/floors.mjs +181 -0
  616. package/plugins/claude/hooks/flow.mjs +154 -0
  617. package/plugins/claude/hooks/front-door.mjs +68 -0
  618. package/plugins/claude/hooks/guidance.json +3 -0
  619. package/plugins/claude/hooks/hints.mjs +183 -0
  620. package/plugins/claude/hooks/hooks.json +62 -0
  621. package/plugins/claude/hooks/lib.mjs +362 -0
  622. package/plugins/claude/hooks/memory.mjs +92 -0
  623. package/plugins/claude/hooks/mobile-qa.mjs +43 -0
  624. package/plugins/claude/hooks/note.mjs +63 -0
  625. package/plugins/claude/hooks/nudge.mjs +98 -0
  626. package/plugins/claude/hooks/pipeline.mjs +207 -0
  627. package/plugins/claude/hooks/prompt.mjs +51 -0
  628. package/plugins/claude/hooks/quality.mjs +310 -0
  629. package/plugins/claude/hooks/reach.mjs +93 -0
  630. package/plugins/claude/hooks/scope.mjs +44 -0
  631. package/plugins/claude/hooks/session-log.mjs +101 -0
  632. package/plugins/claude/hooks/session-start.mjs +194 -0
  633. package/plugins/claude/hooks/skill-names.json +19 -0
  634. package/plugins/claude/hooks/stop-gate.mjs +303 -0
  635. package/plugins/claude/hooks/vendor/direct/round.mjs +81 -0
  636. package/plugins/claude/hooks/vendor/find/names.mjs +46 -0
  637. package/plugins/claude/hooks/vendor/firstlook/set.mjs +219 -0
  638. package/plugins/claude/hooks/vendor/flow/flow.mjs +456 -0
  639. package/plugins/claude/hooks/vendor/flow/look.mjs +140 -0
  640. package/plugins/claude/hooks/vendor/gdd/book.mjs +484 -0
  641. package/plugins/claude/hooks/vendor/gdd/chapters.mjs +72 -0
  642. package/plugins/claude/hooks/vendor/gdd/doc.mjs +33 -0
  643. package/plugins/claude/hooks/vendor/gdd/levelmap.mjs +429 -0
  644. package/plugins/claude/hooks/vendor/gdd/rubric.mjs +251 -0
  645. package/plugins/claude/hooks/vendor/gdd/worth.mjs +508 -0
  646. package/plugins/claude/hooks/vendor/lanes/fence.mjs +109 -0
  647. package/plugins/claude/hooks/vendor/lanes/lanes.mjs +356 -0
  648. package/plugins/claude/hooks/vendor/lanes/union.mjs +63 -0
  649. package/plugins/claude/hooks/vendor/lessons/motifs.mjs +98 -0
  650. package/plugins/claude/hooks/vendor/lessons/store.mjs +57 -0
  651. package/plugins/claude/hooks/vendor/look/made-of.mjs +243 -0
  652. package/plugins/claude/hooks/vendor/look/roles.mjs +110 -0
  653. package/plugins/claude/hooks/vendor/memory/decisions.mjs +139 -0
  654. package/plugins/claude/hooks/vendor/memory/journal.mjs +109 -0
  655. package/plugins/claude/hooks/vendor/owner/bar.mjs +286 -0
  656. package/plugins/claude/hooks/vendor/pipeline/pipeline.mjs +930 -0
  657. package/plugins/claude/hooks/vendor/playtest/keep.mjs +111 -0
  658. package/plugins/claude/hooks/vendor/playtest/stuck.mjs +48 -0
  659. package/plugins/claude/hooks/vendor/progress/holds.mjs +107 -0
  660. package/plugins/claude/hooks/vendor/progress/progress.mjs +301 -0
  661. package/plugins/claude/hooks/vendor/sim/judge.mjs +241 -0
  662. package/plugins/claude/hooks/vendor/spec/rooms.mjs +189 -0
  663. package/plugins/claude/hooks/vendor/spec/tunables.mjs +75 -0
  664. package/plugins/claude/hooks/vendor/stage/harnessignore.mjs +91 -0
  665. package/plugins/claude/hooks/vendor/stage/stage.mjs +58 -0
  666. package/plugins/claude/hooks/vendor/status/board.mjs +173 -0
  667. package/plugins/claude/hooks/vendor/status/file.mjs +113 -0
  668. package/plugins/claude/hooks/vendor/studio/forks.mjs +94 -0
  669. package/plugins/claude/hooks/vendor/studio/pitch.mjs +295 -0
  670. package/plugins/claude/hooks/vendor/verify/fingerprint.mjs +73 -0
  671. package/plugins/claude/hooks/vendor/verify/reads.mjs +33 -0
  672. package/plugins/claude/hooks/vendor/wow/picks.mjs +75 -0
  673. package/plugins/claude/skills/3d/SKILL.md +89 -0
  674. package/plugins/claude/skills/3d/references/bake-off.md +48 -0
  675. package/plugins/claude/skills/3d/references/bench.md +103 -0
  676. package/plugins/claude/skills/3d/references/budgets.md +48 -0
  677. package/plugins/claude/skills/3d/references/characters.md +67 -0
  678. package/plugins/claude/skills/3d/references/concept-image.md +47 -0
  679. package/plugins/claude/skills/3d/references/engine-targets.md +31 -0
  680. package/plugins/claude/skills/3d/references/hero-route.md +104 -0
  681. package/plugins/claude/skills/3d/references/level-spec.md +109 -0
  682. package/plugins/claude/skills/3d/references/levels.md +84 -0
  683. package/plugins/claude/skills/3d/references/light-and-places.md +141 -0
  684. package/plugins/claude/skills/3d/references/models.md +111 -0
  685. package/plugins/claude/skills/3d/references/painted-target.md +184 -0
  686. package/plugins/claude/skills/3d/references/reading.md +41 -0
  687. package/plugins/claude/skills/3d/references/skin.md +85 -0
  688. package/plugins/claude/skills/3d/references/skyboxes.md +65 -0
  689. package/plugins/claude/skills/3d/references/textures.md +71 -0
  690. package/plugins/claude/skills/3d/references/three-loading.md +199 -0
  691. package/plugins/claude/skills/3d/references/unity.md +78 -0
  692. package/plugins/claude/skills/art/SKILL.md +104 -0
  693. package/plugins/claude/skills/art/references/2d-assets.md +108 -0
  694. package/plugins/claude/skills/art/references/animation.md +126 -0
  695. package/plugins/claude/skills/art/references/cast.md +73 -0
  696. package/plugins/claude/skills/art/references/characters.md +49 -0
  697. package/plugins/claude/skills/art/references/cost.md +107 -0
  698. package/plugins/claude/skills/art/references/effects.md +85 -0
  699. package/plugins/claude/skills/art/references/frames.md +87 -0
  700. package/plugins/claude/skills/art/references/judging-frames.md +64 -0
  701. package/plugins/claude/skills/art/references/look.md +102 -0
  702. package/plugins/claude/skills/art/references/measure.md +119 -0
  703. package/plugins/claude/skills/art/references/pipeline.md +185 -0
  704. package/plugins/claude/skills/art/references/pixi.md +277 -0
  705. package/plugins/claude/skills/art/references/planes.md +27 -0
  706. package/plugins/claude/skills/art/references/prompts.md +171 -0
  707. package/plugins/claude/skills/art/references/sheets.md +141 -0
  708. package/plugins/claude/skills/art/references/style-file.md +39 -0
  709. package/plugins/claude/skills/art/references/three.md +232 -0
  710. package/plugins/claude/skills/art/references/ui.md +163 -0
  711. package/plugins/claude/skills/art/references/unity.md +78 -0
  712. package/plugins/claude/skills/art/references/wiring.md +41 -0
  713. package/plugins/claude/skills/audio/SKILL.md +92 -0
  714. package/plugins/claude/skills/audio/references/adaptive-music.md +204 -0
  715. package/plugins/claude/skills/audio/references/engine.md +78 -0
  716. package/plugins/claude/skills/audio/references/measure.md +101 -0
  717. package/plugins/claude/skills/audio/references/unity.md +74 -0
  718. package/plugins/claude/skills/feedback/SKILL.md +120 -0
  719. package/plugins/claude/skills/feedback/references/memory.md +99 -0
  720. package/plugins/claude/skills/game-feel/SKILL.md +104 -0
  721. package/plugins/claude/skills/game-feel/references/contact.md +110 -0
  722. package/plugins/claude/skills/game-feel/references/measure.md +125 -0
  723. package/plugins/claude/skills/game-feel/references/motion.md +134 -0
  724. package/plugins/claude/skills/game-feel/references/payoffs.md +35 -0
  725. package/plugins/claude/skills/game-feel/references/recipes.md +107 -0
  726. package/plugins/claude/skills/game-feel/references/unity.md +73 -0
  727. package/plugins/claude/skills/game-logic/SKILL.md +113 -0
  728. package/plugins/claude/skills/game-logic/references/balance.md +88 -0
  729. package/plugins/claude/skills/game-logic/references/content-at-scale.md +147 -0
  730. package/plugins/claude/skills/game-logic/references/depth.md +89 -0
  731. package/plugins/claude/skills/game-logic/references/escalation.md +41 -0
  732. package/plugins/claude/skills/game-logic/references/levels.md +61 -0
  733. package/plugins/claude/skills/game-logic/references/probes.md +122 -0
  734. package/plugins/claude/skills/game-logic/references/unity.md +108 -0
  735. package/plugins/claude/skills/game-spine/SKILL.md +118 -0
  736. package/plugins/claude/skills/game-spine/references/camera.md +94 -0
  737. package/plugins/claude/skills/game-spine/references/multiplayer.md +101 -0
  738. package/plugins/claude/skills/game-spine/references/patterns.md +103 -0
  739. package/plugins/claude/skills/game-spine/references/performance.md +96 -0
  740. package/plugins/claude/skills/game-spine/references/pixi.md +26 -0
  741. package/plugins/claude/skills/game-spine/references/replay.md +102 -0
  742. package/plugins/claude/skills/game-spine/references/room-api.md +63 -0
  743. package/plugins/claude/skills/game-spine/references/room-modes.md +40 -0
  744. package/plugins/claude/skills/game-spine/references/sdk.md +114 -0
  745. package/plugins/claude/skills/game-spine/references/three.md +62 -0
  746. package/plugins/claude/skills/gdd/SKILL.md +116 -0
  747. package/plugins/claude/skills/gdd/references/as-built.md +40 -0
  748. package/plugins/claude/skills/gdd/references/design-measures.md +24 -0
  749. package/plugins/claude/skills/gdd/references/design-note.md +88 -0
  750. package/plugins/claude/skills/gdd/references/experience.md +92 -0
  751. package/plugins/claude/skills/gdd/references/first-look.md +226 -0
  752. package/plugins/claude/skills/gdd/references/floors.md +62 -0
  753. package/plugins/claude/skills/gdd/references/frame.md +75 -0
  754. package/plugins/claude/skills/gdd/references/gameplay-contract.md +81 -0
  755. package/plugins/claude/skills/gdd/references/gdd-template.md +417 -0
  756. package/plugins/claude/skills/gdd/references/genre-card.md +109 -0
  757. package/plugins/claude/skills/gdd/references/genre-platformer.md +159 -0
  758. package/plugins/claude/skills/gdd/references/genre-puzzle.md +145 -0
  759. package/plugins/claude/skills/gdd/references/genre-racing.md +137 -0
  760. package/plugins/claude/skills/gdd/references/genre-rpg.md +125 -0
  761. package/plugins/claude/skills/gdd/references/genre-shooter.md +128 -0
  762. package/plugins/claude/skills/gdd/references/genre-simulation.md +112 -0
  763. package/plugins/claude/skills/gdd/references/genre-strategy.md +116 -0
  764. package/plugins/claude/skills/gdd/references/genre-survival.md +122 -0
  765. package/plugins/claude/skills/gdd/references/in-the-loop.md +106 -0
  766. package/plugins/claude/skills/gdd/references/invent-first.md +131 -0
  767. package/plugins/claude/skills/gdd/references/level-and-fun.md +112 -0
  768. package/plugins/claude/skills/gdd/references/pages.md +47 -0
  769. package/plugins/claude/skills/gdd/references/plan-at-size.md +140 -0
  770. package/plugins/claude/skills/gdd/references/production-tiers.md +117 -0
  771. package/plugins/claude/skills/gdd/references/sections.md +148 -0
  772. package/plugins/claude/skills/gdd/references/spec-folder.md +131 -0
  773. package/plugins/claude/skills/gdd/references/start.md +110 -0
  774. package/plugins/claude/skills/gdd/references/starters.md +175 -0
  775. package/plugins/claude/skills/gdd/references/the-path.md +133 -0
  776. package/plugins/claude/skills/gdd/references/track.md +29 -0
  777. package/plugins/claude/skills/gdd/references/world-and-identity.md +165 -0
  778. package/plugins/claude/skills/gdd/references/worth.md +74 -0
  779. package/plugins/claude/skills/mobile-ui/SKILL.md +107 -0
  780. package/plugins/claude/skills/mobile-ui/references/contrast.md +123 -0
  781. package/plugins/claude/skills/mobile-ui/references/hud-and-title.md +108 -0
  782. package/plugins/claude/skills/mobile-ui/references/hud-genres.md +124 -0
  783. package/plugins/claude/skills/mobile-ui/references/phone-check.md +156 -0
  784. package/plugins/claude/skills/mobile-ui/references/recipes.md +279 -0
  785. package/plugins/claude/skills/mobile-ui/references/restyle-ui.md +229 -0
  786. package/plugins/claude/skills/mobile-ui/references/unity.md +61 -0
  787. package/plugins/claude/skills/publishing/SKILL.md +109 -0
  788. package/plugins/claude/skills/publishing/references/compose.md +113 -0
  789. package/plugins/claude/skills/publishing/references/motion.md +120 -0
  790. package/plugins/claude/skills/publishing/references/networks.md +75 -0
  791. package/plugins/claude/skills/publishing/references/other-hosts.md +65 -0
  792. package/plugins/claude/skills/publishing/references/playable-ad.md +90 -0
  793. package/plugins/claude/skills/publishing/references/server-build.md +85 -0
  794. package/plugins/claude/skills/publishing/references/store-shots.md +85 -0
  795. package/plugins/claude/skills/publishing/references/trailer.md +55 -0
  796. package/plugins/claude/skills/publishing/references/what-ships.md +30 -0
  797. package/plugins/claude/skills/store/SKILL.md +81 -0
  798. package/plugins/claude/skills/store/references/app-store.md +73 -0
  799. package/plugins/claude/skills/store/references/google-play.md +141 -0
  800. package/plugins/claude/skills/store/references/ios-release.md +63 -0
  801. package/plugins/claude/skills/store/references/money.md +66 -0
  802. package/plugins/claude/skills/store/references/purchases-and-review.md +74 -0
  803. package/plugins/claude/skills/store/references/readiness-page.md +24 -0
  804. package/plugins/claude/skills/store/references/readiness.md +107 -0
  805. package/plugins/claude/skills/store/references/steam.md +38 -0
  806. package/plugins/claude/skills/store/references/unity-store.md +55 -0
  807. package/plugins/claude/skills/store/references/web-portals.md +43 -0
  808. package/plugins/claude/skills/unity-game/SKILL.md +103 -0
  809. package/plugins/claude/skills/unity-game/references/agent-ops.md +54 -0
  810. package/plugins/claude/skills/unity-game/references/fixes.md +40 -0
  811. package/plugins/claude/skills/unity-game/references/from-a-web-game.md +108 -0
  812. package/plugins/claude/skills/unity-game/references/handing-off.md +42 -0
  813. package/plugins/claude/skills/unity-game/references/performance.md +59 -0
  814. package/plugins/claude/skills/unity-game/references/probe.md +80 -0
  815. package/plugins/claude/skills/unity-game/references/shared-mac.md +121 -0
  816. package/plugins/claude/skills/unity-game/references/traps.md +108 -0
  817. package/plugins/claude/skills/verifying/SKILL.md +109 -0
  818. package/plugins/claude/skills/verifying/references/actors.md +94 -0
  819. package/plugins/claude/skills/verifying/references/bar.md +62 -0
  820. package/plugins/claude/skills/verifying/references/checks.md +69 -0
  821. package/plugins/claude/skills/verifying/references/experience.md +67 -0
  822. package/plugins/claude/skills/verifying/references/eyes.md +54 -0
  823. package/plugins/claude/skills/verifying/references/fidelity.md +126 -0
  824. package/plugins/claude/skills/verifying/references/hit-bar.md +31 -0
  825. package/plugins/claude/skills/verifying/references/journeys.md +77 -0
  826. package/plugins/claude/skills/verifying/references/mobile-qa.md +123 -0
  827. package/plugins/claude/skills/verifying/references/playtest.md +161 -0
  828. package/plugins/claude/skills/verifying/references/review.md +105 -0
  829. package/plugins/claude/skills/verifying/references/rubric.md +67 -0
  830. package/plugins/claude/skills/verifying/references/scenes.md +49 -0
  831. package/plugins/claude/skills/verifying/references/unity.md +60 -0
  832. package/plugins/claude/skills/world-and-story/SKILL.md +99 -0
  833. package/plugins/claude/skills/world-and-story/references/atmosphere.md +208 -0
  834. package/plugins/claude/skills/world-and-story/references/forged-world.md +79 -0
  835. package/plugins/claude/skills/world-and-story/references/living-world.md +237 -0
  836. package/plugins/claude/skills/world-and-story/references/opening-and-chapters.md +215 -0
  837. package/plugins/claude/skills/world-and-story/references/shelf.md +80 -0
  838. package/plugins/claude/skills/world-and-story/references/story-at-size.md +159 -0
  839. package/plugins/claude/skills/world-and-story/references/voice.md +175 -0
  840. package/plugins/claude/skills/world-and-story/references/world-kit.md +154 -0
  841. package/plugins/codex/.codex-plugin/plugin.json +27 -0
  842. package/plugins/codex/.mcp.json +7 -0
  843. package/plugins/codex/AGENTS.md +135 -0
  844. package/plugins/codex/LICENSE +115 -0
  845. package/plugins/codex/README.md +17 -0
  846. package/plugins/codex/THIRD_PARTY_NOTICES.md +75 -0
  847. package/plugins/codex/hooks/brief.md +135 -0
  848. package/plugins/codex/hooks/codex-critic.mjs +15 -0
  849. package/plugins/codex/hooks/critic-receipts.mjs +86 -0
  850. package/plugins/codex/hooks/durable.mjs +56 -0
  851. package/plugins/codex/hooks/fence.mjs +30 -0
  852. package/plugins/codex/hooks/floors.mjs +181 -0
  853. package/plugins/codex/hooks/flow.mjs +154 -0
  854. package/plugins/codex/hooks/front-door.mjs +68 -0
  855. package/plugins/codex/hooks/guidance.json +3 -0
  856. package/plugins/codex/hooks/hints.mjs +183 -0
  857. package/plugins/codex/hooks/hooks.json +59 -0
  858. package/plugins/codex/hooks/host.md +54 -0
  859. package/plugins/codex/hooks/lib.mjs +362 -0
  860. package/plugins/codex/hooks/memory.mjs +92 -0
  861. package/plugins/codex/hooks/mobile-qa.mjs +43 -0
  862. package/plugins/codex/hooks/note.mjs +63 -0
  863. package/plugins/codex/hooks/nudge.mjs +98 -0
  864. package/plugins/codex/hooks/pipeline.mjs +207 -0
  865. package/plugins/codex/hooks/prompt.mjs +51 -0
  866. package/plugins/codex/hooks/quality.mjs +310 -0
  867. package/plugins/codex/hooks/reach.mjs +93 -0
  868. package/plugins/codex/hooks/scope.mjs +44 -0
  869. package/plugins/codex/hooks/session-log.mjs +101 -0
  870. package/plugins/codex/hooks/session-start.mjs +194 -0
  871. package/plugins/codex/hooks/stop-gate.mjs +303 -0
  872. package/plugins/codex/hooks/vendor/direct/round.mjs +81 -0
  873. package/plugins/codex/hooks/vendor/find/names.mjs +46 -0
  874. package/plugins/codex/hooks/vendor/firstlook/set.mjs +219 -0
  875. package/plugins/codex/hooks/vendor/flow/flow.mjs +456 -0
  876. package/plugins/codex/hooks/vendor/flow/look.mjs +140 -0
  877. package/plugins/codex/hooks/vendor/gdd/book.mjs +484 -0
  878. package/plugins/codex/hooks/vendor/gdd/chapters.mjs +72 -0
  879. package/plugins/codex/hooks/vendor/gdd/doc.mjs +33 -0
  880. package/plugins/codex/hooks/vendor/gdd/levelmap.mjs +429 -0
  881. package/plugins/codex/hooks/vendor/gdd/rubric.mjs +251 -0
  882. package/plugins/codex/hooks/vendor/gdd/worth.mjs +508 -0
  883. package/plugins/codex/hooks/vendor/lanes/fence.mjs +109 -0
  884. package/plugins/codex/hooks/vendor/lanes/lanes.mjs +356 -0
  885. package/plugins/codex/hooks/vendor/lanes/union.mjs +63 -0
  886. package/plugins/codex/hooks/vendor/lessons/motifs.mjs +98 -0
  887. package/plugins/codex/hooks/vendor/lessons/store.mjs +57 -0
  888. package/plugins/codex/hooks/vendor/look/made-of.mjs +243 -0
  889. package/plugins/codex/hooks/vendor/look/roles.mjs +110 -0
  890. package/plugins/codex/hooks/vendor/memory/decisions.mjs +139 -0
  891. package/plugins/codex/hooks/vendor/memory/journal.mjs +109 -0
  892. package/plugins/codex/hooks/vendor/owner/bar.mjs +286 -0
  893. package/plugins/codex/hooks/vendor/pipeline/pipeline.mjs +930 -0
  894. package/plugins/codex/hooks/vendor/playtest/keep.mjs +111 -0
  895. package/plugins/codex/hooks/vendor/playtest/stuck.mjs +48 -0
  896. package/plugins/codex/hooks/vendor/progress/holds.mjs +107 -0
  897. package/plugins/codex/hooks/vendor/progress/progress.mjs +301 -0
  898. package/plugins/codex/hooks/vendor/sim/judge.mjs +241 -0
  899. package/plugins/codex/hooks/vendor/spec/rooms.mjs +189 -0
  900. package/plugins/codex/hooks/vendor/spec/tunables.mjs +75 -0
  901. package/plugins/codex/hooks/vendor/stage/harnessignore.mjs +91 -0
  902. package/plugins/codex/hooks/vendor/stage/stage.mjs +58 -0
  903. package/plugins/codex/hooks/vendor/status/board.mjs +173 -0
  904. package/plugins/codex/hooks/vendor/status/file.mjs +113 -0
  905. package/plugins/codex/hooks/vendor/studio/forks.mjs +94 -0
  906. package/plugins/codex/hooks/vendor/studio/pitch.mjs +295 -0
  907. package/plugins/codex/hooks/vendor/verify/fingerprint.mjs +73 -0
  908. package/plugins/codex/hooks/vendor/verify/reads.mjs +33 -0
  909. package/plugins/codex/hooks/vendor/wow/picks.mjs +75 -0
  910. package/plugins/codex/mcp.json +9 -0
  911. package/plugins/codex/plugin.json +26 -0
  912. package/plugins/codex/skills/fp-art-director/SKILL.md +58 -0
  913. package/plugins/codex/skills/fp-art-director/agents/openai.yaml +12 -0
  914. package/plugins/codex/skills/fp-art-director/references/codex.md +54 -0
  915. package/plugins/codex/skills/fp-audio-director/SKILL.md +55 -0
  916. package/plugins/codex/skills/fp-audio-director/agents/openai.yaml +12 -0
  917. package/plugins/codex/skills/fp-audio-director/references/codex.md +54 -0
  918. package/plugins/codex/skills/fp-critic/SKILL.md +117 -0
  919. package/plugins/codex/skills/fp-critic/agents/openai.yaml +12 -0
  920. package/plugins/codex/skills/fp-critic/references/codex.md +54 -0
  921. package/plugins/codex/skills/fp-first-look/SKILL.md +59 -0
  922. package/plugins/codex/skills/fp-first-look/agents/openai.yaml +12 -0
  923. package/plugins/codex/skills/fp-flow/SKILL.md +50 -0
  924. package/plugins/codex/skills/fp-flow/agents/openai.yaml +12 -0
  925. package/plugins/codex/skills/fp-lane/SKILL.md +41 -0
  926. package/plugins/codex/skills/fp-lane/agents/openai.yaml +12 -0
  927. package/plugins/codex/skills/fp-lane/references/codex.md +54 -0
  928. package/plugins/codex/skills/fp-lanes/SKILL.md +38 -0
  929. package/plugins/codex/skills/fp-lanes/agents/openai.yaml +12 -0
  930. package/plugins/codex/skills/fp-level-designer/SKILL.md +49 -0
  931. package/plugins/codex/skills/fp-level-designer/agents/openai.yaml +12 -0
  932. package/plugins/codex/skills/fp-level-designer/references/codex.md +54 -0
  933. package/plugins/codex/skills/fp-mobile-qa/SKILL.md +28 -0
  934. package/plugins/codex/skills/fp-mobile-qa/agents/openai.yaml +12 -0
  935. package/plugins/codex/skills/fp-mobile-qa-seat/SKILL.md +74 -0
  936. package/plugins/codex/skills/fp-mobile-qa-seat/agents/openai.yaml +12 -0
  937. package/plugins/codex/skills/fp-mobile-qa-seat/references/codex.md +54 -0
  938. package/plugins/codex/skills/fp-new/SKILL.md +94 -0
  939. package/plugins/codex/skills/fp-new/agents/openai.yaml +12 -0
  940. package/plugins/codex/skills/fp-player/SKILL.md +147 -0
  941. package/plugins/codex/skills/fp-player/agents/openai.yaml +12 -0
  942. package/plugins/codex/skills/fp-player/references/codex.md +54 -0
  943. package/plugins/codex/skills/fp-playtest/SKILL.md +66 -0
  944. package/plugins/codex/skills/fp-playtest/agents/openai.yaml +12 -0
  945. package/plugins/codex/skills/fp-publish/SKILL.md +23 -0
  946. package/plugins/codex/skills/fp-publish/agents/openai.yaml +12 -0
  947. package/plugins/codex/skills/fp-qa-lead/SKILL.md +56 -0
  948. package/plugins/codex/skills/fp-qa-lead/agents/openai.yaml +12 -0
  949. package/plugins/codex/skills/fp-qa-lead/references/codex.md +54 -0
  950. package/plugins/codex/skills/fp-smoke-build/SKILL.md +25 -0
  951. package/plugins/codex/skills/fp-smoke-build/agents/openai.yaml +12 -0
  952. package/plugins/codex/skills/fp-studio/SKILL.md +59 -0
  953. package/plugins/codex/skills/fp-studio/agents/openai.yaml +12 -0
  954. package/plugins/codex/skills/fp-verify/SKILL.md +20 -0
  955. package/plugins/codex/skills/fp-verify/agents/openai.yaml +12 -0
  956. package/plugins/codex/skills/funpixel-3d/SKILL.md +89 -0
  957. package/plugins/codex/skills/funpixel-3d/agents/openai.yaml +12 -0
  958. package/plugins/codex/skills/funpixel-3d/references/bake-off.md +48 -0
  959. package/plugins/codex/skills/funpixel-3d/references/bench.md +103 -0
  960. package/plugins/codex/skills/funpixel-3d/references/budgets.md +48 -0
  961. package/plugins/codex/skills/funpixel-3d/references/characters.md +67 -0
  962. package/plugins/codex/skills/funpixel-3d/references/concept-image.md +47 -0
  963. package/plugins/codex/skills/funpixel-3d/references/engine-targets.md +31 -0
  964. package/plugins/codex/skills/funpixel-3d/references/hero-route.md +104 -0
  965. package/plugins/codex/skills/funpixel-3d/references/level-spec.md +109 -0
  966. package/plugins/codex/skills/funpixel-3d/references/levels.md +84 -0
  967. package/plugins/codex/skills/funpixel-3d/references/light-and-places.md +141 -0
  968. package/plugins/codex/skills/funpixel-3d/references/models.md +111 -0
  969. package/plugins/codex/skills/funpixel-3d/references/painted-target.md +184 -0
  970. package/plugins/codex/skills/funpixel-3d/references/reading.md +41 -0
  971. package/plugins/codex/skills/funpixel-3d/references/skin.md +85 -0
  972. package/plugins/codex/skills/funpixel-3d/references/skyboxes.md +65 -0
  973. package/plugins/codex/skills/funpixel-3d/references/textures.md +71 -0
  974. package/plugins/codex/skills/funpixel-3d/references/three-loading.md +199 -0
  975. package/plugins/codex/skills/funpixel-3d/references/unity.md +78 -0
  976. package/plugins/codex/skills/funpixel-art/SKILL.md +104 -0
  977. package/plugins/codex/skills/funpixel-art/agents/openai.yaml +12 -0
  978. package/plugins/codex/skills/funpixel-art/references/2d-assets.md +108 -0
  979. package/plugins/codex/skills/funpixel-art/references/animation.md +126 -0
  980. package/plugins/codex/skills/funpixel-art/references/cast.md +73 -0
  981. package/plugins/codex/skills/funpixel-art/references/characters.md +49 -0
  982. package/plugins/codex/skills/funpixel-art/references/cost.md +107 -0
  983. package/plugins/codex/skills/funpixel-art/references/effects.md +85 -0
  984. package/plugins/codex/skills/funpixel-art/references/frames.md +87 -0
  985. package/plugins/codex/skills/funpixel-art/references/judging-frames.md +64 -0
  986. package/plugins/codex/skills/funpixel-art/references/look.md +102 -0
  987. package/plugins/codex/skills/funpixel-art/references/measure.md +119 -0
  988. package/plugins/codex/skills/funpixel-art/references/pipeline.md +185 -0
  989. package/plugins/codex/skills/funpixel-art/references/pixi.md +277 -0
  990. package/plugins/codex/skills/funpixel-art/references/planes.md +27 -0
  991. package/plugins/codex/skills/funpixel-art/references/prompts.md +171 -0
  992. package/plugins/codex/skills/funpixel-art/references/sheets.md +141 -0
  993. package/plugins/codex/skills/funpixel-art/references/style-file.md +39 -0
  994. package/plugins/codex/skills/funpixel-art/references/three.md +232 -0
  995. package/plugins/codex/skills/funpixel-art/references/ui.md +163 -0
  996. package/plugins/codex/skills/funpixel-art/references/unity.md +78 -0
  997. package/plugins/codex/skills/funpixel-art/references/wiring.md +41 -0
  998. package/plugins/codex/skills/funpixel-audio/SKILL.md +92 -0
  999. package/plugins/codex/skills/funpixel-audio/agents/openai.yaml +12 -0
  1000. package/plugins/codex/skills/funpixel-audio/references/adaptive-music.md +204 -0
  1001. package/plugins/codex/skills/funpixel-audio/references/engine.md +78 -0
  1002. package/plugins/codex/skills/funpixel-audio/references/measure.md +101 -0
  1003. package/plugins/codex/skills/funpixel-audio/references/unity.md +74 -0
  1004. package/plugins/codex/skills/funpixel-feedback/SKILL.md +120 -0
  1005. package/plugins/codex/skills/funpixel-feedback/agents/openai.yaml +12 -0
  1006. package/plugins/codex/skills/funpixel-feedback/references/memory.md +99 -0
  1007. package/plugins/codex/skills/funpixel-game-feel/SKILL.md +104 -0
  1008. package/plugins/codex/skills/funpixel-game-feel/agents/openai.yaml +12 -0
  1009. package/plugins/codex/skills/funpixel-game-feel/references/contact.md +110 -0
  1010. package/plugins/codex/skills/funpixel-game-feel/references/measure.md +125 -0
  1011. package/plugins/codex/skills/funpixel-game-feel/references/motion.md +134 -0
  1012. package/plugins/codex/skills/funpixel-game-feel/references/payoffs.md +35 -0
  1013. package/plugins/codex/skills/funpixel-game-feel/references/recipes.md +107 -0
  1014. package/plugins/codex/skills/funpixel-game-feel/references/unity.md +73 -0
  1015. package/plugins/codex/skills/funpixel-game-logic/SKILL.md +113 -0
  1016. package/plugins/codex/skills/funpixel-game-logic/agents/openai.yaml +12 -0
  1017. package/plugins/codex/skills/funpixel-game-logic/references/balance.md +88 -0
  1018. package/plugins/codex/skills/funpixel-game-logic/references/content-at-scale.md +147 -0
  1019. package/plugins/codex/skills/funpixel-game-logic/references/depth.md +89 -0
  1020. package/plugins/codex/skills/funpixel-game-logic/references/escalation.md +41 -0
  1021. package/plugins/codex/skills/funpixel-game-logic/references/levels.md +61 -0
  1022. package/plugins/codex/skills/funpixel-game-logic/references/probes.md +122 -0
  1023. package/plugins/codex/skills/funpixel-game-logic/references/unity.md +108 -0
  1024. package/plugins/codex/skills/funpixel-game-spine/SKILL.md +118 -0
  1025. package/plugins/codex/skills/funpixel-game-spine/agents/openai.yaml +12 -0
  1026. package/plugins/codex/skills/funpixel-game-spine/references/camera.md +94 -0
  1027. package/plugins/codex/skills/funpixel-game-spine/references/multiplayer.md +101 -0
  1028. package/plugins/codex/skills/funpixel-game-spine/references/patterns.md +103 -0
  1029. package/plugins/codex/skills/funpixel-game-spine/references/performance.md +96 -0
  1030. package/plugins/codex/skills/funpixel-game-spine/references/pixi.md +26 -0
  1031. package/plugins/codex/skills/funpixel-game-spine/references/replay.md +102 -0
  1032. package/plugins/codex/skills/funpixel-game-spine/references/room-api.md +63 -0
  1033. package/plugins/codex/skills/funpixel-game-spine/references/room-modes.md +40 -0
  1034. package/plugins/codex/skills/funpixel-game-spine/references/sdk.md +114 -0
  1035. package/plugins/codex/skills/funpixel-game-spine/references/three.md +62 -0
  1036. package/plugins/codex/skills/funpixel-gdd/SKILL.md +116 -0
  1037. package/plugins/codex/skills/funpixel-gdd/agents/openai.yaml +12 -0
  1038. package/plugins/codex/skills/funpixel-gdd/references/as-built.md +40 -0
  1039. package/plugins/codex/skills/funpixel-gdd/references/design-measures.md +24 -0
  1040. package/plugins/codex/skills/funpixel-gdd/references/design-note.md +88 -0
  1041. package/plugins/codex/skills/funpixel-gdd/references/experience.md +92 -0
  1042. package/plugins/codex/skills/funpixel-gdd/references/first-look.md +226 -0
  1043. package/plugins/codex/skills/funpixel-gdd/references/floors.md +62 -0
  1044. package/plugins/codex/skills/funpixel-gdd/references/frame.md +75 -0
  1045. package/plugins/codex/skills/funpixel-gdd/references/gameplay-contract.md +81 -0
  1046. package/plugins/codex/skills/funpixel-gdd/references/gdd-template.md +417 -0
  1047. package/plugins/codex/skills/funpixel-gdd/references/genre-card.md +109 -0
  1048. package/plugins/codex/skills/funpixel-gdd/references/genre-platformer.md +159 -0
  1049. package/plugins/codex/skills/funpixel-gdd/references/genre-puzzle.md +145 -0
  1050. package/plugins/codex/skills/funpixel-gdd/references/genre-racing.md +137 -0
  1051. package/plugins/codex/skills/funpixel-gdd/references/genre-rpg.md +125 -0
  1052. package/plugins/codex/skills/funpixel-gdd/references/genre-shooter.md +128 -0
  1053. package/plugins/codex/skills/funpixel-gdd/references/genre-simulation.md +112 -0
  1054. package/plugins/codex/skills/funpixel-gdd/references/genre-strategy.md +116 -0
  1055. package/plugins/codex/skills/funpixel-gdd/references/genre-survival.md +122 -0
  1056. package/plugins/codex/skills/funpixel-gdd/references/in-the-loop.md +106 -0
  1057. package/plugins/codex/skills/funpixel-gdd/references/invent-first.md +131 -0
  1058. package/plugins/codex/skills/funpixel-gdd/references/level-and-fun.md +112 -0
  1059. package/plugins/codex/skills/funpixel-gdd/references/pages.md +47 -0
  1060. package/plugins/codex/skills/funpixel-gdd/references/plan-at-size.md +140 -0
  1061. package/plugins/codex/skills/funpixel-gdd/references/production-tiers.md +117 -0
  1062. package/plugins/codex/skills/funpixel-gdd/references/sections.md +148 -0
  1063. package/plugins/codex/skills/funpixel-gdd/references/spec-folder.md +131 -0
  1064. package/plugins/codex/skills/funpixel-gdd/references/start.md +110 -0
  1065. package/plugins/codex/skills/funpixel-gdd/references/starters.md +175 -0
  1066. package/plugins/codex/skills/funpixel-gdd/references/the-path.md +133 -0
  1067. package/plugins/codex/skills/funpixel-gdd/references/track.md +29 -0
  1068. package/plugins/codex/skills/funpixel-gdd/references/world-and-identity.md +165 -0
  1069. package/plugins/codex/skills/funpixel-gdd/references/worth.md +74 -0
  1070. package/plugins/codex/skills/funpixel-mobile-ui/SKILL.md +107 -0
  1071. package/plugins/codex/skills/funpixel-mobile-ui/agents/openai.yaml +12 -0
  1072. package/plugins/codex/skills/funpixel-mobile-ui/references/contrast.md +123 -0
  1073. package/plugins/codex/skills/funpixel-mobile-ui/references/hud-and-title.md +108 -0
  1074. package/plugins/codex/skills/funpixel-mobile-ui/references/hud-genres.md +124 -0
  1075. package/plugins/codex/skills/funpixel-mobile-ui/references/phone-check.md +156 -0
  1076. package/plugins/codex/skills/funpixel-mobile-ui/references/recipes.md +279 -0
  1077. package/plugins/codex/skills/funpixel-mobile-ui/references/restyle-ui.md +229 -0
  1078. package/plugins/codex/skills/funpixel-mobile-ui/references/unity.md +61 -0
  1079. package/plugins/codex/skills/funpixel-publish/SKILL.md +109 -0
  1080. package/plugins/codex/skills/funpixel-publish/agents/openai.yaml +12 -0
  1081. package/plugins/codex/skills/funpixel-publish/references/compose.md +113 -0
  1082. package/plugins/codex/skills/funpixel-publish/references/motion.md +120 -0
  1083. package/plugins/codex/skills/funpixel-publish/references/networks.md +75 -0
  1084. package/plugins/codex/skills/funpixel-publish/references/other-hosts.md +65 -0
  1085. package/plugins/codex/skills/funpixel-publish/references/playable-ad.md +90 -0
  1086. package/plugins/codex/skills/funpixel-publish/references/server-build.md +85 -0
  1087. package/plugins/codex/skills/funpixel-publish/references/store-shots.md +85 -0
  1088. package/plugins/codex/skills/funpixel-publish/references/trailer.md +55 -0
  1089. package/plugins/codex/skills/funpixel-publish/references/what-ships.md +30 -0
  1090. package/plugins/codex/skills/funpixel-store/SKILL.md +81 -0
  1091. package/plugins/codex/skills/funpixel-store/agents/openai.yaml +12 -0
  1092. package/plugins/codex/skills/funpixel-store/references/app-store.md +73 -0
  1093. package/plugins/codex/skills/funpixel-store/references/google-play.md +141 -0
  1094. package/plugins/codex/skills/funpixel-store/references/ios-release.md +63 -0
  1095. package/plugins/codex/skills/funpixel-store/references/money.md +66 -0
  1096. package/plugins/codex/skills/funpixel-store/references/purchases-and-review.md +74 -0
  1097. package/plugins/codex/skills/funpixel-store/references/readiness-page.md +24 -0
  1098. package/plugins/codex/skills/funpixel-store/references/readiness.md +107 -0
  1099. package/plugins/codex/skills/funpixel-store/references/steam.md +38 -0
  1100. package/plugins/codex/skills/funpixel-store/references/unity-store.md +55 -0
  1101. package/plugins/codex/skills/funpixel-store/references/web-portals.md +43 -0
  1102. package/plugins/codex/skills/funpixel-unity-game/SKILL.md +103 -0
  1103. package/plugins/codex/skills/funpixel-unity-game/agents/openai.yaml +12 -0
  1104. package/plugins/codex/skills/funpixel-unity-game/references/agent-ops.md +54 -0
  1105. package/plugins/codex/skills/funpixel-unity-game/references/fixes.md +40 -0
  1106. package/plugins/codex/skills/funpixel-unity-game/references/from-a-web-game.md +108 -0
  1107. package/plugins/codex/skills/funpixel-unity-game/references/handing-off.md +42 -0
  1108. package/plugins/codex/skills/funpixel-unity-game/references/performance.md +59 -0
  1109. package/plugins/codex/skills/funpixel-unity-game/references/probe.md +80 -0
  1110. package/plugins/codex/skills/funpixel-unity-game/references/shared-mac.md +121 -0
  1111. package/plugins/codex/skills/funpixel-unity-game/references/traps.md +108 -0
  1112. package/plugins/codex/skills/funpixel-verify/SKILL.md +109 -0
  1113. package/plugins/codex/skills/funpixel-verify/agents/openai.yaml +12 -0
  1114. package/plugins/codex/skills/funpixel-verify/references/actors.md +94 -0
  1115. package/plugins/codex/skills/funpixel-verify/references/bar.md +62 -0
  1116. package/plugins/codex/skills/funpixel-verify/references/checks.md +69 -0
  1117. package/plugins/codex/skills/funpixel-verify/references/experience.md +67 -0
  1118. package/plugins/codex/skills/funpixel-verify/references/eyes.md +54 -0
  1119. package/plugins/codex/skills/funpixel-verify/references/fidelity.md +126 -0
  1120. package/plugins/codex/skills/funpixel-verify/references/hit-bar.md +31 -0
  1121. package/plugins/codex/skills/funpixel-verify/references/journeys.md +77 -0
  1122. package/plugins/codex/skills/funpixel-verify/references/mobile-qa.md +123 -0
  1123. package/plugins/codex/skills/funpixel-verify/references/playtest.md +161 -0
  1124. package/plugins/codex/skills/funpixel-verify/references/review.md +105 -0
  1125. package/plugins/codex/skills/funpixel-verify/references/rubric.md +67 -0
  1126. package/plugins/codex/skills/funpixel-verify/references/scenes.md +49 -0
  1127. package/plugins/codex/skills/funpixel-verify/references/unity.md +60 -0
  1128. package/plugins/codex/skills/funpixel-world-and-story/SKILL.md +99 -0
  1129. package/plugins/codex/skills/funpixel-world-and-story/agents/openai.yaml +12 -0
  1130. package/plugins/codex/skills/funpixel-world-and-story/references/atmosphere.md +208 -0
  1131. package/plugins/codex/skills/funpixel-world-and-story/references/forged-world.md +79 -0
  1132. package/plugins/codex/skills/funpixel-world-and-story/references/living-world.md +237 -0
  1133. package/plugins/codex/skills/funpixel-world-and-story/references/opening-and-chapters.md +215 -0
  1134. package/plugins/codex/skills/funpixel-world-and-story/references/shelf.md +80 -0
  1135. package/plugins/codex/skills/funpixel-world-and-story/references/story-at-size.md +159 -0
  1136. package/plugins/codex/skills/funpixel-world-and-story/references/voice.md +175 -0
  1137. package/plugins/codex/skills/funpixel-world-and-story/references/world-kit.md +154 -0
  1138. package/plugins/cursor/.cursor-plugin/plugin.json +26 -0
  1139. package/plugins/cursor/LICENSE +115 -0
  1140. package/plugins/cursor/README.md +13 -0
  1141. package/plugins/cursor/THIRD_PARTY_NOTICES.md +75 -0
  1142. package/plugins/cursor/agents/art-director.md +54 -0
  1143. package/plugins/cursor/agents/audio-director.md +51 -0
  1144. package/plugins/cursor/agents/critic.md +113 -0
  1145. package/plugins/cursor/agents/lane.md +37 -0
  1146. package/plugins/cursor/agents/level-designer.md +45 -0
  1147. package/plugins/cursor/agents/mobile-qa.md +70 -0
  1148. package/plugins/cursor/agents/player.md +143 -0
  1149. package/plugins/cursor/agents/qa-lead.md +52 -0
  1150. package/plugins/cursor/commands/first-look.md +59 -0
  1151. package/plugins/cursor/commands/flow.md +50 -0
  1152. package/plugins/cursor/commands/lanes.md +38 -0
  1153. package/plugins/cursor/commands/mobile-qa.md +28 -0
  1154. package/plugins/cursor/commands/new.md +94 -0
  1155. package/plugins/cursor/commands/playtest.md +66 -0
  1156. package/plugins/cursor/commands/publish.md +23 -0
  1157. package/plugins/cursor/commands/smoke-build.md +25 -0
  1158. package/plugins/cursor/commands/verify.md +20 -0
  1159. package/plugins/cursor/hooks/brief.md +135 -0
  1160. package/plugins/cursor/hooks/critic-receipts.mjs +86 -0
  1161. package/plugins/cursor/hooks/durable.mjs +56 -0
  1162. package/plugins/cursor/hooks/fence.mjs +30 -0
  1163. package/plugins/cursor/hooks/floors.mjs +181 -0
  1164. package/plugins/cursor/hooks/flow.mjs +154 -0
  1165. package/plugins/cursor/hooks/front-door.mjs +68 -0
  1166. package/plugins/cursor/hooks/guidance.json +3 -0
  1167. package/plugins/cursor/hooks/hints.mjs +183 -0
  1168. package/plugins/cursor/hooks/hooks.json +26 -0
  1169. package/plugins/cursor/hooks/lib.mjs +362 -0
  1170. package/plugins/cursor/hooks/memory.mjs +92 -0
  1171. package/plugins/cursor/hooks/mobile-qa.mjs +43 -0
  1172. package/plugins/cursor/hooks/note.mjs +63 -0
  1173. package/plugins/cursor/hooks/nudge.mjs +98 -0
  1174. package/plugins/cursor/hooks/pipeline.mjs +207 -0
  1175. package/plugins/cursor/hooks/prompt.mjs +51 -0
  1176. package/plugins/cursor/hooks/quality.mjs +310 -0
  1177. package/plugins/cursor/hooks/reach.mjs +93 -0
  1178. package/plugins/cursor/hooks/scope.mjs +44 -0
  1179. package/plugins/cursor/hooks/session-log.mjs +101 -0
  1180. package/plugins/cursor/hooks/session-start.mjs +194 -0
  1181. package/plugins/cursor/hooks/stop-gate.mjs +303 -0
  1182. package/plugins/cursor/hooks/vendor/direct/round.mjs +81 -0
  1183. package/plugins/cursor/hooks/vendor/find/names.mjs +46 -0
  1184. package/plugins/cursor/hooks/vendor/firstlook/set.mjs +219 -0
  1185. package/plugins/cursor/hooks/vendor/flow/flow.mjs +456 -0
  1186. package/plugins/cursor/hooks/vendor/flow/look.mjs +140 -0
  1187. package/plugins/cursor/hooks/vendor/gdd/book.mjs +484 -0
  1188. package/plugins/cursor/hooks/vendor/gdd/chapters.mjs +72 -0
  1189. package/plugins/cursor/hooks/vendor/gdd/doc.mjs +33 -0
  1190. package/plugins/cursor/hooks/vendor/gdd/levelmap.mjs +429 -0
  1191. package/plugins/cursor/hooks/vendor/gdd/rubric.mjs +251 -0
  1192. package/plugins/cursor/hooks/vendor/gdd/worth.mjs +508 -0
  1193. package/plugins/cursor/hooks/vendor/lanes/fence.mjs +109 -0
  1194. package/plugins/cursor/hooks/vendor/lanes/lanes.mjs +356 -0
  1195. package/plugins/cursor/hooks/vendor/lanes/union.mjs +63 -0
  1196. package/plugins/cursor/hooks/vendor/lessons/motifs.mjs +98 -0
  1197. package/plugins/cursor/hooks/vendor/lessons/store.mjs +57 -0
  1198. package/plugins/cursor/hooks/vendor/look/made-of.mjs +243 -0
  1199. package/plugins/cursor/hooks/vendor/look/roles.mjs +110 -0
  1200. package/plugins/cursor/hooks/vendor/memory/decisions.mjs +139 -0
  1201. package/plugins/cursor/hooks/vendor/memory/journal.mjs +109 -0
  1202. package/plugins/cursor/hooks/vendor/owner/bar.mjs +286 -0
  1203. package/plugins/cursor/hooks/vendor/pipeline/pipeline.mjs +930 -0
  1204. package/plugins/cursor/hooks/vendor/playtest/keep.mjs +111 -0
  1205. package/plugins/cursor/hooks/vendor/playtest/stuck.mjs +48 -0
  1206. package/plugins/cursor/hooks/vendor/progress/holds.mjs +107 -0
  1207. package/plugins/cursor/hooks/vendor/progress/progress.mjs +301 -0
  1208. package/plugins/cursor/hooks/vendor/sim/judge.mjs +241 -0
  1209. package/plugins/cursor/hooks/vendor/spec/rooms.mjs +189 -0
  1210. package/plugins/cursor/hooks/vendor/spec/tunables.mjs +75 -0
  1211. package/plugins/cursor/hooks/vendor/stage/harnessignore.mjs +91 -0
  1212. package/plugins/cursor/hooks/vendor/stage/stage.mjs +58 -0
  1213. package/plugins/cursor/hooks/vendor/status/board.mjs +173 -0
  1214. package/plugins/cursor/hooks/vendor/status/file.mjs +113 -0
  1215. package/plugins/cursor/hooks/vendor/studio/forks.mjs +94 -0
  1216. package/plugins/cursor/hooks/vendor/studio/pitch.mjs +295 -0
  1217. package/plugins/cursor/hooks/vendor/verify/fingerprint.mjs +73 -0
  1218. package/plugins/cursor/hooks/vendor/verify/reads.mjs +33 -0
  1219. package/plugins/cursor/hooks/vendor/wow/picks.mjs +75 -0
  1220. package/plugins/cursor/mcp.json +10 -0
  1221. package/plugins/cursor/rules/funpixel-brief.mdc +141 -0
  1222. package/plugins/cursor/skills/funpixel-3d/SKILL.md +89 -0
  1223. package/plugins/cursor/skills/funpixel-3d/references/bake-off.md +48 -0
  1224. package/plugins/cursor/skills/funpixel-3d/references/bench.md +103 -0
  1225. package/plugins/cursor/skills/funpixel-3d/references/budgets.md +48 -0
  1226. package/plugins/cursor/skills/funpixel-3d/references/characters.md +67 -0
  1227. package/plugins/cursor/skills/funpixel-3d/references/concept-image.md +47 -0
  1228. package/plugins/cursor/skills/funpixel-3d/references/engine-targets.md +31 -0
  1229. package/plugins/cursor/skills/funpixel-3d/references/hero-route.md +104 -0
  1230. package/plugins/cursor/skills/funpixel-3d/references/level-spec.md +109 -0
  1231. package/plugins/cursor/skills/funpixel-3d/references/levels.md +84 -0
  1232. package/plugins/cursor/skills/funpixel-3d/references/light-and-places.md +141 -0
  1233. package/plugins/cursor/skills/funpixel-3d/references/models.md +111 -0
  1234. package/plugins/cursor/skills/funpixel-3d/references/painted-target.md +184 -0
  1235. package/plugins/cursor/skills/funpixel-3d/references/reading.md +41 -0
  1236. package/plugins/cursor/skills/funpixel-3d/references/skin.md +85 -0
  1237. package/plugins/cursor/skills/funpixel-3d/references/skyboxes.md +65 -0
  1238. package/plugins/cursor/skills/funpixel-3d/references/textures.md +71 -0
  1239. package/plugins/cursor/skills/funpixel-3d/references/three-loading.md +199 -0
  1240. package/plugins/cursor/skills/funpixel-3d/references/unity.md +78 -0
  1241. package/plugins/cursor/skills/funpixel-art/SKILL.md +104 -0
  1242. package/plugins/cursor/skills/funpixel-art/references/2d-assets.md +108 -0
  1243. package/plugins/cursor/skills/funpixel-art/references/animation.md +126 -0
  1244. package/plugins/cursor/skills/funpixel-art/references/cast.md +73 -0
  1245. package/plugins/cursor/skills/funpixel-art/references/characters.md +49 -0
  1246. package/plugins/cursor/skills/funpixel-art/references/cost.md +107 -0
  1247. package/plugins/cursor/skills/funpixel-art/references/effects.md +85 -0
  1248. package/plugins/cursor/skills/funpixel-art/references/frames.md +87 -0
  1249. package/plugins/cursor/skills/funpixel-art/references/judging-frames.md +64 -0
  1250. package/plugins/cursor/skills/funpixel-art/references/look.md +102 -0
  1251. package/plugins/cursor/skills/funpixel-art/references/measure.md +119 -0
  1252. package/plugins/cursor/skills/funpixel-art/references/pipeline.md +185 -0
  1253. package/plugins/cursor/skills/funpixel-art/references/pixi.md +277 -0
  1254. package/plugins/cursor/skills/funpixel-art/references/planes.md +27 -0
  1255. package/plugins/cursor/skills/funpixel-art/references/prompts.md +171 -0
  1256. package/plugins/cursor/skills/funpixel-art/references/sheets.md +141 -0
  1257. package/plugins/cursor/skills/funpixel-art/references/style-file.md +39 -0
  1258. package/plugins/cursor/skills/funpixel-art/references/three.md +232 -0
  1259. package/plugins/cursor/skills/funpixel-art/references/ui.md +163 -0
  1260. package/plugins/cursor/skills/funpixel-art/references/unity.md +78 -0
  1261. package/plugins/cursor/skills/funpixel-art/references/wiring.md +41 -0
  1262. package/plugins/cursor/skills/funpixel-audio/SKILL.md +92 -0
  1263. package/plugins/cursor/skills/funpixel-audio/references/adaptive-music.md +204 -0
  1264. package/plugins/cursor/skills/funpixel-audio/references/engine.md +78 -0
  1265. package/plugins/cursor/skills/funpixel-audio/references/measure.md +101 -0
  1266. package/plugins/cursor/skills/funpixel-audio/references/unity.md +74 -0
  1267. package/plugins/cursor/skills/funpixel-feedback/SKILL.md +120 -0
  1268. package/plugins/cursor/skills/funpixel-feedback/references/memory.md +99 -0
  1269. package/plugins/cursor/skills/funpixel-game-feel/SKILL.md +104 -0
  1270. package/plugins/cursor/skills/funpixel-game-feel/references/contact.md +110 -0
  1271. package/plugins/cursor/skills/funpixel-game-feel/references/measure.md +125 -0
  1272. package/plugins/cursor/skills/funpixel-game-feel/references/motion.md +134 -0
  1273. package/plugins/cursor/skills/funpixel-game-feel/references/payoffs.md +35 -0
  1274. package/plugins/cursor/skills/funpixel-game-feel/references/recipes.md +107 -0
  1275. package/plugins/cursor/skills/funpixel-game-feel/references/unity.md +73 -0
  1276. package/plugins/cursor/skills/funpixel-game-logic/SKILL.md +113 -0
  1277. package/plugins/cursor/skills/funpixel-game-logic/references/balance.md +88 -0
  1278. package/plugins/cursor/skills/funpixel-game-logic/references/content-at-scale.md +147 -0
  1279. package/plugins/cursor/skills/funpixel-game-logic/references/depth.md +89 -0
  1280. package/plugins/cursor/skills/funpixel-game-logic/references/escalation.md +41 -0
  1281. package/plugins/cursor/skills/funpixel-game-logic/references/levels.md +61 -0
  1282. package/plugins/cursor/skills/funpixel-game-logic/references/probes.md +122 -0
  1283. package/plugins/cursor/skills/funpixel-game-logic/references/unity.md +108 -0
  1284. package/plugins/cursor/skills/funpixel-game-spine/SKILL.md +118 -0
  1285. package/plugins/cursor/skills/funpixel-game-spine/references/camera.md +94 -0
  1286. package/plugins/cursor/skills/funpixel-game-spine/references/multiplayer.md +101 -0
  1287. package/plugins/cursor/skills/funpixel-game-spine/references/patterns.md +103 -0
  1288. package/plugins/cursor/skills/funpixel-game-spine/references/performance.md +96 -0
  1289. package/plugins/cursor/skills/funpixel-game-spine/references/pixi.md +26 -0
  1290. package/plugins/cursor/skills/funpixel-game-spine/references/replay.md +102 -0
  1291. package/plugins/cursor/skills/funpixel-game-spine/references/room-api.md +63 -0
  1292. package/plugins/cursor/skills/funpixel-game-spine/references/room-modes.md +40 -0
  1293. package/plugins/cursor/skills/funpixel-game-spine/references/sdk.md +114 -0
  1294. package/plugins/cursor/skills/funpixel-game-spine/references/three.md +62 -0
  1295. package/plugins/cursor/skills/funpixel-gdd/SKILL.md +116 -0
  1296. package/plugins/cursor/skills/funpixel-gdd/references/as-built.md +40 -0
  1297. package/plugins/cursor/skills/funpixel-gdd/references/design-measures.md +24 -0
  1298. package/plugins/cursor/skills/funpixel-gdd/references/design-note.md +88 -0
  1299. package/plugins/cursor/skills/funpixel-gdd/references/experience.md +92 -0
  1300. package/plugins/cursor/skills/funpixel-gdd/references/first-look.md +226 -0
  1301. package/plugins/cursor/skills/funpixel-gdd/references/floors.md +62 -0
  1302. package/plugins/cursor/skills/funpixel-gdd/references/frame.md +75 -0
  1303. package/plugins/cursor/skills/funpixel-gdd/references/gameplay-contract.md +81 -0
  1304. package/plugins/cursor/skills/funpixel-gdd/references/gdd-template.md +417 -0
  1305. package/plugins/cursor/skills/funpixel-gdd/references/genre-card.md +109 -0
  1306. package/plugins/cursor/skills/funpixel-gdd/references/genre-platformer.md +159 -0
  1307. package/plugins/cursor/skills/funpixel-gdd/references/genre-puzzle.md +145 -0
  1308. package/plugins/cursor/skills/funpixel-gdd/references/genre-racing.md +137 -0
  1309. package/plugins/cursor/skills/funpixel-gdd/references/genre-rpg.md +125 -0
  1310. package/plugins/cursor/skills/funpixel-gdd/references/genre-shooter.md +128 -0
  1311. package/plugins/cursor/skills/funpixel-gdd/references/genre-simulation.md +112 -0
  1312. package/plugins/cursor/skills/funpixel-gdd/references/genre-strategy.md +116 -0
  1313. package/plugins/cursor/skills/funpixel-gdd/references/genre-survival.md +122 -0
  1314. package/plugins/cursor/skills/funpixel-gdd/references/in-the-loop.md +106 -0
  1315. package/plugins/cursor/skills/funpixel-gdd/references/invent-first.md +131 -0
  1316. package/plugins/cursor/skills/funpixel-gdd/references/level-and-fun.md +112 -0
  1317. package/plugins/cursor/skills/funpixel-gdd/references/pages.md +47 -0
  1318. package/plugins/cursor/skills/funpixel-gdd/references/plan-at-size.md +140 -0
  1319. package/plugins/cursor/skills/funpixel-gdd/references/production-tiers.md +117 -0
  1320. package/plugins/cursor/skills/funpixel-gdd/references/sections.md +148 -0
  1321. package/plugins/cursor/skills/funpixel-gdd/references/spec-folder.md +131 -0
  1322. package/plugins/cursor/skills/funpixel-gdd/references/start.md +110 -0
  1323. package/plugins/cursor/skills/funpixel-gdd/references/starters.md +175 -0
  1324. package/plugins/cursor/skills/funpixel-gdd/references/the-path.md +133 -0
  1325. package/plugins/cursor/skills/funpixel-gdd/references/track.md +29 -0
  1326. package/plugins/cursor/skills/funpixel-gdd/references/world-and-identity.md +165 -0
  1327. package/plugins/cursor/skills/funpixel-gdd/references/worth.md +74 -0
  1328. package/plugins/cursor/skills/funpixel-mobile-ui/SKILL.md +107 -0
  1329. package/plugins/cursor/skills/funpixel-mobile-ui/references/contrast.md +123 -0
  1330. package/plugins/cursor/skills/funpixel-mobile-ui/references/hud-and-title.md +108 -0
  1331. package/plugins/cursor/skills/funpixel-mobile-ui/references/hud-genres.md +124 -0
  1332. package/plugins/cursor/skills/funpixel-mobile-ui/references/phone-check.md +156 -0
  1333. package/plugins/cursor/skills/funpixel-mobile-ui/references/recipes.md +279 -0
  1334. package/plugins/cursor/skills/funpixel-mobile-ui/references/restyle-ui.md +229 -0
  1335. package/plugins/cursor/skills/funpixel-mobile-ui/references/unity.md +61 -0
  1336. package/plugins/cursor/skills/funpixel-publish/SKILL.md +109 -0
  1337. package/plugins/cursor/skills/funpixel-publish/references/compose.md +113 -0
  1338. package/plugins/cursor/skills/funpixel-publish/references/motion.md +120 -0
  1339. package/plugins/cursor/skills/funpixel-publish/references/networks.md +75 -0
  1340. package/plugins/cursor/skills/funpixel-publish/references/other-hosts.md +65 -0
  1341. package/plugins/cursor/skills/funpixel-publish/references/playable-ad.md +90 -0
  1342. package/plugins/cursor/skills/funpixel-publish/references/server-build.md +85 -0
  1343. package/plugins/cursor/skills/funpixel-publish/references/store-shots.md +85 -0
  1344. package/plugins/cursor/skills/funpixel-publish/references/trailer.md +55 -0
  1345. package/plugins/cursor/skills/funpixel-publish/references/what-ships.md +30 -0
  1346. package/plugins/cursor/skills/funpixel-store/SKILL.md +81 -0
  1347. package/plugins/cursor/skills/funpixel-store/references/app-store.md +73 -0
  1348. package/plugins/cursor/skills/funpixel-store/references/google-play.md +141 -0
  1349. package/plugins/cursor/skills/funpixel-store/references/ios-release.md +63 -0
  1350. package/plugins/cursor/skills/funpixel-store/references/money.md +66 -0
  1351. package/plugins/cursor/skills/funpixel-store/references/purchases-and-review.md +74 -0
  1352. package/plugins/cursor/skills/funpixel-store/references/readiness-page.md +24 -0
  1353. package/plugins/cursor/skills/funpixel-store/references/readiness.md +107 -0
  1354. package/plugins/cursor/skills/funpixel-store/references/steam.md +38 -0
  1355. package/plugins/cursor/skills/funpixel-store/references/unity-store.md +55 -0
  1356. package/plugins/cursor/skills/funpixel-store/references/web-portals.md +43 -0
  1357. package/plugins/cursor/skills/funpixel-unity-game/SKILL.md +103 -0
  1358. package/plugins/cursor/skills/funpixel-unity-game/references/agent-ops.md +54 -0
  1359. package/plugins/cursor/skills/funpixel-unity-game/references/fixes.md +40 -0
  1360. package/plugins/cursor/skills/funpixel-unity-game/references/from-a-web-game.md +108 -0
  1361. package/plugins/cursor/skills/funpixel-unity-game/references/handing-off.md +42 -0
  1362. package/plugins/cursor/skills/funpixel-unity-game/references/performance.md +59 -0
  1363. package/plugins/cursor/skills/funpixel-unity-game/references/probe.md +80 -0
  1364. package/plugins/cursor/skills/funpixel-unity-game/references/shared-mac.md +121 -0
  1365. package/plugins/cursor/skills/funpixel-unity-game/references/traps.md +108 -0
  1366. package/plugins/cursor/skills/funpixel-verify/SKILL.md +109 -0
  1367. package/plugins/cursor/skills/funpixel-verify/references/actors.md +94 -0
  1368. package/plugins/cursor/skills/funpixel-verify/references/bar.md +62 -0
  1369. package/plugins/cursor/skills/funpixel-verify/references/checks.md +69 -0
  1370. package/plugins/cursor/skills/funpixel-verify/references/experience.md +67 -0
  1371. package/plugins/cursor/skills/funpixel-verify/references/eyes.md +54 -0
  1372. package/plugins/cursor/skills/funpixel-verify/references/fidelity.md +126 -0
  1373. package/plugins/cursor/skills/funpixel-verify/references/hit-bar.md +31 -0
  1374. package/plugins/cursor/skills/funpixel-verify/references/journeys.md +77 -0
  1375. package/plugins/cursor/skills/funpixel-verify/references/mobile-qa.md +123 -0
  1376. package/plugins/cursor/skills/funpixel-verify/references/playtest.md +161 -0
  1377. package/plugins/cursor/skills/funpixel-verify/references/review.md +105 -0
  1378. package/plugins/cursor/skills/funpixel-verify/references/rubric.md +67 -0
  1379. package/plugins/cursor/skills/funpixel-verify/references/scenes.md +49 -0
  1380. package/plugins/cursor/skills/funpixel-verify/references/unity.md +60 -0
  1381. package/plugins/cursor/skills/funpixel-world-and-story/SKILL.md +99 -0
  1382. package/plugins/cursor/skills/funpixel-world-and-story/references/atmosphere.md +208 -0
  1383. package/plugins/cursor/skills/funpixel-world-and-story/references/forged-world.md +79 -0
  1384. package/plugins/cursor/skills/funpixel-world-and-story/references/living-world.md +237 -0
  1385. package/plugins/cursor/skills/funpixel-world-and-story/references/opening-and-chapters.md +215 -0
  1386. package/plugins/cursor/skills/funpixel-world-and-story/references/shelf.md +80 -0
  1387. package/plugins/cursor/skills/funpixel-world-and-story/references/story-at-size.md +159 -0
  1388. package/plugins/cursor/skills/funpixel-world-and-story/references/voice.md +175 -0
  1389. package/plugins/cursor/skills/funpixel-world-and-story/references/world-kit.md +154 -0
  1390. package/plugins/kiro/AGENTS.md +135 -0
  1391. package/plugins/kiro/LICENSE +115 -0
  1392. package/plugins/kiro/README.md +17 -0
  1393. package/plugins/kiro/THIRD_PARTY_NOTICES.md +75 -0
  1394. package/plugins/kiro/agent.template.json +45 -0
  1395. package/plugins/kiro/hooks/brief.md +135 -0
  1396. package/plugins/kiro/hooks/critic-receipts.mjs +86 -0
  1397. package/plugins/kiro/hooks/durable.mjs +56 -0
  1398. package/plugins/kiro/hooks/fence.mjs +30 -0
  1399. package/plugins/kiro/hooks/floors.mjs +181 -0
  1400. package/plugins/kiro/hooks/flow.mjs +154 -0
  1401. package/plugins/kiro/hooks/front-door.mjs +68 -0
  1402. package/plugins/kiro/hooks/guidance.json +3 -0
  1403. package/plugins/kiro/hooks/hints.mjs +183 -0
  1404. package/plugins/kiro/hooks/host.md +43 -0
  1405. package/plugins/kiro/hooks/kiro-prompt.mjs +26 -0
  1406. package/plugins/kiro/hooks/lib.mjs +362 -0
  1407. package/plugins/kiro/hooks/memory.mjs +92 -0
  1408. package/plugins/kiro/hooks/mobile-qa.mjs +43 -0
  1409. package/plugins/kiro/hooks/note.mjs +63 -0
  1410. package/plugins/kiro/hooks/nudge.mjs +98 -0
  1411. package/plugins/kiro/hooks/pipeline.mjs +207 -0
  1412. package/plugins/kiro/hooks/prompt.mjs +51 -0
  1413. package/plugins/kiro/hooks/quality.mjs +310 -0
  1414. package/plugins/kiro/hooks/reach.mjs +93 -0
  1415. package/plugins/kiro/hooks/scope.mjs +44 -0
  1416. package/plugins/kiro/hooks/session-log.mjs +101 -0
  1417. package/plugins/kiro/hooks/session-start.mjs +194 -0
  1418. package/plugins/kiro/hooks/stop-gate.mjs +303 -0
  1419. package/plugins/kiro/hooks/vendor/direct/round.mjs +81 -0
  1420. package/plugins/kiro/hooks/vendor/find/names.mjs +46 -0
  1421. package/plugins/kiro/hooks/vendor/firstlook/set.mjs +219 -0
  1422. package/plugins/kiro/hooks/vendor/flow/flow.mjs +456 -0
  1423. package/plugins/kiro/hooks/vendor/flow/look.mjs +140 -0
  1424. package/plugins/kiro/hooks/vendor/gdd/book.mjs +484 -0
  1425. package/plugins/kiro/hooks/vendor/gdd/chapters.mjs +72 -0
  1426. package/plugins/kiro/hooks/vendor/gdd/doc.mjs +33 -0
  1427. package/plugins/kiro/hooks/vendor/gdd/levelmap.mjs +429 -0
  1428. package/plugins/kiro/hooks/vendor/gdd/rubric.mjs +251 -0
  1429. package/plugins/kiro/hooks/vendor/gdd/worth.mjs +508 -0
  1430. package/plugins/kiro/hooks/vendor/lanes/fence.mjs +109 -0
  1431. package/plugins/kiro/hooks/vendor/lanes/lanes.mjs +356 -0
  1432. package/plugins/kiro/hooks/vendor/lanes/union.mjs +63 -0
  1433. package/plugins/kiro/hooks/vendor/lessons/motifs.mjs +98 -0
  1434. package/plugins/kiro/hooks/vendor/lessons/store.mjs +57 -0
  1435. package/plugins/kiro/hooks/vendor/look/made-of.mjs +243 -0
  1436. package/plugins/kiro/hooks/vendor/look/roles.mjs +110 -0
  1437. package/plugins/kiro/hooks/vendor/memory/decisions.mjs +139 -0
  1438. package/plugins/kiro/hooks/vendor/memory/journal.mjs +109 -0
  1439. package/plugins/kiro/hooks/vendor/owner/bar.mjs +286 -0
  1440. package/plugins/kiro/hooks/vendor/pipeline/pipeline.mjs +930 -0
  1441. package/plugins/kiro/hooks/vendor/playtest/keep.mjs +111 -0
  1442. package/plugins/kiro/hooks/vendor/playtest/stuck.mjs +48 -0
  1443. package/plugins/kiro/hooks/vendor/progress/holds.mjs +107 -0
  1444. package/plugins/kiro/hooks/vendor/progress/progress.mjs +301 -0
  1445. package/plugins/kiro/hooks/vendor/sim/judge.mjs +241 -0
  1446. package/plugins/kiro/hooks/vendor/spec/rooms.mjs +189 -0
  1447. package/plugins/kiro/hooks/vendor/spec/tunables.mjs +75 -0
  1448. package/plugins/kiro/hooks/vendor/stage/harnessignore.mjs +91 -0
  1449. package/plugins/kiro/hooks/vendor/stage/stage.mjs +58 -0
  1450. package/plugins/kiro/hooks/vendor/status/board.mjs +173 -0
  1451. package/plugins/kiro/hooks/vendor/status/file.mjs +113 -0
  1452. package/plugins/kiro/hooks/vendor/studio/forks.mjs +94 -0
  1453. package/plugins/kiro/hooks/vendor/studio/pitch.mjs +295 -0
  1454. package/plugins/kiro/hooks/vendor/verify/fingerprint.mjs +73 -0
  1455. package/plugins/kiro/hooks/vendor/verify/reads.mjs +33 -0
  1456. package/plugins/kiro/hooks/vendor/wow/picks.mjs +75 -0
  1457. package/plugins/kiro/install.mjs +37 -0
  1458. package/plugins/kiro/skills/fp-art-director/SKILL.md +58 -0
  1459. package/plugins/kiro/skills/fp-art-director/references/kiro.md +43 -0
  1460. package/plugins/kiro/skills/fp-audio-director/SKILL.md +55 -0
  1461. package/plugins/kiro/skills/fp-audio-director/references/kiro.md +43 -0
  1462. package/plugins/kiro/skills/fp-critic/SKILL.md +117 -0
  1463. package/plugins/kiro/skills/fp-critic/references/kiro.md +43 -0
  1464. package/plugins/kiro/skills/fp-first-look/SKILL.md +61 -0
  1465. package/plugins/kiro/skills/fp-flow/SKILL.md +52 -0
  1466. package/plugins/kiro/skills/fp-lane/SKILL.md +41 -0
  1467. package/plugins/kiro/skills/fp-lane/references/kiro.md +43 -0
  1468. package/plugins/kiro/skills/fp-lanes/SKILL.md +40 -0
  1469. package/plugins/kiro/skills/fp-level-designer/SKILL.md +49 -0
  1470. package/plugins/kiro/skills/fp-level-designer/references/kiro.md +43 -0
  1471. package/plugins/kiro/skills/fp-mobile-qa/SKILL.md +30 -0
  1472. package/plugins/kiro/skills/fp-mobile-qa-seat/SKILL.md +74 -0
  1473. package/plugins/kiro/skills/fp-mobile-qa-seat/references/kiro.md +43 -0
  1474. package/plugins/kiro/skills/fp-new/SKILL.md +96 -0
  1475. package/plugins/kiro/skills/fp-player/SKILL.md +147 -0
  1476. package/plugins/kiro/skills/fp-player/references/kiro.md +43 -0
  1477. package/plugins/kiro/skills/fp-playtest/SKILL.md +68 -0
  1478. package/plugins/kiro/skills/fp-publish/SKILL.md +25 -0
  1479. package/plugins/kiro/skills/fp-qa-lead/SKILL.md +56 -0
  1480. package/plugins/kiro/skills/fp-qa-lead/references/kiro.md +43 -0
  1481. package/plugins/kiro/skills/fp-smoke-build/SKILL.md +27 -0
  1482. package/plugins/kiro/skills/fp-studio/SKILL.md +48 -0
  1483. package/plugins/kiro/skills/fp-verify/SKILL.md +22 -0
  1484. package/plugins/kiro/skills/funpixel-3d/SKILL.md +89 -0
  1485. package/plugins/kiro/skills/funpixel-3d/references/bake-off.md +48 -0
  1486. package/plugins/kiro/skills/funpixel-3d/references/bench.md +103 -0
  1487. package/plugins/kiro/skills/funpixel-3d/references/budgets.md +48 -0
  1488. package/plugins/kiro/skills/funpixel-3d/references/characters.md +67 -0
  1489. package/plugins/kiro/skills/funpixel-3d/references/concept-image.md +47 -0
  1490. package/plugins/kiro/skills/funpixel-3d/references/engine-targets.md +31 -0
  1491. package/plugins/kiro/skills/funpixel-3d/references/hero-route.md +104 -0
  1492. package/plugins/kiro/skills/funpixel-3d/references/level-spec.md +109 -0
  1493. package/plugins/kiro/skills/funpixel-3d/references/levels.md +84 -0
  1494. package/plugins/kiro/skills/funpixel-3d/references/light-and-places.md +141 -0
  1495. package/plugins/kiro/skills/funpixel-3d/references/models.md +111 -0
  1496. package/plugins/kiro/skills/funpixel-3d/references/painted-target.md +184 -0
  1497. package/plugins/kiro/skills/funpixel-3d/references/reading.md +41 -0
  1498. package/plugins/kiro/skills/funpixel-3d/references/skin.md +85 -0
  1499. package/plugins/kiro/skills/funpixel-3d/references/skyboxes.md +65 -0
  1500. package/plugins/kiro/skills/funpixel-3d/references/textures.md +71 -0
  1501. package/plugins/kiro/skills/funpixel-3d/references/three-loading.md +199 -0
  1502. package/plugins/kiro/skills/funpixel-3d/references/unity.md +78 -0
  1503. package/plugins/kiro/skills/funpixel-art/SKILL.md +104 -0
  1504. package/plugins/kiro/skills/funpixel-art/references/2d-assets.md +108 -0
  1505. package/plugins/kiro/skills/funpixel-art/references/animation.md +126 -0
  1506. package/plugins/kiro/skills/funpixel-art/references/cast.md +73 -0
  1507. package/plugins/kiro/skills/funpixel-art/references/characters.md +49 -0
  1508. package/plugins/kiro/skills/funpixel-art/references/cost.md +107 -0
  1509. package/plugins/kiro/skills/funpixel-art/references/effects.md +85 -0
  1510. package/plugins/kiro/skills/funpixel-art/references/frames.md +87 -0
  1511. package/plugins/kiro/skills/funpixel-art/references/judging-frames.md +64 -0
  1512. package/plugins/kiro/skills/funpixel-art/references/look.md +102 -0
  1513. package/plugins/kiro/skills/funpixel-art/references/measure.md +119 -0
  1514. package/plugins/kiro/skills/funpixel-art/references/pipeline.md +185 -0
  1515. package/plugins/kiro/skills/funpixel-art/references/pixi.md +277 -0
  1516. package/plugins/kiro/skills/funpixel-art/references/planes.md +27 -0
  1517. package/plugins/kiro/skills/funpixel-art/references/prompts.md +171 -0
  1518. package/plugins/kiro/skills/funpixel-art/references/sheets.md +141 -0
  1519. package/plugins/kiro/skills/funpixel-art/references/style-file.md +39 -0
  1520. package/plugins/kiro/skills/funpixel-art/references/three.md +232 -0
  1521. package/plugins/kiro/skills/funpixel-art/references/ui.md +163 -0
  1522. package/plugins/kiro/skills/funpixel-art/references/unity.md +78 -0
  1523. package/plugins/kiro/skills/funpixel-art/references/wiring.md +41 -0
  1524. package/plugins/kiro/skills/funpixel-audio/SKILL.md +92 -0
  1525. package/plugins/kiro/skills/funpixel-audio/references/adaptive-music.md +204 -0
  1526. package/plugins/kiro/skills/funpixel-audio/references/engine.md +78 -0
  1527. package/plugins/kiro/skills/funpixel-audio/references/measure.md +101 -0
  1528. package/plugins/kiro/skills/funpixel-audio/references/unity.md +74 -0
  1529. package/plugins/kiro/skills/funpixel-feedback/SKILL.md +120 -0
  1530. package/plugins/kiro/skills/funpixel-feedback/references/memory.md +99 -0
  1531. package/plugins/kiro/skills/funpixel-game-feel/SKILL.md +104 -0
  1532. package/plugins/kiro/skills/funpixel-game-feel/references/contact.md +110 -0
  1533. package/plugins/kiro/skills/funpixel-game-feel/references/measure.md +125 -0
  1534. package/plugins/kiro/skills/funpixel-game-feel/references/motion.md +134 -0
  1535. package/plugins/kiro/skills/funpixel-game-feel/references/payoffs.md +35 -0
  1536. package/plugins/kiro/skills/funpixel-game-feel/references/recipes.md +107 -0
  1537. package/plugins/kiro/skills/funpixel-game-feel/references/unity.md +73 -0
  1538. package/plugins/kiro/skills/funpixel-game-logic/SKILL.md +113 -0
  1539. package/plugins/kiro/skills/funpixel-game-logic/references/balance.md +88 -0
  1540. package/plugins/kiro/skills/funpixel-game-logic/references/content-at-scale.md +147 -0
  1541. package/plugins/kiro/skills/funpixel-game-logic/references/depth.md +89 -0
  1542. package/plugins/kiro/skills/funpixel-game-logic/references/escalation.md +41 -0
  1543. package/plugins/kiro/skills/funpixel-game-logic/references/levels.md +61 -0
  1544. package/plugins/kiro/skills/funpixel-game-logic/references/probes.md +122 -0
  1545. package/plugins/kiro/skills/funpixel-game-logic/references/unity.md +108 -0
  1546. package/plugins/kiro/skills/funpixel-game-spine/SKILL.md +118 -0
  1547. package/plugins/kiro/skills/funpixel-game-spine/references/camera.md +94 -0
  1548. package/plugins/kiro/skills/funpixel-game-spine/references/multiplayer.md +101 -0
  1549. package/plugins/kiro/skills/funpixel-game-spine/references/patterns.md +103 -0
  1550. package/plugins/kiro/skills/funpixel-game-spine/references/performance.md +96 -0
  1551. package/plugins/kiro/skills/funpixel-game-spine/references/pixi.md +26 -0
  1552. package/plugins/kiro/skills/funpixel-game-spine/references/replay.md +102 -0
  1553. package/plugins/kiro/skills/funpixel-game-spine/references/room-api.md +63 -0
  1554. package/plugins/kiro/skills/funpixel-game-spine/references/room-modes.md +40 -0
  1555. package/plugins/kiro/skills/funpixel-game-spine/references/sdk.md +114 -0
  1556. package/plugins/kiro/skills/funpixel-game-spine/references/three.md +62 -0
  1557. package/plugins/kiro/skills/funpixel-gdd/SKILL.md +116 -0
  1558. package/plugins/kiro/skills/funpixel-gdd/references/as-built.md +40 -0
  1559. package/plugins/kiro/skills/funpixel-gdd/references/design-measures.md +24 -0
  1560. package/plugins/kiro/skills/funpixel-gdd/references/design-note.md +88 -0
  1561. package/plugins/kiro/skills/funpixel-gdd/references/experience.md +92 -0
  1562. package/plugins/kiro/skills/funpixel-gdd/references/first-look.md +226 -0
  1563. package/plugins/kiro/skills/funpixel-gdd/references/floors.md +62 -0
  1564. package/plugins/kiro/skills/funpixel-gdd/references/frame.md +75 -0
  1565. package/plugins/kiro/skills/funpixel-gdd/references/gameplay-contract.md +81 -0
  1566. package/plugins/kiro/skills/funpixel-gdd/references/gdd-template.md +417 -0
  1567. package/plugins/kiro/skills/funpixel-gdd/references/genre-card.md +109 -0
  1568. package/plugins/kiro/skills/funpixel-gdd/references/genre-platformer.md +159 -0
  1569. package/plugins/kiro/skills/funpixel-gdd/references/genre-puzzle.md +145 -0
  1570. package/plugins/kiro/skills/funpixel-gdd/references/genre-racing.md +137 -0
  1571. package/plugins/kiro/skills/funpixel-gdd/references/genre-rpg.md +125 -0
  1572. package/plugins/kiro/skills/funpixel-gdd/references/genre-shooter.md +128 -0
  1573. package/plugins/kiro/skills/funpixel-gdd/references/genre-simulation.md +112 -0
  1574. package/plugins/kiro/skills/funpixel-gdd/references/genre-strategy.md +116 -0
  1575. package/plugins/kiro/skills/funpixel-gdd/references/genre-survival.md +122 -0
  1576. package/plugins/kiro/skills/funpixel-gdd/references/in-the-loop.md +106 -0
  1577. package/plugins/kiro/skills/funpixel-gdd/references/invent-first.md +131 -0
  1578. package/plugins/kiro/skills/funpixel-gdd/references/level-and-fun.md +112 -0
  1579. package/plugins/kiro/skills/funpixel-gdd/references/pages.md +47 -0
  1580. package/plugins/kiro/skills/funpixel-gdd/references/plan-at-size.md +140 -0
  1581. package/plugins/kiro/skills/funpixel-gdd/references/production-tiers.md +117 -0
  1582. package/plugins/kiro/skills/funpixel-gdd/references/sections.md +148 -0
  1583. package/plugins/kiro/skills/funpixel-gdd/references/spec-folder.md +131 -0
  1584. package/plugins/kiro/skills/funpixel-gdd/references/start.md +110 -0
  1585. package/plugins/kiro/skills/funpixel-gdd/references/starters.md +175 -0
  1586. package/plugins/kiro/skills/funpixel-gdd/references/the-path.md +133 -0
  1587. package/plugins/kiro/skills/funpixel-gdd/references/track.md +29 -0
  1588. package/plugins/kiro/skills/funpixel-gdd/references/world-and-identity.md +165 -0
  1589. package/plugins/kiro/skills/funpixel-gdd/references/worth.md +74 -0
  1590. package/plugins/kiro/skills/funpixel-mobile-ui/SKILL.md +107 -0
  1591. package/plugins/kiro/skills/funpixel-mobile-ui/references/contrast.md +123 -0
  1592. package/plugins/kiro/skills/funpixel-mobile-ui/references/hud-and-title.md +108 -0
  1593. package/plugins/kiro/skills/funpixel-mobile-ui/references/hud-genres.md +124 -0
  1594. package/plugins/kiro/skills/funpixel-mobile-ui/references/phone-check.md +156 -0
  1595. package/plugins/kiro/skills/funpixel-mobile-ui/references/recipes.md +279 -0
  1596. package/plugins/kiro/skills/funpixel-mobile-ui/references/restyle-ui.md +229 -0
  1597. package/plugins/kiro/skills/funpixel-mobile-ui/references/unity.md +61 -0
  1598. package/plugins/kiro/skills/funpixel-publish/SKILL.md +109 -0
  1599. package/plugins/kiro/skills/funpixel-publish/references/compose.md +113 -0
  1600. package/plugins/kiro/skills/funpixel-publish/references/motion.md +120 -0
  1601. package/plugins/kiro/skills/funpixel-publish/references/networks.md +75 -0
  1602. package/plugins/kiro/skills/funpixel-publish/references/other-hosts.md +65 -0
  1603. package/plugins/kiro/skills/funpixel-publish/references/playable-ad.md +90 -0
  1604. package/plugins/kiro/skills/funpixel-publish/references/server-build.md +85 -0
  1605. package/plugins/kiro/skills/funpixel-publish/references/store-shots.md +85 -0
  1606. package/plugins/kiro/skills/funpixel-publish/references/trailer.md +55 -0
  1607. package/plugins/kiro/skills/funpixel-publish/references/what-ships.md +30 -0
  1608. package/plugins/kiro/skills/funpixel-store/SKILL.md +81 -0
  1609. package/plugins/kiro/skills/funpixel-store/references/app-store.md +73 -0
  1610. package/plugins/kiro/skills/funpixel-store/references/google-play.md +141 -0
  1611. package/plugins/kiro/skills/funpixel-store/references/ios-release.md +63 -0
  1612. package/plugins/kiro/skills/funpixel-store/references/money.md +66 -0
  1613. package/plugins/kiro/skills/funpixel-store/references/purchases-and-review.md +74 -0
  1614. package/plugins/kiro/skills/funpixel-store/references/readiness-page.md +24 -0
  1615. package/plugins/kiro/skills/funpixel-store/references/readiness.md +107 -0
  1616. package/plugins/kiro/skills/funpixel-store/references/steam.md +38 -0
  1617. package/plugins/kiro/skills/funpixel-store/references/unity-store.md +55 -0
  1618. package/plugins/kiro/skills/funpixel-store/references/web-portals.md +43 -0
  1619. package/plugins/kiro/skills/funpixel-unity-game/SKILL.md +103 -0
  1620. package/plugins/kiro/skills/funpixel-unity-game/references/agent-ops.md +54 -0
  1621. package/plugins/kiro/skills/funpixel-unity-game/references/fixes.md +40 -0
  1622. package/plugins/kiro/skills/funpixel-unity-game/references/from-a-web-game.md +108 -0
  1623. package/plugins/kiro/skills/funpixel-unity-game/references/handing-off.md +42 -0
  1624. package/plugins/kiro/skills/funpixel-unity-game/references/performance.md +59 -0
  1625. package/plugins/kiro/skills/funpixel-unity-game/references/probe.md +80 -0
  1626. package/plugins/kiro/skills/funpixel-unity-game/references/shared-mac.md +121 -0
  1627. package/plugins/kiro/skills/funpixel-unity-game/references/traps.md +108 -0
  1628. package/plugins/kiro/skills/funpixel-verify/SKILL.md +109 -0
  1629. package/plugins/kiro/skills/funpixel-verify/references/actors.md +94 -0
  1630. package/plugins/kiro/skills/funpixel-verify/references/bar.md +62 -0
  1631. package/plugins/kiro/skills/funpixel-verify/references/checks.md +69 -0
  1632. package/plugins/kiro/skills/funpixel-verify/references/experience.md +67 -0
  1633. package/plugins/kiro/skills/funpixel-verify/references/eyes.md +54 -0
  1634. package/plugins/kiro/skills/funpixel-verify/references/fidelity.md +126 -0
  1635. package/plugins/kiro/skills/funpixel-verify/references/hit-bar.md +31 -0
  1636. package/plugins/kiro/skills/funpixel-verify/references/journeys.md +77 -0
  1637. package/plugins/kiro/skills/funpixel-verify/references/mobile-qa.md +123 -0
  1638. package/plugins/kiro/skills/funpixel-verify/references/playtest.md +161 -0
  1639. package/plugins/kiro/skills/funpixel-verify/references/review.md +105 -0
  1640. package/plugins/kiro/skills/funpixel-verify/references/rubric.md +67 -0
  1641. package/plugins/kiro/skills/funpixel-verify/references/scenes.md +49 -0
  1642. package/plugins/kiro/skills/funpixel-verify/references/unity.md +60 -0
  1643. package/plugins/kiro/skills/funpixel-world-and-story/SKILL.md +99 -0
  1644. package/plugins/kiro/skills/funpixel-world-and-story/references/atmosphere.md +208 -0
  1645. package/plugins/kiro/skills/funpixel-world-and-story/references/forged-world.md +79 -0
  1646. package/plugins/kiro/skills/funpixel-world-and-story/references/living-world.md +237 -0
  1647. package/plugins/kiro/skills/funpixel-world-and-story/references/opening-and-chapters.md +215 -0
  1648. package/plugins/kiro/skills/funpixel-world-and-story/references/shelf.md +80 -0
  1649. package/plugins/kiro/skills/funpixel-world-and-story/references/story-at-size.md +159 -0
  1650. package/plugins/kiro/skills/funpixel-world-and-story/references/voice.md +175 -0
  1651. package/plugins/kiro/skills/funpixel-world-and-story/references/world-kit.md +154 -0
  1652. package/plugins/robin/LICENSE +115 -0
  1653. package/plugins/robin/README.md +27 -0
  1654. package/plugins/robin/THIRD_PARTY_NOTICES.md +75 -0
  1655. package/plugins/robin/claude/.claude-plugin/plugin.json +19 -0
  1656. package/plugins/robin/claude/.mcp.json +10 -0
  1657. package/plugins/robin/claude/LICENSE +115 -0
  1658. package/plugins/robin/claude/README.md +14 -0
  1659. package/plugins/robin/claude/THIRD_PARTY_NOTICES.md +75 -0
  1660. package/plugins/robin/claude/agents/art-director.md +54 -0
  1661. package/plugins/robin/claude/agents/audio-director.md +51 -0
  1662. package/plugins/robin/claude/agents/critic.md +113 -0
  1663. package/plugins/robin/claude/agents/lane.md +38 -0
  1664. package/plugins/robin/claude/agents/level-designer.md +45 -0
  1665. package/plugins/robin/claude/agents/mobile-qa.md +71 -0
  1666. package/plugins/robin/claude/agents/player.md +144 -0
  1667. package/plugins/robin/claude/agents/qa-lead.md +52 -0
  1668. package/plugins/robin/claude/commands/first-look.md +59 -0
  1669. package/plugins/robin/claude/commands/flow.md +50 -0
  1670. package/plugins/robin/claude/commands/lanes.md +38 -0
  1671. package/plugins/robin/claude/commands/mobile-qa.md +28 -0
  1672. package/plugins/robin/claude/commands/new.md +94 -0
  1673. package/plugins/robin/claude/commands/playtest.md +66 -0
  1674. package/plugins/robin/claude/commands/publish.md +23 -0
  1675. package/plugins/robin/claude/commands/smoke-build.md +25 -0
  1676. package/plugins/robin/claude/commands/verify.md +20 -0
  1677. package/plugins/robin/claude/hooks/brief.md +135 -0
  1678. package/plugins/robin/claude/hooks/critic-receipts.mjs +86 -0
  1679. package/plugins/robin/claude/hooks/durable.mjs +56 -0
  1680. package/plugins/robin/claude/hooks/fence.mjs +30 -0
  1681. package/plugins/robin/claude/hooks/floors.mjs +181 -0
  1682. package/plugins/robin/claude/hooks/flow.mjs +154 -0
  1683. package/plugins/robin/claude/hooks/front-door.mjs +68 -0
  1684. package/plugins/robin/claude/hooks/guidance.json +3 -0
  1685. package/plugins/robin/claude/hooks/hints.mjs +183 -0
  1686. package/plugins/robin/claude/hooks/hooks.json +62 -0
  1687. package/plugins/robin/claude/hooks/lib.mjs +362 -0
  1688. package/plugins/robin/claude/hooks/memory.mjs +92 -0
  1689. package/plugins/robin/claude/hooks/mobile-qa.mjs +43 -0
  1690. package/plugins/robin/claude/hooks/note.mjs +63 -0
  1691. package/plugins/robin/claude/hooks/nudge.mjs +98 -0
  1692. package/plugins/robin/claude/hooks/pipeline.mjs +207 -0
  1693. package/plugins/robin/claude/hooks/prompt.mjs +51 -0
  1694. package/plugins/robin/claude/hooks/quality.mjs +310 -0
  1695. package/plugins/robin/claude/hooks/reach.mjs +93 -0
  1696. package/plugins/robin/claude/hooks/scope.mjs +44 -0
  1697. package/plugins/robin/claude/hooks/session-log.mjs +101 -0
  1698. package/plugins/robin/claude/hooks/session-start.mjs +194 -0
  1699. package/plugins/robin/claude/hooks/skill-names.json +19 -0
  1700. package/plugins/robin/claude/hooks/stop-gate.mjs +303 -0
  1701. package/plugins/robin/claude/hooks/vendor/direct/round.mjs +81 -0
  1702. package/plugins/robin/claude/hooks/vendor/find/names.mjs +46 -0
  1703. package/plugins/robin/claude/hooks/vendor/firstlook/set.mjs +219 -0
  1704. package/plugins/robin/claude/hooks/vendor/flow/flow.mjs +456 -0
  1705. package/plugins/robin/claude/hooks/vendor/flow/look.mjs +140 -0
  1706. package/plugins/robin/claude/hooks/vendor/gdd/book.mjs +484 -0
  1707. package/plugins/robin/claude/hooks/vendor/gdd/chapters.mjs +72 -0
  1708. package/plugins/robin/claude/hooks/vendor/gdd/doc.mjs +33 -0
  1709. package/plugins/robin/claude/hooks/vendor/gdd/levelmap.mjs +429 -0
  1710. package/plugins/robin/claude/hooks/vendor/gdd/rubric.mjs +251 -0
  1711. package/plugins/robin/claude/hooks/vendor/gdd/worth.mjs +508 -0
  1712. package/plugins/robin/claude/hooks/vendor/lanes/fence.mjs +109 -0
  1713. package/plugins/robin/claude/hooks/vendor/lanes/lanes.mjs +356 -0
  1714. package/plugins/robin/claude/hooks/vendor/lanes/union.mjs +63 -0
  1715. package/plugins/robin/claude/hooks/vendor/lessons/motifs.mjs +98 -0
  1716. package/plugins/robin/claude/hooks/vendor/lessons/store.mjs +57 -0
  1717. package/plugins/robin/claude/hooks/vendor/look/made-of.mjs +243 -0
  1718. package/plugins/robin/claude/hooks/vendor/look/roles.mjs +110 -0
  1719. package/plugins/robin/claude/hooks/vendor/memory/decisions.mjs +139 -0
  1720. package/plugins/robin/claude/hooks/vendor/memory/journal.mjs +109 -0
  1721. package/plugins/robin/claude/hooks/vendor/owner/bar.mjs +286 -0
  1722. package/plugins/robin/claude/hooks/vendor/pipeline/pipeline.mjs +930 -0
  1723. package/plugins/robin/claude/hooks/vendor/playtest/keep.mjs +111 -0
  1724. package/plugins/robin/claude/hooks/vendor/playtest/stuck.mjs +48 -0
  1725. package/plugins/robin/claude/hooks/vendor/progress/holds.mjs +107 -0
  1726. package/plugins/robin/claude/hooks/vendor/progress/progress.mjs +301 -0
  1727. package/plugins/robin/claude/hooks/vendor/sim/judge.mjs +241 -0
  1728. package/plugins/robin/claude/hooks/vendor/spec/rooms.mjs +189 -0
  1729. package/plugins/robin/claude/hooks/vendor/spec/tunables.mjs +75 -0
  1730. package/plugins/robin/claude/hooks/vendor/stage/harnessignore.mjs +91 -0
  1731. package/plugins/robin/claude/hooks/vendor/stage/stage.mjs +58 -0
  1732. package/plugins/robin/claude/hooks/vendor/status/board.mjs +173 -0
  1733. package/plugins/robin/claude/hooks/vendor/status/file.mjs +113 -0
  1734. package/plugins/robin/claude/hooks/vendor/studio/forks.mjs +94 -0
  1735. package/plugins/robin/claude/hooks/vendor/studio/pitch.mjs +295 -0
  1736. package/plugins/robin/claude/hooks/vendor/verify/fingerprint.mjs +73 -0
  1737. package/plugins/robin/claude/hooks/vendor/verify/reads.mjs +33 -0
  1738. package/plugins/robin/claude/hooks/vendor/wow/picks.mjs +75 -0
  1739. package/plugins/robin/claude/skills/3d/SKILL.md +89 -0
  1740. package/plugins/robin/claude/skills/3d/references/bake-off.md +48 -0
  1741. package/plugins/robin/claude/skills/3d/references/bench.md +103 -0
  1742. package/plugins/robin/claude/skills/3d/references/budgets.md +48 -0
  1743. package/plugins/robin/claude/skills/3d/references/characters.md +67 -0
  1744. package/plugins/robin/claude/skills/3d/references/concept-image.md +47 -0
  1745. package/plugins/robin/claude/skills/3d/references/engine-targets.md +31 -0
  1746. package/plugins/robin/claude/skills/3d/references/hero-route.md +104 -0
  1747. package/plugins/robin/claude/skills/3d/references/level-spec.md +109 -0
  1748. package/plugins/robin/claude/skills/3d/references/levels.md +84 -0
  1749. package/plugins/robin/claude/skills/3d/references/light-and-places.md +141 -0
  1750. package/plugins/robin/claude/skills/3d/references/models.md +111 -0
  1751. package/plugins/robin/claude/skills/3d/references/painted-target.md +184 -0
  1752. package/plugins/robin/claude/skills/3d/references/reading.md +41 -0
  1753. package/plugins/robin/claude/skills/3d/references/skin.md +85 -0
  1754. package/plugins/robin/claude/skills/3d/references/skyboxes.md +65 -0
  1755. package/plugins/robin/claude/skills/3d/references/textures.md +71 -0
  1756. package/plugins/robin/claude/skills/3d/references/three-loading.md +199 -0
  1757. package/plugins/robin/claude/skills/3d/references/unity.md +78 -0
  1758. package/plugins/robin/claude/skills/art/SKILL.md +104 -0
  1759. package/plugins/robin/claude/skills/art/references/2d-assets.md +108 -0
  1760. package/plugins/robin/claude/skills/art/references/animation.md +126 -0
  1761. package/plugins/robin/claude/skills/art/references/cast.md +73 -0
  1762. package/plugins/robin/claude/skills/art/references/characters.md +49 -0
  1763. package/plugins/robin/claude/skills/art/references/cost.md +107 -0
  1764. package/plugins/robin/claude/skills/art/references/effects.md +85 -0
  1765. package/plugins/robin/claude/skills/art/references/frames.md +87 -0
  1766. package/plugins/robin/claude/skills/art/references/judging-frames.md +64 -0
  1767. package/plugins/robin/claude/skills/art/references/look.md +102 -0
  1768. package/plugins/robin/claude/skills/art/references/measure.md +119 -0
  1769. package/plugins/robin/claude/skills/art/references/pipeline.md +185 -0
  1770. package/plugins/robin/claude/skills/art/references/pixi.md +277 -0
  1771. package/plugins/robin/claude/skills/art/references/planes.md +27 -0
  1772. package/plugins/robin/claude/skills/art/references/prompts.md +171 -0
  1773. package/plugins/robin/claude/skills/art/references/sheets.md +141 -0
  1774. package/plugins/robin/claude/skills/art/references/style-file.md +39 -0
  1775. package/plugins/robin/claude/skills/art/references/three.md +232 -0
  1776. package/plugins/robin/claude/skills/art/references/ui.md +163 -0
  1777. package/plugins/robin/claude/skills/art/references/unity.md +78 -0
  1778. package/plugins/robin/claude/skills/art/references/wiring.md +41 -0
  1779. package/plugins/robin/claude/skills/audio/SKILL.md +92 -0
  1780. package/plugins/robin/claude/skills/audio/references/adaptive-music.md +204 -0
  1781. package/plugins/robin/claude/skills/audio/references/engine.md +78 -0
  1782. package/plugins/robin/claude/skills/audio/references/measure.md +101 -0
  1783. package/plugins/robin/claude/skills/audio/references/unity.md +74 -0
  1784. package/plugins/robin/claude/skills/feedback/SKILL.md +120 -0
  1785. package/plugins/robin/claude/skills/feedback/references/memory.md +99 -0
  1786. package/plugins/robin/claude/skills/game-feel/SKILL.md +104 -0
  1787. package/plugins/robin/claude/skills/game-feel/references/contact.md +110 -0
  1788. package/plugins/robin/claude/skills/game-feel/references/measure.md +125 -0
  1789. package/plugins/robin/claude/skills/game-feel/references/motion.md +134 -0
  1790. package/plugins/robin/claude/skills/game-feel/references/payoffs.md +35 -0
  1791. package/plugins/robin/claude/skills/game-feel/references/recipes.md +107 -0
  1792. package/plugins/robin/claude/skills/game-feel/references/unity.md +73 -0
  1793. package/plugins/robin/claude/skills/game-logic/SKILL.md +113 -0
  1794. package/plugins/robin/claude/skills/game-logic/references/balance.md +88 -0
  1795. package/plugins/robin/claude/skills/game-logic/references/content-at-scale.md +147 -0
  1796. package/plugins/robin/claude/skills/game-logic/references/depth.md +89 -0
  1797. package/plugins/robin/claude/skills/game-logic/references/escalation.md +41 -0
  1798. package/plugins/robin/claude/skills/game-logic/references/levels.md +61 -0
  1799. package/plugins/robin/claude/skills/game-logic/references/probes.md +122 -0
  1800. package/plugins/robin/claude/skills/game-logic/references/unity.md +108 -0
  1801. package/plugins/robin/claude/skills/game-spine/SKILL.md +118 -0
  1802. package/plugins/robin/claude/skills/game-spine/references/camera.md +94 -0
  1803. package/plugins/robin/claude/skills/game-spine/references/multiplayer.md +101 -0
  1804. package/plugins/robin/claude/skills/game-spine/references/patterns.md +103 -0
  1805. package/plugins/robin/claude/skills/game-spine/references/performance.md +96 -0
  1806. package/plugins/robin/claude/skills/game-spine/references/pixi.md +26 -0
  1807. package/plugins/robin/claude/skills/game-spine/references/replay.md +102 -0
  1808. package/plugins/robin/claude/skills/game-spine/references/room-api.md +63 -0
  1809. package/plugins/robin/claude/skills/game-spine/references/room-modes.md +40 -0
  1810. package/plugins/robin/claude/skills/game-spine/references/sdk.md +114 -0
  1811. package/plugins/robin/claude/skills/game-spine/references/three.md +62 -0
  1812. package/plugins/robin/claude/skills/gdd/SKILL.md +116 -0
  1813. package/plugins/robin/claude/skills/gdd/references/as-built.md +40 -0
  1814. package/plugins/robin/claude/skills/gdd/references/design-measures.md +24 -0
  1815. package/plugins/robin/claude/skills/gdd/references/design-note.md +88 -0
  1816. package/plugins/robin/claude/skills/gdd/references/experience.md +92 -0
  1817. package/plugins/robin/claude/skills/gdd/references/first-look.md +226 -0
  1818. package/plugins/robin/claude/skills/gdd/references/floors.md +62 -0
  1819. package/plugins/robin/claude/skills/gdd/references/frame.md +75 -0
  1820. package/plugins/robin/claude/skills/gdd/references/gameplay-contract.md +81 -0
  1821. package/plugins/robin/claude/skills/gdd/references/gdd-template.md +417 -0
  1822. package/plugins/robin/claude/skills/gdd/references/genre-card.md +109 -0
  1823. package/plugins/robin/claude/skills/gdd/references/genre-platformer.md +159 -0
  1824. package/plugins/robin/claude/skills/gdd/references/genre-puzzle.md +145 -0
  1825. package/plugins/robin/claude/skills/gdd/references/genre-racing.md +137 -0
  1826. package/plugins/robin/claude/skills/gdd/references/genre-rpg.md +125 -0
  1827. package/plugins/robin/claude/skills/gdd/references/genre-shooter.md +128 -0
  1828. package/plugins/robin/claude/skills/gdd/references/genre-simulation.md +112 -0
  1829. package/plugins/robin/claude/skills/gdd/references/genre-strategy.md +116 -0
  1830. package/plugins/robin/claude/skills/gdd/references/genre-survival.md +122 -0
  1831. package/plugins/robin/claude/skills/gdd/references/in-the-loop.md +106 -0
  1832. package/plugins/robin/claude/skills/gdd/references/invent-first.md +131 -0
  1833. package/plugins/robin/claude/skills/gdd/references/level-and-fun.md +112 -0
  1834. package/plugins/robin/claude/skills/gdd/references/pages.md +47 -0
  1835. package/plugins/robin/claude/skills/gdd/references/plan-at-size.md +140 -0
  1836. package/plugins/robin/claude/skills/gdd/references/production-tiers.md +117 -0
  1837. package/plugins/robin/claude/skills/gdd/references/sections.md +148 -0
  1838. package/plugins/robin/claude/skills/gdd/references/spec-folder.md +131 -0
  1839. package/plugins/robin/claude/skills/gdd/references/start.md +110 -0
  1840. package/plugins/robin/claude/skills/gdd/references/starters.md +175 -0
  1841. package/plugins/robin/claude/skills/gdd/references/the-path.md +133 -0
  1842. package/plugins/robin/claude/skills/gdd/references/track.md +29 -0
  1843. package/plugins/robin/claude/skills/gdd/references/world-and-identity.md +165 -0
  1844. package/plugins/robin/claude/skills/gdd/references/worth.md +74 -0
  1845. package/plugins/robin/claude/skills/mobile-ui/SKILL.md +107 -0
  1846. package/plugins/robin/claude/skills/mobile-ui/references/contrast.md +123 -0
  1847. package/plugins/robin/claude/skills/mobile-ui/references/hud-and-title.md +108 -0
  1848. package/plugins/robin/claude/skills/mobile-ui/references/hud-genres.md +124 -0
  1849. package/plugins/robin/claude/skills/mobile-ui/references/phone-check.md +156 -0
  1850. package/plugins/robin/claude/skills/mobile-ui/references/recipes.md +279 -0
  1851. package/plugins/robin/claude/skills/mobile-ui/references/restyle-ui.md +229 -0
  1852. package/plugins/robin/claude/skills/mobile-ui/references/unity.md +61 -0
  1853. package/plugins/robin/claude/skills/publishing/SKILL.md +109 -0
  1854. package/plugins/robin/claude/skills/publishing/references/compose.md +113 -0
  1855. package/plugins/robin/claude/skills/publishing/references/motion.md +120 -0
  1856. package/plugins/robin/claude/skills/publishing/references/networks.md +75 -0
  1857. package/plugins/robin/claude/skills/publishing/references/other-hosts.md +65 -0
  1858. package/plugins/robin/claude/skills/publishing/references/playable-ad.md +90 -0
  1859. package/plugins/robin/claude/skills/publishing/references/server-build.md +85 -0
  1860. package/plugins/robin/claude/skills/publishing/references/store-shots.md +85 -0
  1861. package/plugins/robin/claude/skills/publishing/references/trailer.md +55 -0
  1862. package/plugins/robin/claude/skills/publishing/references/what-ships.md +30 -0
  1863. package/plugins/robin/claude/skills/store/SKILL.md +81 -0
  1864. package/plugins/robin/claude/skills/store/references/app-store.md +73 -0
  1865. package/plugins/robin/claude/skills/store/references/google-play.md +141 -0
  1866. package/plugins/robin/claude/skills/store/references/ios-release.md +63 -0
  1867. package/plugins/robin/claude/skills/store/references/money.md +66 -0
  1868. package/plugins/robin/claude/skills/store/references/purchases-and-review.md +74 -0
  1869. package/plugins/robin/claude/skills/store/references/readiness-page.md +24 -0
  1870. package/plugins/robin/claude/skills/store/references/readiness.md +107 -0
  1871. package/plugins/robin/claude/skills/store/references/steam.md +38 -0
  1872. package/plugins/robin/claude/skills/store/references/unity-store.md +55 -0
  1873. package/plugins/robin/claude/skills/store/references/web-portals.md +43 -0
  1874. package/plugins/robin/claude/skills/unity-game/SKILL.md +103 -0
  1875. package/plugins/robin/claude/skills/unity-game/references/agent-ops.md +54 -0
  1876. package/plugins/robin/claude/skills/unity-game/references/fixes.md +40 -0
  1877. package/plugins/robin/claude/skills/unity-game/references/from-a-web-game.md +108 -0
  1878. package/plugins/robin/claude/skills/unity-game/references/handing-off.md +42 -0
  1879. package/plugins/robin/claude/skills/unity-game/references/performance.md +59 -0
  1880. package/plugins/robin/claude/skills/unity-game/references/probe.md +80 -0
  1881. package/plugins/robin/claude/skills/unity-game/references/shared-mac.md +121 -0
  1882. package/plugins/robin/claude/skills/unity-game/references/traps.md +108 -0
  1883. package/plugins/robin/claude/skills/verifying/SKILL.md +109 -0
  1884. package/plugins/robin/claude/skills/verifying/references/actors.md +94 -0
  1885. package/plugins/robin/claude/skills/verifying/references/bar.md +62 -0
  1886. package/plugins/robin/claude/skills/verifying/references/checks.md +69 -0
  1887. package/plugins/robin/claude/skills/verifying/references/experience.md +67 -0
  1888. package/plugins/robin/claude/skills/verifying/references/eyes.md +54 -0
  1889. package/plugins/robin/claude/skills/verifying/references/fidelity.md +126 -0
  1890. package/plugins/robin/claude/skills/verifying/references/hit-bar.md +31 -0
  1891. package/plugins/robin/claude/skills/verifying/references/journeys.md +77 -0
  1892. package/plugins/robin/claude/skills/verifying/references/mobile-qa.md +123 -0
  1893. package/plugins/robin/claude/skills/verifying/references/playtest.md +161 -0
  1894. package/plugins/robin/claude/skills/verifying/references/review.md +105 -0
  1895. package/plugins/robin/claude/skills/verifying/references/rubric.md +67 -0
  1896. package/plugins/robin/claude/skills/verifying/references/scenes.md +49 -0
  1897. package/plugins/robin/claude/skills/verifying/references/unity.md +60 -0
  1898. package/plugins/robin/claude/skills/world-and-story/SKILL.md +99 -0
  1899. package/plugins/robin/claude/skills/world-and-story/references/atmosphere.md +208 -0
  1900. package/plugins/robin/claude/skills/world-and-story/references/forged-world.md +79 -0
  1901. package/plugins/robin/claude/skills/world-and-story/references/living-world.md +237 -0
  1902. package/plugins/robin/claude/skills/world-and-story/references/opening-and-chapters.md +215 -0
  1903. package/plugins/robin/claude/skills/world-and-story/references/shelf.md +80 -0
  1904. package/plugins/robin/claude/skills/world-and-story/references/story-at-size.md +159 -0
  1905. package/plugins/robin/claude/skills/world-and-story/references/voice.md +175 -0
  1906. package/plugins/robin/claude/skills/world-and-story/references/world-kit.md +154 -0
  1907. package/plugins/robin/mcp-servers.json +25 -0
  1908. package/plugins/robin/plugin.json +20 -0
  1909. package/plugins/robin/skills/fp-first-look/SKILL.md +59 -0
  1910. package/plugins/robin/skills/fp-flow/SKILL.md +50 -0
  1911. package/plugins/robin/skills/fp-lanes/SKILL.md +38 -0
  1912. package/plugins/robin/skills/fp-mobile-qa/SKILL.md +28 -0
  1913. package/plugins/robin/skills/fp-new/SKILL.md +94 -0
  1914. package/plugins/robin/skills/fp-playtest/SKILL.md +66 -0
  1915. package/plugins/robin/skills/fp-publish/SKILL.md +23 -0
  1916. package/plugins/robin/skills/fp-smoke-build/SKILL.md +25 -0
  1917. package/plugins/robin/skills/fp-verify/SKILL.md +20 -0
  1918. package/plugins/robin/skills/funpixel-3d/SKILL.md +89 -0
  1919. package/plugins/robin/skills/funpixel-3d/references/bake-off.md +48 -0
  1920. package/plugins/robin/skills/funpixel-3d/references/bench.md +103 -0
  1921. package/plugins/robin/skills/funpixel-3d/references/budgets.md +48 -0
  1922. package/plugins/robin/skills/funpixel-3d/references/characters.md +67 -0
  1923. package/plugins/robin/skills/funpixel-3d/references/concept-image.md +47 -0
  1924. package/plugins/robin/skills/funpixel-3d/references/engine-targets.md +31 -0
  1925. package/plugins/robin/skills/funpixel-3d/references/hero-route.md +104 -0
  1926. package/plugins/robin/skills/funpixel-3d/references/level-spec.md +109 -0
  1927. package/plugins/robin/skills/funpixel-3d/references/levels.md +84 -0
  1928. package/plugins/robin/skills/funpixel-3d/references/light-and-places.md +141 -0
  1929. package/plugins/robin/skills/funpixel-3d/references/models.md +111 -0
  1930. package/plugins/robin/skills/funpixel-3d/references/painted-target.md +184 -0
  1931. package/plugins/robin/skills/funpixel-3d/references/reading.md +41 -0
  1932. package/plugins/robin/skills/funpixel-3d/references/skin.md +85 -0
  1933. package/plugins/robin/skills/funpixel-3d/references/skyboxes.md +65 -0
  1934. package/plugins/robin/skills/funpixel-3d/references/textures.md +71 -0
  1935. package/plugins/robin/skills/funpixel-3d/references/three-loading.md +199 -0
  1936. package/plugins/robin/skills/funpixel-3d/references/unity.md +78 -0
  1937. package/plugins/robin/skills/funpixel-art/SKILL.md +104 -0
  1938. package/plugins/robin/skills/funpixel-art/references/2d-assets.md +108 -0
  1939. package/plugins/robin/skills/funpixel-art/references/animation.md +126 -0
  1940. package/plugins/robin/skills/funpixel-art/references/cast.md +73 -0
  1941. package/plugins/robin/skills/funpixel-art/references/characters.md +49 -0
  1942. package/plugins/robin/skills/funpixel-art/references/cost.md +107 -0
  1943. package/plugins/robin/skills/funpixel-art/references/effects.md +85 -0
  1944. package/plugins/robin/skills/funpixel-art/references/frames.md +87 -0
  1945. package/plugins/robin/skills/funpixel-art/references/judging-frames.md +64 -0
  1946. package/plugins/robin/skills/funpixel-art/references/look.md +102 -0
  1947. package/plugins/robin/skills/funpixel-art/references/measure.md +119 -0
  1948. package/plugins/robin/skills/funpixel-art/references/pipeline.md +185 -0
  1949. package/plugins/robin/skills/funpixel-art/references/pixi.md +277 -0
  1950. package/plugins/robin/skills/funpixel-art/references/planes.md +27 -0
  1951. package/plugins/robin/skills/funpixel-art/references/prompts.md +171 -0
  1952. package/plugins/robin/skills/funpixel-art/references/sheets.md +141 -0
  1953. package/plugins/robin/skills/funpixel-art/references/style-file.md +39 -0
  1954. package/plugins/robin/skills/funpixel-art/references/three.md +232 -0
  1955. package/plugins/robin/skills/funpixel-art/references/ui.md +163 -0
  1956. package/plugins/robin/skills/funpixel-art/references/unity.md +78 -0
  1957. package/plugins/robin/skills/funpixel-art/references/wiring.md +41 -0
  1958. package/plugins/robin/skills/funpixel-audio/SKILL.md +92 -0
  1959. package/plugins/robin/skills/funpixel-audio/references/adaptive-music.md +204 -0
  1960. package/plugins/robin/skills/funpixel-audio/references/engine.md +78 -0
  1961. package/plugins/robin/skills/funpixel-audio/references/measure.md +101 -0
  1962. package/plugins/robin/skills/funpixel-audio/references/unity.md +74 -0
  1963. package/plugins/robin/skills/funpixel-brief/SKILL.md +163 -0
  1964. package/plugins/robin/skills/funpixel-feedback/SKILL.md +120 -0
  1965. package/plugins/robin/skills/funpixel-feedback/references/memory.md +99 -0
  1966. package/plugins/robin/skills/funpixel-game-feel/SKILL.md +104 -0
  1967. package/plugins/robin/skills/funpixel-game-feel/references/contact.md +110 -0
  1968. package/plugins/robin/skills/funpixel-game-feel/references/measure.md +125 -0
  1969. package/plugins/robin/skills/funpixel-game-feel/references/motion.md +134 -0
  1970. package/plugins/robin/skills/funpixel-game-feel/references/payoffs.md +35 -0
  1971. package/plugins/robin/skills/funpixel-game-feel/references/recipes.md +107 -0
  1972. package/plugins/robin/skills/funpixel-game-feel/references/unity.md +73 -0
  1973. package/plugins/robin/skills/funpixel-game-logic/SKILL.md +113 -0
  1974. package/plugins/robin/skills/funpixel-game-logic/references/balance.md +88 -0
  1975. package/plugins/robin/skills/funpixel-game-logic/references/content-at-scale.md +147 -0
  1976. package/plugins/robin/skills/funpixel-game-logic/references/depth.md +89 -0
  1977. package/plugins/robin/skills/funpixel-game-logic/references/escalation.md +41 -0
  1978. package/plugins/robin/skills/funpixel-game-logic/references/levels.md +61 -0
  1979. package/plugins/robin/skills/funpixel-game-logic/references/probes.md +122 -0
  1980. package/plugins/robin/skills/funpixel-game-logic/references/unity.md +108 -0
  1981. package/plugins/robin/skills/funpixel-game-spine/SKILL.md +118 -0
  1982. package/plugins/robin/skills/funpixel-game-spine/references/camera.md +94 -0
  1983. package/plugins/robin/skills/funpixel-game-spine/references/multiplayer.md +101 -0
  1984. package/plugins/robin/skills/funpixel-game-spine/references/patterns.md +103 -0
  1985. package/plugins/robin/skills/funpixel-game-spine/references/performance.md +96 -0
  1986. package/plugins/robin/skills/funpixel-game-spine/references/pixi.md +26 -0
  1987. package/plugins/robin/skills/funpixel-game-spine/references/replay.md +102 -0
  1988. package/plugins/robin/skills/funpixel-game-spine/references/room-api.md +63 -0
  1989. package/plugins/robin/skills/funpixel-game-spine/references/room-modes.md +40 -0
  1990. package/plugins/robin/skills/funpixel-game-spine/references/sdk.md +114 -0
  1991. package/plugins/robin/skills/funpixel-game-spine/references/three.md +62 -0
  1992. package/plugins/robin/skills/funpixel-gdd/SKILL.md +116 -0
  1993. package/plugins/robin/skills/funpixel-gdd/references/as-built.md +40 -0
  1994. package/plugins/robin/skills/funpixel-gdd/references/design-measures.md +24 -0
  1995. package/plugins/robin/skills/funpixel-gdd/references/design-note.md +88 -0
  1996. package/plugins/robin/skills/funpixel-gdd/references/experience.md +92 -0
  1997. package/plugins/robin/skills/funpixel-gdd/references/first-look.md +226 -0
  1998. package/plugins/robin/skills/funpixel-gdd/references/floors.md +62 -0
  1999. package/plugins/robin/skills/funpixel-gdd/references/frame.md +75 -0
  2000. package/plugins/robin/skills/funpixel-gdd/references/gameplay-contract.md +81 -0
  2001. package/plugins/robin/skills/funpixel-gdd/references/gdd-template.md +417 -0
  2002. package/plugins/robin/skills/funpixel-gdd/references/genre-card.md +109 -0
  2003. package/plugins/robin/skills/funpixel-gdd/references/genre-platformer.md +159 -0
  2004. package/plugins/robin/skills/funpixel-gdd/references/genre-puzzle.md +145 -0
  2005. package/plugins/robin/skills/funpixel-gdd/references/genre-racing.md +137 -0
  2006. package/plugins/robin/skills/funpixel-gdd/references/genre-rpg.md +125 -0
  2007. package/plugins/robin/skills/funpixel-gdd/references/genre-shooter.md +128 -0
  2008. package/plugins/robin/skills/funpixel-gdd/references/genre-simulation.md +112 -0
  2009. package/plugins/robin/skills/funpixel-gdd/references/genre-strategy.md +116 -0
  2010. package/plugins/robin/skills/funpixel-gdd/references/genre-survival.md +122 -0
  2011. package/plugins/robin/skills/funpixel-gdd/references/in-the-loop.md +106 -0
  2012. package/plugins/robin/skills/funpixel-gdd/references/invent-first.md +131 -0
  2013. package/plugins/robin/skills/funpixel-gdd/references/level-and-fun.md +112 -0
  2014. package/plugins/robin/skills/funpixel-gdd/references/pages.md +47 -0
  2015. package/plugins/robin/skills/funpixel-gdd/references/plan-at-size.md +140 -0
  2016. package/plugins/robin/skills/funpixel-gdd/references/production-tiers.md +117 -0
  2017. package/plugins/robin/skills/funpixel-gdd/references/sections.md +148 -0
  2018. package/plugins/robin/skills/funpixel-gdd/references/spec-folder.md +131 -0
  2019. package/plugins/robin/skills/funpixel-gdd/references/start.md +110 -0
  2020. package/plugins/robin/skills/funpixel-gdd/references/starters.md +175 -0
  2021. package/plugins/robin/skills/funpixel-gdd/references/the-path.md +133 -0
  2022. package/plugins/robin/skills/funpixel-gdd/references/track.md +29 -0
  2023. package/plugins/robin/skills/funpixel-gdd/references/world-and-identity.md +165 -0
  2024. package/plugins/robin/skills/funpixel-gdd/references/worth.md +74 -0
  2025. package/plugins/robin/skills/funpixel-mobile-ui/SKILL.md +107 -0
  2026. package/plugins/robin/skills/funpixel-mobile-ui/references/contrast.md +123 -0
  2027. package/plugins/robin/skills/funpixel-mobile-ui/references/hud-and-title.md +108 -0
  2028. package/plugins/robin/skills/funpixel-mobile-ui/references/hud-genres.md +124 -0
  2029. package/plugins/robin/skills/funpixel-mobile-ui/references/phone-check.md +156 -0
  2030. package/plugins/robin/skills/funpixel-mobile-ui/references/recipes.md +279 -0
  2031. package/plugins/robin/skills/funpixel-mobile-ui/references/restyle-ui.md +229 -0
  2032. package/plugins/robin/skills/funpixel-mobile-ui/references/unity.md +61 -0
  2033. package/plugins/robin/skills/funpixel-publish/SKILL.md +109 -0
  2034. package/plugins/robin/skills/funpixel-publish/references/compose.md +113 -0
  2035. package/plugins/robin/skills/funpixel-publish/references/motion.md +120 -0
  2036. package/plugins/robin/skills/funpixel-publish/references/networks.md +75 -0
  2037. package/plugins/robin/skills/funpixel-publish/references/other-hosts.md +65 -0
  2038. package/plugins/robin/skills/funpixel-publish/references/playable-ad.md +90 -0
  2039. package/plugins/robin/skills/funpixel-publish/references/server-build.md +85 -0
  2040. package/plugins/robin/skills/funpixel-publish/references/store-shots.md +85 -0
  2041. package/plugins/robin/skills/funpixel-publish/references/trailer.md +55 -0
  2042. package/plugins/robin/skills/funpixel-publish/references/what-ships.md +30 -0
  2043. package/plugins/robin/skills/funpixel-store/SKILL.md +81 -0
  2044. package/plugins/robin/skills/funpixel-store/references/app-store.md +73 -0
  2045. package/plugins/robin/skills/funpixel-store/references/google-play.md +141 -0
  2046. package/plugins/robin/skills/funpixel-store/references/ios-release.md +63 -0
  2047. package/plugins/robin/skills/funpixel-store/references/money.md +66 -0
  2048. package/plugins/robin/skills/funpixel-store/references/purchases-and-review.md +74 -0
  2049. package/plugins/robin/skills/funpixel-store/references/readiness-page.md +24 -0
  2050. package/plugins/robin/skills/funpixel-store/references/readiness.md +107 -0
  2051. package/plugins/robin/skills/funpixel-store/references/steam.md +38 -0
  2052. package/plugins/robin/skills/funpixel-store/references/unity-store.md +55 -0
  2053. package/plugins/robin/skills/funpixel-store/references/web-portals.md +43 -0
  2054. package/plugins/robin/skills/funpixel-unity-game/SKILL.md +103 -0
  2055. package/plugins/robin/skills/funpixel-unity-game/references/agent-ops.md +54 -0
  2056. package/plugins/robin/skills/funpixel-unity-game/references/fixes.md +40 -0
  2057. package/plugins/robin/skills/funpixel-unity-game/references/from-a-web-game.md +108 -0
  2058. package/plugins/robin/skills/funpixel-unity-game/references/handing-off.md +42 -0
  2059. package/plugins/robin/skills/funpixel-unity-game/references/performance.md +59 -0
  2060. package/plugins/robin/skills/funpixel-unity-game/references/probe.md +80 -0
  2061. package/plugins/robin/skills/funpixel-unity-game/references/shared-mac.md +121 -0
  2062. package/plugins/robin/skills/funpixel-unity-game/references/traps.md +108 -0
  2063. package/plugins/robin/skills/funpixel-verify/SKILL.md +109 -0
  2064. package/plugins/robin/skills/funpixel-verify/references/actors.md +94 -0
  2065. package/plugins/robin/skills/funpixel-verify/references/bar.md +62 -0
  2066. package/plugins/robin/skills/funpixel-verify/references/checks.md +69 -0
  2067. package/plugins/robin/skills/funpixel-verify/references/experience.md +67 -0
  2068. package/plugins/robin/skills/funpixel-verify/references/eyes.md +54 -0
  2069. package/plugins/robin/skills/funpixel-verify/references/fidelity.md +126 -0
  2070. package/plugins/robin/skills/funpixel-verify/references/hit-bar.md +31 -0
  2071. package/plugins/robin/skills/funpixel-verify/references/journeys.md +77 -0
  2072. package/plugins/robin/skills/funpixel-verify/references/mobile-qa.md +123 -0
  2073. package/plugins/robin/skills/funpixel-verify/references/playtest.md +161 -0
  2074. package/plugins/robin/skills/funpixel-verify/references/review.md +105 -0
  2075. package/plugins/robin/skills/funpixel-verify/references/rubric.md +67 -0
  2076. package/plugins/robin/skills/funpixel-verify/references/scenes.md +49 -0
  2077. package/plugins/robin/skills/funpixel-verify/references/unity.md +60 -0
  2078. package/plugins/robin/skills/funpixel-world-and-story/SKILL.md +99 -0
  2079. package/plugins/robin/skills/funpixel-world-and-story/references/atmosphere.md +208 -0
  2080. package/plugins/robin/skills/funpixel-world-and-story/references/forged-world.md +79 -0
  2081. package/plugins/robin/skills/funpixel-world-and-story/references/living-world.md +237 -0
  2082. package/plugins/robin/skills/funpixel-world-and-story/references/opening-and-chapters.md +215 -0
  2083. package/plugins/robin/skills/funpixel-world-and-story/references/shelf.md +80 -0
  2084. package/plugins/robin/skills/funpixel-world-and-story/references/story-at-size.md +159 -0
  2085. package/plugins/robin/skills/funpixel-world-and-story/references/voice.md +175 -0
  2086. package/plugins/robin/skills/funpixel-world-and-story/references/world-kit.md +154 -0
  2087. package/templates/common/.agents/skills/funpixel-3d/SKILL.md +89 -0
  2088. package/templates/common/.agents/skills/funpixel-3d/references/bake-off.md +48 -0
  2089. package/templates/common/.agents/skills/funpixel-3d/references/bench.md +103 -0
  2090. package/templates/common/.agents/skills/funpixel-3d/references/budgets.md +48 -0
  2091. package/templates/common/.agents/skills/funpixel-3d/references/characters.md +67 -0
  2092. package/templates/common/.agents/skills/funpixel-3d/references/concept-image.md +47 -0
  2093. package/templates/common/.agents/skills/funpixel-3d/references/engine-targets.md +31 -0
  2094. package/templates/common/.agents/skills/funpixel-3d/references/hero-route.md +104 -0
  2095. package/templates/common/.agents/skills/funpixel-3d/references/level-spec.md +109 -0
  2096. package/templates/common/.agents/skills/funpixel-3d/references/levels.md +84 -0
  2097. package/templates/common/.agents/skills/funpixel-3d/references/light-and-places.md +141 -0
  2098. package/templates/common/.agents/skills/funpixel-3d/references/models.md +111 -0
  2099. package/templates/common/.agents/skills/funpixel-3d/references/painted-target.md +184 -0
  2100. package/templates/common/.agents/skills/funpixel-3d/references/reading.md +41 -0
  2101. package/templates/common/.agents/skills/funpixel-3d/references/skin.md +85 -0
  2102. package/templates/common/.agents/skills/funpixel-3d/references/skyboxes.md +65 -0
  2103. package/templates/common/.agents/skills/funpixel-3d/references/textures.md +71 -0
  2104. package/templates/common/.agents/skills/funpixel-3d/references/three-loading.md +199 -0
  2105. package/templates/common/.agents/skills/funpixel-3d/references/unity.md +78 -0
  2106. package/templates/common/.agents/skills/funpixel-art/SKILL.md +104 -0
  2107. package/templates/common/.agents/skills/funpixel-art/references/2d-assets.md +108 -0
  2108. package/templates/common/.agents/skills/funpixel-art/references/animation.md +126 -0
  2109. package/templates/common/.agents/skills/funpixel-art/references/cast.md +73 -0
  2110. package/templates/common/.agents/skills/funpixel-art/references/characters.md +49 -0
  2111. package/templates/common/.agents/skills/funpixel-art/references/cost.md +107 -0
  2112. package/templates/common/.agents/skills/funpixel-art/references/effects.md +85 -0
  2113. package/templates/common/.agents/skills/funpixel-art/references/frames.md +87 -0
  2114. package/templates/common/.agents/skills/funpixel-art/references/judging-frames.md +64 -0
  2115. package/templates/common/.agents/skills/funpixel-art/references/look.md +102 -0
  2116. package/templates/common/.agents/skills/funpixel-art/references/measure.md +119 -0
  2117. package/templates/common/.agents/skills/funpixel-art/references/pipeline.md +185 -0
  2118. package/templates/common/.agents/skills/funpixel-art/references/pixi.md +277 -0
  2119. package/templates/common/.agents/skills/funpixel-art/references/planes.md +27 -0
  2120. package/templates/common/.agents/skills/funpixel-art/references/prompts.md +171 -0
  2121. package/templates/common/.agents/skills/funpixel-art/references/sheets.md +141 -0
  2122. package/templates/common/.agents/skills/funpixel-art/references/style-file.md +39 -0
  2123. package/templates/common/.agents/skills/funpixel-art/references/three.md +232 -0
  2124. package/templates/common/.agents/skills/funpixel-art/references/ui.md +163 -0
  2125. package/templates/common/.agents/skills/funpixel-art/references/unity.md +78 -0
  2126. package/templates/common/.agents/skills/funpixel-art/references/wiring.md +41 -0
  2127. package/templates/common/.agents/skills/funpixel-audio/SKILL.md +92 -0
  2128. package/templates/common/.agents/skills/funpixel-audio/references/adaptive-music.md +204 -0
  2129. package/templates/common/.agents/skills/funpixel-audio/references/engine.md +78 -0
  2130. package/templates/common/.agents/skills/funpixel-audio/references/measure.md +101 -0
  2131. package/templates/common/.agents/skills/funpixel-audio/references/unity.md +74 -0
  2132. package/templates/common/.agents/skills/funpixel-feedback/SKILL.md +120 -0
  2133. package/templates/common/.agents/skills/funpixel-feedback/references/memory.md +99 -0
  2134. package/templates/common/.agents/skills/funpixel-game-feel/SKILL.md +104 -0
  2135. package/templates/common/.agents/skills/funpixel-game-feel/references/contact.md +110 -0
  2136. package/templates/common/.agents/skills/funpixel-game-feel/references/measure.md +125 -0
  2137. package/templates/common/.agents/skills/funpixel-game-feel/references/motion.md +134 -0
  2138. package/templates/common/.agents/skills/funpixel-game-feel/references/payoffs.md +35 -0
  2139. package/templates/common/.agents/skills/funpixel-game-feel/references/recipes.md +107 -0
  2140. package/templates/common/.agents/skills/funpixel-game-feel/references/unity.md +73 -0
  2141. package/templates/common/.agents/skills/funpixel-game-logic/SKILL.md +113 -0
  2142. package/templates/common/.agents/skills/funpixel-game-logic/references/balance.md +88 -0
  2143. package/templates/common/.agents/skills/funpixel-game-logic/references/content-at-scale.md +147 -0
  2144. package/templates/common/.agents/skills/funpixel-game-logic/references/depth.md +89 -0
  2145. package/templates/common/.agents/skills/funpixel-game-logic/references/escalation.md +41 -0
  2146. package/templates/common/.agents/skills/funpixel-game-logic/references/levels.md +61 -0
  2147. package/templates/common/.agents/skills/funpixel-game-logic/references/probes.md +122 -0
  2148. package/templates/common/.agents/skills/funpixel-game-logic/references/unity.md +108 -0
  2149. package/templates/common/.agents/skills/funpixel-game-spine/SKILL.md +118 -0
  2150. package/templates/common/.agents/skills/funpixel-game-spine/references/camera.md +94 -0
  2151. package/templates/common/.agents/skills/funpixel-game-spine/references/multiplayer.md +101 -0
  2152. package/templates/common/.agents/skills/funpixel-game-spine/references/patterns.md +103 -0
  2153. package/templates/common/.agents/skills/funpixel-game-spine/references/performance.md +96 -0
  2154. package/templates/common/.agents/skills/funpixel-game-spine/references/pixi.md +26 -0
  2155. package/templates/common/.agents/skills/funpixel-game-spine/references/replay.md +102 -0
  2156. package/templates/common/.agents/skills/funpixel-game-spine/references/room-api.md +63 -0
  2157. package/templates/common/.agents/skills/funpixel-game-spine/references/room-modes.md +40 -0
  2158. package/templates/common/.agents/skills/funpixel-game-spine/references/sdk.md +114 -0
  2159. package/templates/common/.agents/skills/funpixel-game-spine/references/three.md +62 -0
  2160. package/templates/common/.agents/skills/funpixel-gdd/SKILL.md +116 -0
  2161. package/templates/common/.agents/skills/funpixel-gdd/references/as-built.md +40 -0
  2162. package/templates/common/.agents/skills/funpixel-gdd/references/design-measures.md +24 -0
  2163. package/templates/common/.agents/skills/funpixel-gdd/references/design-note.md +88 -0
  2164. package/templates/common/.agents/skills/funpixel-gdd/references/experience.md +92 -0
  2165. package/templates/common/.agents/skills/funpixel-gdd/references/first-look.md +226 -0
  2166. package/templates/common/.agents/skills/funpixel-gdd/references/floors.md +62 -0
  2167. package/templates/common/.agents/skills/funpixel-gdd/references/frame.md +75 -0
  2168. package/templates/common/.agents/skills/funpixel-gdd/references/gameplay-contract.md +81 -0
  2169. package/templates/common/.agents/skills/funpixel-gdd/references/gdd-template.md +417 -0
  2170. package/templates/common/.agents/skills/funpixel-gdd/references/genre-card.md +109 -0
  2171. package/templates/common/.agents/skills/funpixel-gdd/references/genre-platformer.md +159 -0
  2172. package/templates/common/.agents/skills/funpixel-gdd/references/genre-puzzle.md +145 -0
  2173. package/templates/common/.agents/skills/funpixel-gdd/references/genre-racing.md +137 -0
  2174. package/templates/common/.agents/skills/funpixel-gdd/references/genre-rpg.md +125 -0
  2175. package/templates/common/.agents/skills/funpixel-gdd/references/genre-shooter.md +128 -0
  2176. package/templates/common/.agents/skills/funpixel-gdd/references/genre-simulation.md +112 -0
  2177. package/templates/common/.agents/skills/funpixel-gdd/references/genre-strategy.md +116 -0
  2178. package/templates/common/.agents/skills/funpixel-gdd/references/genre-survival.md +122 -0
  2179. package/templates/common/.agents/skills/funpixel-gdd/references/in-the-loop.md +106 -0
  2180. package/templates/common/.agents/skills/funpixel-gdd/references/invent-first.md +131 -0
  2181. package/templates/common/.agents/skills/funpixel-gdd/references/level-and-fun.md +112 -0
  2182. package/templates/common/.agents/skills/funpixel-gdd/references/pages.md +47 -0
  2183. package/templates/common/.agents/skills/funpixel-gdd/references/plan-at-size.md +140 -0
  2184. package/templates/common/.agents/skills/funpixel-gdd/references/production-tiers.md +117 -0
  2185. package/templates/common/.agents/skills/funpixel-gdd/references/sections.md +148 -0
  2186. package/templates/common/.agents/skills/funpixel-gdd/references/spec-folder.md +131 -0
  2187. package/templates/common/.agents/skills/funpixel-gdd/references/start.md +110 -0
  2188. package/templates/common/.agents/skills/funpixel-gdd/references/starters.md +175 -0
  2189. package/templates/common/.agents/skills/funpixel-gdd/references/the-path.md +133 -0
  2190. package/templates/common/.agents/skills/funpixel-gdd/references/track.md +29 -0
  2191. package/templates/common/.agents/skills/funpixel-gdd/references/world-and-identity.md +165 -0
  2192. package/templates/common/.agents/skills/funpixel-gdd/references/worth.md +74 -0
  2193. package/templates/common/.agents/skills/funpixel-mobile-ui/SKILL.md +107 -0
  2194. package/templates/common/.agents/skills/funpixel-mobile-ui/references/contrast.md +123 -0
  2195. package/templates/common/.agents/skills/funpixel-mobile-ui/references/hud-and-title.md +108 -0
  2196. package/templates/common/.agents/skills/funpixel-mobile-ui/references/hud-genres.md +124 -0
  2197. package/templates/common/.agents/skills/funpixel-mobile-ui/references/phone-check.md +156 -0
  2198. package/templates/common/.agents/skills/funpixel-mobile-ui/references/recipes.md +279 -0
  2199. package/templates/common/.agents/skills/funpixel-mobile-ui/references/restyle-ui.md +229 -0
  2200. package/templates/common/.agents/skills/funpixel-mobile-ui/references/unity.md +61 -0
  2201. package/templates/common/.agents/skills/funpixel-publish/SKILL.md +109 -0
  2202. package/templates/common/.agents/skills/funpixel-publish/references/compose.md +113 -0
  2203. package/templates/common/.agents/skills/funpixel-publish/references/motion.md +120 -0
  2204. package/templates/common/.agents/skills/funpixel-publish/references/networks.md +75 -0
  2205. package/templates/common/.agents/skills/funpixel-publish/references/other-hosts.md +65 -0
  2206. package/templates/common/.agents/skills/funpixel-publish/references/playable-ad.md +90 -0
  2207. package/templates/common/.agents/skills/funpixel-publish/references/server-build.md +85 -0
  2208. package/templates/common/.agents/skills/funpixel-publish/references/store-shots.md +85 -0
  2209. package/templates/common/.agents/skills/funpixel-publish/references/trailer.md +55 -0
  2210. package/templates/common/.agents/skills/funpixel-publish/references/what-ships.md +30 -0
  2211. package/templates/common/.agents/skills/funpixel-store/SKILL.md +81 -0
  2212. package/templates/common/.agents/skills/funpixel-store/references/app-store.md +73 -0
  2213. package/templates/common/.agents/skills/funpixel-store/references/google-play.md +141 -0
  2214. package/templates/common/.agents/skills/funpixel-store/references/ios-release.md +63 -0
  2215. package/templates/common/.agents/skills/funpixel-store/references/money.md +66 -0
  2216. package/templates/common/.agents/skills/funpixel-store/references/purchases-and-review.md +74 -0
  2217. package/templates/common/.agents/skills/funpixel-store/references/readiness-page.md +24 -0
  2218. package/templates/common/.agents/skills/funpixel-store/references/readiness.md +107 -0
  2219. package/templates/common/.agents/skills/funpixel-store/references/steam.md +38 -0
  2220. package/templates/common/.agents/skills/funpixel-store/references/unity-store.md +55 -0
  2221. package/templates/common/.agents/skills/funpixel-store/references/web-portals.md +43 -0
  2222. package/templates/common/.agents/skills/funpixel-unity-game/SKILL.md +103 -0
  2223. package/templates/common/.agents/skills/funpixel-unity-game/references/agent-ops.md +54 -0
  2224. package/templates/common/.agents/skills/funpixel-unity-game/references/fixes.md +40 -0
  2225. package/templates/common/.agents/skills/funpixel-unity-game/references/from-a-web-game.md +108 -0
  2226. package/templates/common/.agents/skills/funpixel-unity-game/references/handing-off.md +42 -0
  2227. package/templates/common/.agents/skills/funpixel-unity-game/references/performance.md +59 -0
  2228. package/templates/common/.agents/skills/funpixel-unity-game/references/probe.md +80 -0
  2229. package/templates/common/.agents/skills/funpixel-unity-game/references/shared-mac.md +121 -0
  2230. package/templates/common/.agents/skills/funpixel-unity-game/references/traps.md +108 -0
  2231. package/templates/common/.agents/skills/funpixel-verify/SKILL.md +109 -0
  2232. package/templates/common/.agents/skills/funpixel-verify/references/actors.md +94 -0
  2233. package/templates/common/.agents/skills/funpixel-verify/references/bar.md +62 -0
  2234. package/templates/common/.agents/skills/funpixel-verify/references/checks.md +69 -0
  2235. package/templates/common/.agents/skills/funpixel-verify/references/experience.md +67 -0
  2236. package/templates/common/.agents/skills/funpixel-verify/references/eyes.md +54 -0
  2237. package/templates/common/.agents/skills/funpixel-verify/references/fidelity.md +126 -0
  2238. package/templates/common/.agents/skills/funpixel-verify/references/hit-bar.md +31 -0
  2239. package/templates/common/.agents/skills/funpixel-verify/references/journeys.md +77 -0
  2240. package/templates/common/.agents/skills/funpixel-verify/references/mobile-qa.md +123 -0
  2241. package/templates/common/.agents/skills/funpixel-verify/references/playtest.md +161 -0
  2242. package/templates/common/.agents/skills/funpixel-verify/references/review.md +105 -0
  2243. package/templates/common/.agents/skills/funpixel-verify/references/rubric.md +67 -0
  2244. package/templates/common/.agents/skills/funpixel-verify/references/scenes.md +49 -0
  2245. package/templates/common/.agents/skills/funpixel-verify/references/unity.md +60 -0
  2246. package/templates/common/.agents/skills/funpixel-world-and-story/SKILL.md +99 -0
  2247. package/templates/common/.agents/skills/funpixel-world-and-story/references/atmosphere.md +208 -0
  2248. package/templates/common/.agents/skills/funpixel-world-and-story/references/forged-world.md +79 -0
  2249. package/templates/common/.agents/skills/funpixel-world-and-story/references/living-world.md +237 -0
  2250. package/templates/common/.agents/skills/funpixel-world-and-story/references/opening-and-chapters.md +215 -0
  2251. package/templates/common/.agents/skills/funpixel-world-and-story/references/shelf.md +80 -0
  2252. package/templates/common/.agents/skills/funpixel-world-and-story/references/story-at-size.md +159 -0
  2253. package/templates/common/.agents/skills/funpixel-world-and-story/references/voice.md +175 -0
  2254. package/templates/common/.agents/skills/funpixel-world-and-story/references/world-kit.md +154 -0
  2255. package/templates/common/.claude/settings.json +3 -0
  2256. package/templates/common/.harnessignore +28 -0
  2257. package/templates/common/AGENTS.md +135 -0
  2258. package/templates/common/CLAUDE.md +1 -0
  2259. package/templates/common/assets/assets.example.json +9 -0
  2260. package/templates/common/index.html +13 -0
  2261. package/templates/common/src/art/files.mjs +27 -0
  2262. package/templates/common/src/assets.ts +62 -0
  2263. package/templates/common/src/beat.ts +50 -0
  2264. package/templates/common/src/characters.ts +54 -0
  2265. package/templates/common/src/expose.ts +63 -0
  2266. package/templates/common/src/feel.ts +78 -0
  2267. package/templates/common/src/fpx-hooks.ts +46 -0
  2268. package/templates/common/src/frame.ts +63 -0
  2269. package/templates/common/src/grade.ts +47 -0
  2270. package/templates/common/src/hud-kit.css +29 -0
  2271. package/templates/common/src/hud-kit.tsx +85 -0
  2272. package/templates/common/src/hud.tsx +55 -0
  2273. package/templates/common/src/icons.tsx +35 -0
  2274. package/templates/common/src/input.ts +70 -0
  2275. package/templates/common/src/juice.ts +92 -0
  2276. package/templates/common/src/levels.ts +43 -0
  2277. package/templates/common/src/living.ts +91 -0
  2278. package/templates/common/src/look.json +19 -0
  2279. package/templates/common/src/look.ts +54 -0
  2280. package/templates/common/src/main.tsx +31 -0
  2281. package/templates/common/src/markers.ts +60 -0
  2282. package/templates/common/src/motion-sample.ts +71 -0
  2283. package/templates/common/src/motion.ts +92 -0
  2284. package/templates/common/src/pin.ts +32 -0
  2285. package/templates/common/src/platform.ts +67 -0
  2286. package/templates/common/src/pose.ts +22 -0
  2287. package/templates/common/src/probe-human.ts +29 -0
  2288. package/templates/common/src/probe-kit.ts +99 -0
  2289. package/templates/common/src/rules.ts +99 -0
  2290. package/templates/common/src/save.ts +21 -0
  2291. package/templates/common/src/screens.css +34 -0
  2292. package/templates/common/src/screens.tsx +95 -0
  2293. package/templates/common/src/selftests.ts +22 -0
  2294. package/templates/common/src/session.ts +99 -0
  2295. package/templates/common/src/sound.ts +85 -0
  2296. package/templates/common/src/splash-funpixel/OFL.txt +94 -0
  2297. package/templates/common/src/splash-funpixel/card.css +18 -0
  2298. package/templates/common/src/splash-funpixel/card.tsx +22 -0
  2299. package/templates/common/src/splash.css +15 -0
  2300. package/templates/common/src/splash.tsx +86 -0
  2301. package/templates/common/src/store.ts +68 -0
  2302. package/templates/common/src/strike.ts +82 -0
  2303. package/templates/common/src/styles.css +81 -0
  2304. package/templates/common/src/toasts.ts +75 -0
  2305. package/templates/common/src/world.ts +91 -0
  2306. package/templates/common/test/feel.json +36 -0
  2307. package/templates/common/test/platform.test.ts +42 -0
  2308. package/templates/common/test/probes.ts +72 -0
  2309. package/templates/common/test/rules.test.ts +88 -0
  2310. package/templates/common/tsconfig.json +16 -0
  2311. package/templates/common/vite.config.ts +6 -0
  2312. package/templates/pixi/src/character.ts +63 -0
  2313. package/templates/pixi/src/game.ts +99 -0
  2314. package/templates/pixi/src/world-hud.ts +16 -0
  2315. package/templates/spec/common/src/chapters.ts +97 -0
  2316. package/templates/spec/common/src/levels.ts +68 -0
  2317. package/templates/spec/common/src/probe-rooms.ts +63 -0
  2318. package/templates/spec/common/src/room-map.tsx +30 -0
  2319. package/templates/spec/common/src/tune.ts +93 -0
  2320. package/templates/spec/common/test/rooms.test.ts +59 -0
  2321. package/templates/spec/common/test/rooms.ts +53 -0
  2322. package/templates/spec/three-world/test/rooms.ts +54 -0
  2323. package/templates/three/src/character.ts +65 -0
  2324. package/templates/three/src/game.ts +99 -0
  2325. package/templates/three/src/world-hud.ts +22 -0
  2326. package/templates/three-world/src/bot.ts +43 -0
  2327. package/templates/three-world/src/budget.ts +73 -0
  2328. package/templates/three-world/src/camera-rig.ts +99 -0
  2329. package/templates/three-world/src/controls.tsx +49 -0
  2330. package/templates/three-world/src/cutout-atlas.ts +26 -0
  2331. package/templates/three-world/src/cutout-math.ts +47 -0
  2332. package/templates/three-world/src/cutouts.ts +99 -0
  2333. package/templates/three-world/src/dressing-math.ts +98 -0
  2334. package/templates/three-world/src/dressing.ts +84 -0
  2335. package/templates/three-world/src/expose.ts +82 -0
  2336. package/templates/three-world/src/feel.ts +79 -0
  2337. package/templates/three-world/src/game.ts +99 -0
  2338. package/templates/three-world/src/hud.tsx +44 -0
  2339. package/templates/three-world/src/icons.tsx +36 -0
  2340. package/templates/three-world/src/input.ts +73 -0
  2341. package/templates/three-world/src/juice.ts +91 -0
  2342. package/templates/three-world/src/layout.ts +73 -0
  2343. package/templates/three-world/src/light-math.ts +78 -0
  2344. package/templates/three-world/src/light.ts +77 -0
  2345. package/templates/three-world/src/look.json +30 -0
  2346. package/templates/three-world/src/main.tsx +38 -0
  2347. package/templates/three-world/src/models.ts +62 -0
  2348. package/templates/three-world/src/palette.ts +21 -0
  2349. package/templates/three-world/src/places.json +50 -0
  2350. package/templates/three-world/src/places.ts +56 -0
  2351. package/templates/three-world/src/pose.ts +22 -0
  2352. package/templates/three-world/src/post.ts +47 -0
  2353. package/templates/three-world/src/rest-math.ts +29 -0
  2354. package/templates/three-world/src/rules.ts +89 -0
  2355. package/templates/three-world/src/screens.css +45 -0
  2356. package/templates/three-world/src/screens.tsx +96 -0
  2357. package/templates/three-world/src/selftests.ts +25 -0
  2358. package/templates/three-world/src/session.ts +99 -0
  2359. package/templates/three-world/src/shots.ts +59 -0
  2360. package/templates/three-world/src/sky.ts +48 -0
  2361. package/templates/three-world/src/stage.ts +83 -0
  2362. package/templates/three-world/src/styles.css +95 -0
  2363. package/templates/three-world/src/surfaces.ts +55 -0
  2364. package/templates/three-world/src/world.ts +70 -0
  2365. package/templates/three-world/test/feel.json +29 -0
  2366. package/templates/three-world/test/probes.ts +65 -0
  2367. package/templates/three-world/test/resolve.mjs +13 -0
  2368. package/templates/three-world/test/rules.test.ts +81 -0
  2369. package/unity/com.funpixel.probe/Editor/Funpixel.Probe.Editor.asmdef +16 -0
  2370. package/unity/com.funpixel.probe/Editor/Funpixel.Probe.Editor.asmdef.meta +7 -0
  2371. package/unity/com.funpixel.probe/Editor/ProbeBuild.cs +97 -0
  2372. package/unity/com.funpixel.probe/Editor/ProbeBuild.cs.meta +11 -0
  2373. package/unity/com.funpixel.probe/Editor/ReleaseGuard.cs +23 -0
  2374. package/unity/com.funpixel.probe/Editor/ReleaseGuard.cs.meta +11 -0
  2375. package/unity/com.funpixel.probe/Editor.meta +8 -0
  2376. package/unity/com.funpixel.probe/Runtime/Api/Funpixel.Probe.asmdef +14 -0
  2377. package/unity/com.funpixel.probe/Runtime/Api/Funpixel.Probe.asmdef.meta +7 -0
  2378. package/unity/com.funpixel.probe/Runtime/Api/FunpixelProbe.cs +146 -0
  2379. package/unity/com.funpixel.probe/Runtime/Api/FunpixelProbe.cs.meta +11 -0
  2380. package/unity/com.funpixel.probe/Runtime/Api.meta +8 -0
  2381. package/unity/com.funpixel.probe/Runtime/Player/Args.cs +87 -0
  2382. package/unity/com.funpixel.probe/Runtime/Player/Args.cs.meta +11 -0
  2383. package/unity/com.funpixel.probe/Runtime/Player/Boot.cs +67 -0
  2384. package/unity/com.funpixel.probe/Runtime/Player/Boot.cs.meta +11 -0
  2385. package/unity/com.funpixel.probe/Runtime/Player/Bridge.cs +559 -0
  2386. package/unity/com.funpixel.probe/Runtime/Player/Bridge.cs.meta +11 -0
  2387. package/unity/com.funpixel.probe/Runtime/Player/Capture.cs +145 -0
  2388. package/unity/com.funpixel.probe/Runtime/Player/Capture.cs.meta +11 -0
  2389. package/unity/com.funpixel.probe/Runtime/Player/Funpixel.Probe.Player.asmdef +32 -0
  2390. package/unity/com.funpixel.probe/Runtime/Player/Funpixel.Probe.Player.asmdef.meta +7 -0
  2391. package/unity/com.funpixel.probe/Runtime/Player/Inject.cs +127 -0
  2392. package/unity/com.funpixel.probe/Runtime/Player/Inject.cs.meta +11 -0
  2393. package/unity/com.funpixel.probe/Runtime/Player/Json.cs +246 -0
  2394. package/unity/com.funpixel.probe/Runtime/Player/Json.cs.meta +11 -0
  2395. package/unity/com.funpixel.probe/Runtime/Player/Probe.cs +194 -0
  2396. package/unity/com.funpixel.probe/Runtime/Player/Probe.cs.meta +11 -0
  2397. package/unity/com.funpixel.probe/Runtime/Player/Stats.cs +266 -0
  2398. package/unity/com.funpixel.probe/Runtime/Player/Stats.cs.meta +11 -0
  2399. package/unity/com.funpixel.probe/Runtime/Player/UiTargets.cs +134 -0
  2400. package/unity/com.funpixel.probe/Runtime/Player/UiTargets.cs.meta +11 -0
  2401. package/unity/com.funpixel.probe/Runtime/Player.meta +8 -0
  2402. package/unity/com.funpixel.probe/Runtime/link.xml +7 -0
  2403. package/unity/com.funpixel.probe/Runtime/link.xml.meta +7 -0
  2404. package/unity/com.funpixel.probe/Runtime.meta +8 -0
  2405. package/unity/com.funpixel.probe/Tests/Editor/Funpixel.Probe.Tests.asmdef +25 -0
  2406. package/unity/com.funpixel.probe/Tests/Editor/Funpixel.Probe.Tests.asmdef.meta +7 -0
  2407. package/unity/com.funpixel.probe/Tests/Editor/StatsTests.cs +147 -0
  2408. package/unity/com.funpixel.probe/Tests/Editor/StatsTests.cs.meta +11 -0
  2409. package/unity/com.funpixel.probe/Tests/Editor/WireTests.cs +86 -0
  2410. package/unity/com.funpixel.probe/Tests/Editor/WireTests.cs.meta +11 -0
  2411. package/unity/com.funpixel.probe/Tests/Editor.meta +8 -0
  2412. package/unity/com.funpixel.probe/Tests.meta +8 -0
  2413. package/unity/com.funpixel.probe/package.json +14 -0
  2414. package/unity/com.funpixel.probe/package.json.meta +7 -0
@@ -0,0 +1 @@
1
+ var FunpixelKapture=function(t){"use strict";function e(t){const e=Object.create(null);try{if(!t||"object"!=typeof t)return e;for(const[n,r]of Object.entries(t)){if(!n)continue;if(!r||"object"!=typeof r)continue;const t=r;"function"==typeof t.enter&&(e[n]={enter:t.enter,after:"string"==typeof t.after?t.after:void 0,motion:!0===t.motion})}}catch{}return e}function n(t){return Object.entries(t).map(([t,e])=>({id:t,after:e.after,motion:!0===e.motion}))}let r=0,o=!1;function i(){if(o)return;o=!0;const t=()=>{try{r=performance.now()}catch{}try{requestAnimationFrame(t)}catch{}};try{requestAnimationFrame(t)}catch{o=!1}}function c(){try{let t=0;const e=document.images;for(let n=0;n<e.length;n++)e[n].complete||t++;return t}catch{return 0}}function s(){try{const t=document.fonts;return t&&"loading"===t.status?1:0}catch{return 0}}function a(t){try{const e=t??performance.now();return r>0&&e-r<500}catch{return!1}}function u(t){const e=c(),n=s(),r=a();return{ok:0===e&&0===n&&r,pendingImages:e,pendingFonts:n,rafAlive:r,errors:t}}function f(t=5e3){return new Promise(e=>{const n=Date.now();let r=0;const o=()=>{try{if(0===c()&&0===s()?r++:r=0,r>=2)return e(!0);if(Date.now()-n>t)return e(!1);requestAnimationFrame(o)}catch{e(!1)}};try{requestAnimationFrame(o)}catch{e(!1)}})}const d=new Map;let l="__boot__",w=!1;function _(t){try{let e=d.get(l);if(e||(e=[],d.set(l,e)),e.length>=8)return;e.includes(t)||e.push(t)}catch{}}function h(){if(!w){w=!0;try{window.addEventListener("error",t=>{const e=t.error;_(e?.stack?String(e.stack).split("\n")[0]:String(t.message))},!0),window.addEventListener("unhandledrejection",t=>{const e=t.reason;_("Unhandled rejection: "+(e&&e.message?e.message:String(t.reason)))},!0);const t=console.error.bind(console);console.error=(...e)=>{try{_(e.map(t=>String(t)).join(" "))}catch{}t(...e)}}catch{w=!1}}}function g(t){l=t,d.set(t,[])}function y(t){return(d.get(t)??[]).slice()}function p(){return y(l)}function m(){return e(window.__FPX_VIEWS__)}function v(t,e){const n=[],r=new Set;let o=e;for(;o&&t[o]&&!r.has(o)&&n.length<4;)r.add(o),n.unshift(o),o=t[o].after;return n}async function A(t){try{const e=m();if(!e[t])return{ok:!1,view:t,settle:u([]),error:"not declared"};g(t);for(const n of v(e,t))try{await e[n].enter()}catch(e){return{ok:!1,view:t,settle:u(y(t)),error:"enter("+n+") threw: "+String(e)}}const n=await f(),r=u(y(t));return n?{ok:!0,view:t,settle:r}:{ok:!1,view:t,settle:r,error:"settle timeout"}}catch(e){return{ok:!1,view:t,settle:u([]),error:String(e)}}}function E(){try{if(window.__FPX_KAPTURE__&&1===window.__FPX_KAPTURE__.v)return;window.__FPX_KAPTURE__={v:1,list:()=>{try{return n(m())}catch{return[]}},goto:t=>A(t),settled:()=>u(p())}}catch{}}const F="funpixel-kapture";function P(t){return{source:F,type:"KAPTURE_VIEWS",v:1,views:t}}function b(t,e){return{source:F,type:"KAPTURE_GOTO_ACK",corrId:t,ok:e.ok,settle:e.settle}}function k(t){if(!t||"object"!=typeof t)return null;const e=t;return"KAPTURE_GOTO"!==e.type||"string"!=typeof e.id||0===e.id.length||e.id.length>64||"string"!=typeof e.corrId||0===e.corrId.length||e.corrId.length>64?null:{type:"KAPTURE_GOTO",id:e.id,corrId:e.corrId}}function I(t){try{window.parent.postMessage(t,"*")}catch{}}function S(){try{if(window.__FPX_KAPTURE__)return;h(),g("__boot__"),i(),E(),function(){let t=0;const r=()=>{try{const o=n(e(window.__FPX_VIEWS__));if(o.length>0||t>=40)return void I(P(o));t++,setTimeout(r,250)}catch{}};r()}(),function(){try{window.addEventListener("message",t=>{try{if(t.source!==window.parent)return;const e=k(t.data);if(!e)return;A(e.id).then(t=>I(b(e.corrId,t)))}catch{}})}catch{}}()}catch{}}return S(),t.SOURCE=F,t.beginView=g,t.boot=S,t.currentErrors=p,t.errorsFor=y,t.gotoAck=b,t.gotoView=A,t.install=h,t.installDriver=E,t.parseGoto=k,t.pendingFonts=s,t.pendingImages=c,t.rafAlive=a,t.readViews=e,t.resolveChain=v,t.snapshot=u,t.startHeartbeat=i,t.toMeta=n,t.viewsMessage=P,t.waitForSettle=f,t}({});
@@ -0,0 +1 @@
1
+ var FunpixelProfiler=function(e){"use strict";const t="🎬",i="🎨",s="💾",r="🖥️",n="✨";const a={sampleInterval:1e3,bufferSize:3e4,thresholds:{fps:{green:55,yellow:30},frameTime:{green:18,yellow:33},drawCalls:{green:200,yellow:1e3},triangles:{green:2e5,yellow:1e6},textureMemoryMB:{green:100,yellow:500},geometryMemoryMB:{green:50,yellow:200}},debug:!1};class o{buf;head=0;size=0;capacity;constructor(e){if(e<1)throw new Error("TimeWindowedRingBuffer capacity must be >= 1");this.capacity=e,this.buf=new Array(e)}push(e){this.buf[this.head]=e,this.head=(this.head+1)%this.capacity,this.size<this.capacity&&(this.size+=1)}sliceSince(e){if(0===this.size)return[];const t=[],i=(this.head-this.size+this.capacity)%this.capacity;for(let s=0;s<this.size;s++){const r=(i+s)%this.capacity,n=this.buf[r];n&&n.timestamp>=e&&t.push(n)}return t}clear(){this.head=0,this.size=0}get length(){return this.size}}function l(e,t){if(0===e.length)return 0;if(1===e.length)return e[0];const i=[...e].sort((e,t)=>e-t),s=t/100*(i.length-1),r=Math.floor(s),n=Math.ceil(s);if(r===n)return i[r];const a=s-r;return i[r]*(1-a)+i[n]*a}class g{engine;handlers=new Map;isListening=!1;boundHandleMessage;constructor(e){this.engine=e,this.boundHandleMessage=this.handleMessage.bind(this)}send(e){const t={...e,engine:this.engine,source:"funpixel-profiler"};try{window.parent.postMessage(t,"*")}catch{}}on(e,t){const i=this.handlers.get(e)||[];i.push(t),this.handlers.set(e,i),this.isListening||this.startListening()}off(e,t){const i=this.handlers.get(e)||[],s=i.indexOf(t);s>-1&&i.splice(s,1)}startListening(){this.isListening||(this.isListening=!0,window.addEventListener("message",this.boundHandleMessage))}handleMessage(e){const t=e.data;if(!t?.type)return;const i=this.normalizeMessageType(t.type);if(!i)return;const s=this.handlers.get(i);if(s){const e={type:i,config:t.config};for(const t of s)t(e)}}normalizeMessageType(e){switch(e){case"PROFILER_START":case"START_PROFILER":return"PROFILER_START";case"PROFILER_STOP":case"STOP_PROFILER":return"PROFILER_STOP";case"PROFILER_REQUEST_SNAPSHOT":case"REQUEST_PROFILER_SNAPSHOT":return"PROFILER_REQUEST_SNAPSHOT";case"PROFILER_SET_CONFIG":case"SET_PROFILER_CONFIG":return"PROFILER_SET_CONFIG";default:return null}}destroy(){this.isListening&&(window.removeEventListener("message",this.boundHandleMessage),this.isListening=!1),this.handlers.clear()}}class h{gl=null;ext=null;isWebGL2=!1;_available=!1;currentQuery=null;pendingQuery=null;lastResult=null;frameActive=!1;constructor(e){e&&(this.gl=e,this.isWebGL2="createQuery"in e,this.initExtension())}initExtension(){if(this.gl)try{this.isWebGL2&&(this.ext=this.gl.getExtension("EXT_disjoint_timer_query_webgl2")),this.ext||(this.ext=this.gl.getExtension("EXT_disjoint_timer_query")),this.ext&&(this._available=!0)}catch{this._available=!1}}get available(){return this._available}beginFrame(){if(this._available&&this.gl&&this.ext&&!this.frameActive){this.resolvePendingQuery(),this.currentQuery&&(this.pendingQuery=this.currentQuery);try{this.isWebGL2?(this.currentQuery=this.gl.createQuery(),this.currentQuery&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,this.currentQuery),this.frameActive=!0)):(this.currentQuery=this.ext.createQueryEXT(),this.currentQuery&&(this.ext.beginQueryEXT(this.ext.TIME_ELAPSED_EXT,this.currentQuery),this.frameActive=!0))}catch{this._available=!1}}}endFrame(){if(this._available&&this.gl&&this.ext&&this.frameActive){try{this.isWebGL2?this.gl.endQuery(this.ext.TIME_ELAPSED_EXT):this.ext.endQueryEXT(this.ext.TIME_ELAPSED_EXT)}catch{this._available=!1}this.frameActive=!1}}getResult(){return this.resolvePendingQuery(),this.lastResult}resolvePendingQuery(){if(this.pendingQuery&&this.gl&&this.ext)try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return this.cleanupQuery(this.pendingQuery),this.pendingQuery=null,void(this.lastResult=null);let e,t;if(this.isWebGL2){const i=this.gl;e=i.getQueryParameter(this.pendingQuery,i.QUERY_RESULT_AVAILABLE),e&&(t=i.getQueryParameter(this.pendingQuery,i.QUERY_RESULT))}else e=this.ext.getQueryObjectEXT(this.pendingQuery,this.ext.QUERY_RESULT_AVAILABLE_EXT),e&&(t=this.ext.getQueryObjectEXT(this.pendingQuery,this.ext.QUERY_RESULT_EXT));e&&"number"==typeof t&&(this.lastResult=t/1e6,this.cleanupQuery(this.pendingQuery),this.pendingQuery=null)}catch{this.pendingQuery&&this.cleanupQuery(this.pendingQuery),this.pendingQuery=null,this.lastResult=null}}cleanupQuery(e){try{this.isWebGL2?this.gl.deleteQuery(e):this.ext&&this.ext.deleteQueryEXT(e)}catch{}}destroy(){this.currentQuery&&(this.frameActive&&this.endFrame(),this.cleanupQuery(this.currentQuery),this.currentQuery=null),this.pendingQuery&&(this.cleanupQuery(this.pendingQuery),this.pendingQuery=null),this._available=!1}}class c{messages;ringBuffer;gpuTimer=null;config;isRunning=!1;profilingStartTime=0;lastSampleSentTime=0;lastFrameTimestamp=0;accumulatedCpuTime=0;sampleAccumulator=[];warnings=[];warningHashes=new Set;sceneStatsCache=null;sceneStatsCacheTime=0;SCENE_STATS_CACHE_MS=200;pendingFrameEmit=!1;frameRenderStats={};stateChangeCounters={programSwitches:0,textureSwitches:0,fboSwitches:0};lastFrameStateChanges={programSwitches:0,textureSwitches:0,fboSwitches:0};originalUseProgram=null;originalBindTexture=null;originalBindFramebuffer=null;lastComputedScore=-1;loafObserver=null;loafEntries=[];constructor(e={}){this.config={...a,...e},this.ringBuffer=new o(this.config.bufferSize)}init(){this.messages=new g(this.engineType),this.setupMessageHandlers(),this.waitForEngine(),this.exposeGlobalAPI(),this.log("Profiler initialized")}waitForEngine(){const e=Date.now();let t=!1;const i=()=>{this.isEngineReady()?this.onEngineReady():(!t&&Date.now()-e>15e3&&(t=!0,this.log("Engine not detected yet — continuing to poll slowly (menu-first game?)","warn")),setTimeout(i,t?2e3:100))};setTimeout(i,100)}onEngineReady(){this.log("Engine detected");const e=this.getGLContext();e&&(this.gpuTimer=new h(e),this.gpuTimer.available&&this.log("GPU timer query available")),this.messages.send({type:"PROFILER_READY"}),this.messages.send({type:"PROFILER_ENGINE_DETECTED",engine:this.engineType}),this.start()}setupMessageHandlers(){this.messages.on("PROFILER_START",e=>{e.config&&this.updateConfig(e.config),this.start()}),this.messages.on("PROFILER_STOP",()=>{this.stop()}),this.messages.on("PROFILER_REQUEST_SNAPSHOT",()=>{const e=this.buildSnapshot();this.messages.send({type:"PROFILER_SNAPSHOT",snapshot:e})}),this.messages.on("PROFILER_SET_CONFIG",e=>{e.config&&this.updateConfig(e.config)})}start(){this.isRunning||(this.isRunning=!0,this.profilingStartTime=performance.now(),this.lastSampleSentTime=performance.now(),this.lastFrameTimestamp=0,this.accumulatedCpuTime=0,this.frameRenderStats={},this.pendingFrameEmit=!1,this.sampleAccumulator=[],this.warnings=[],this.warningHashes.clear(),this.hookRenderLoop(),this.hookStateChangeTracking(),this.startLoafObserver(),this.log("Profiling started"))}stop(){this.isRunning&&(this.isRunning=!1,this.unhookRenderLoop(),this.unhookStateChangeTracking(),this.stopLoafObserver(),this.log("Profiling stopped"))}onFrameEnd(e){if(!this.isRunning)return;let t;this.accumulatedCpuTime+=e;try{t=this.collectRenderStats()}catch{t={}}const i=this.frameRenderStats;i.drawCalls=(i.drawCalls||0)+(t.drawCalls||0),i.triangles=(i.triangles||0)+(t.triangles||0),i.points=(i.points||0)+(t.points||0),i.lines=(i.lines||0)+(t.lines||0),void 0!==t.textureCount&&(i.textureCount=t.textureCount),void 0!==t.textureBytes&&(i.textureBytes=t.textureBytes),void 0!==t.geometryCount&&(i.geometryCount=t.geometryCount),void 0!==t.geometryBytes&&(i.geometryBytes=t.geometryBytes),void 0!==t.programCount&&(i.programCount=t.programCount),this.pendingFrameEmit||(this.pendingFrameEmit=!0,queueMicrotask(()=>this.emitFrameSample()))}emitFrameSample(){if(this.pendingFrameEmit=!1,!this.isRunning)return;const e=performance.now(),t=this.lastFrameTimestamp>0?e-this.lastFrameTimestamp:16.67;this.lastFrameTimestamp=e,this.lastFrameStateChanges={...this.stateChangeCounters},this.stateChangeCounters.programSwitches=0,this.stateChangeCounters.textureSwitches=0,this.stateChangeCounters.fboSwitches=0;const i=this.buildFrameSample(t,this.accumulatedCpuTime,this.frameRenderStats);if(this.accumulatedCpuTime=0,this.frameRenderStats={},this.ringBuffer.push(i),this.sampleAccumulator.push(i),e-this.lastSampleSentTime>=this.config.sampleInterval){const t=this.aggregateStats(this.sampleAccumulator),i=this.detectWarnings(t);this.messages.send({type:"PROFILER_SAMPLE",stats:t,warnings:i});for(const e of i)this.messages.send({type:"PROFILER_WARNING",warning:e});this.sampleAccumulator=[],this.lastSampleSentTime=e}}buildFrameSample(e,t,i){const s=this.getSceneStatsCached(),r=this.gpuTimer?.getResult()??null;let n=null,a=null;return performance.memory&&(n=performance.memory.usedJSHeapSize,a=performance.memory.totalJSHeapSize),{timestamp:performance.now(),frameTime:e,fps:e>0?1e3/e:0,cpuTime:t,drawCalls:i.drawCalls||0,triangles:i.triangles||0,points:i.points||0,lines:i.lines||0,textureCount:i.textureCount||0,textureBytes:i.textureBytes||0,geometryCount:i.geometryCount||0,geometryBytes:i.geometryBytes||0,programCount:i.programCount||0,programSwitches:this.lastFrameStateChanges.programSwitches,textureSwitches:this.lastFrameStateChanges.textureSwitches,fboSwitches:this.lastFrameStateChanges.fboSwitches,totalObjects:s.totalObjects,visibleObjects:s.visibleObjects,lightsCount:s.lightsCount,camerasCount:s.camerasCount,gpuTime:r,jsHeapUsed:n,jsHeapTotal:a}}getSceneStatsCached(){const e=performance.now();if(!this.sceneStatsCache||e-this.sceneStatsCacheTime>this.SCENE_STATS_CACHE_MS){try{this.sceneStatsCache=this.collectSceneStats()}catch{this.sceneStatsCache={totalObjects:0,visibleObjects:0,lightsCount:0,camerasCount:0}}this.sceneStatsCacheTime=e}return this.sceneStatsCache}aggregateStats(e){if(0===e.length)return this.emptyStats();const t=e[e.length-1],i=e.map(e=>e.fps),s=e.map(e=>e.frameTime),r=e.map(e=>e.cpuTime),n=this.computeMinMaxAvg(r),a={fps:this.computeMinMaxAvg(i),frameTime:this.computeMinMaxAvg(s),cpuTime:n,drawCalls:t.drawCalls,triangles:t.triangles,points:t.points,lines:t.lines,textureCount:t.textureCount,textureMemoryMB:t.textureBytes/1024/1024,geometryCount:t.geometryCount,geometryMemoryMB:t.geometryBytes/1024/1024,programCount:t.programCount,programSwitches:t.programSwitches,textureSwitches:t.textureSwitches,fboSwitches:t.fboSwitches,totalObjects:t.totalObjects,visibleObjects:t.visibleObjects,lightsCount:t.lightsCount,camerasCount:t.camerasCount,gpuTime:t.gpuTime,jsHeapUsedMB:null!==t.jsHeapUsed?t.jsHeapUsed/1024/1024:null,framePacing:this.computeFramePacing(e),bottleneck:this.classifyBottleneck(n.avg,t.gpuTime,this.computeMinMaxAvg(s).avg,t.drawCalls),sampleCount:e.length};return a.performanceScore=this.computePerformanceScore(a),a}computeMinMaxAvg(e){let t=1/0,i=-1/0,s=0;for(const r of e)r<t&&(t=r),r>i&&(i=r),s+=r;return{current:e[e.length-1],min:t,max:i,avg:s/e.length}}emptyStats(){return{fps:{current:0,min:0,max:0,avg:0},frameTime:{current:0,min:0,max:0,avg:0},cpuTime:{current:0,min:0,max:0,avg:0},drawCalls:0,triangles:0,points:0,lines:0,textureCount:0,textureMemoryMB:0,geometryCount:0,geometryMemoryMB:0,programCount:0,programSwitches:0,textureSwitches:0,fboSwitches:0,totalObjects:0,visibleObjects:0,lightsCount:0,camerasCount:0,gpuTime:null,jsHeapUsedMB:null,framePacing:this.emptyFramePacing(),bottleneck:{type:"unknown",description:"Insufficient data",confidence:0,suggestion:""},sampleCount:0}}detectWarnings(e){const t=[],i=performance.now(),s=this.config.thresholds;return e.fps.avg>0&&e.fps.avg<s.fps.yellow&&this.addWarning(t,"fps",e.fps.avg<s.fps.yellow/2?"critical":"warning",`Average FPS is ${e.fps.avg.toFixed(1)} (below ${s.fps.yellow})`,e.fps.avg,s.fps.yellow,"Consider reducing draw calls, lowering resolution, or simplifying geometry. Use LOD (Level of Detail) for distant objects.",i),e.frameTime.avg>s.frameTime.yellow&&this.addWarning(t,"frame_time",e.frameTime.avg>2*s.frameTime.yellow?"critical":"warning",`Average frame time is ${e.frameTime.avg.toFixed(1)}ms (above ${s.frameTime.yellow}ms)`,e.frameTime.avg,s.frameTime.yellow,"Profile individual systems. Common causes: expensive shaders, too many lights with shadows, unoptimized physics, GC pauses.",i),e.drawCalls>s.drawCalls.yellow&&this.addWarning(t,"draw_calls",e.drawCalls>3*s.drawCalls.yellow?"critical":"warning",`Draw calls: ${e.drawCalls.toLocaleString()} (above ${s.drawCalls.yellow})`,e.drawCalls,s.drawCalls.yellow,"Batch similar materials, use instanced rendering (InstancedMesh/InstancedBufferGeometry), merge static geometry, use texture atlases.",i),e.triangles>s.triangles.yellow&&this.addWarning(t,"triangles",e.triangles>3*s.triangles.yellow?"critical":"warning",`Triangle count: ${e.triangles.toLocaleString()} (above ${s.triangles.yellow.toLocaleString()})`,e.triangles,s.triangles.yellow,"Use LOD, reduce polygon count on distant/small objects, enable frustum culling, consider simpler geometry for non-hero assets.",i),e.textureMemoryMB>s.textureMemoryMB.yellow&&this.addWarning(t,"texture_memory",e.textureMemoryMB>2*s.textureMemoryMB.yellow?"critical":"warning",`Texture memory: ${e.textureMemoryMB.toFixed(1)}MB (above ${s.textureMemoryMB.yellow}MB)`,e.textureMemoryMB,s.textureMemoryMB.yellow,"Use compressed textures (KTX2/Basis), reduce texture resolution, use power-of-2 sizes, share textures via atlases, dispose unused textures.",i),e.geometryMemoryMB>s.geometryMemoryMB.yellow&&this.addWarning(t,"geometry_memory",e.geometryMemoryMB>2*s.geometryMemoryMB.yellow?"critical":"warning",`Geometry memory: ${e.geometryMemoryMB.toFixed(1)}MB (above ${s.geometryMemoryMB.yellow}MB)`,e.geometryMemoryMB,s.geometryMemoryMB.yellow,"Share geometry between meshes, use BufferGeometry instead of Geometry, dispose unused geometries, use instancing for repeated shapes.",i),e.programCount>50&&this.addWarning(t,"shader_count","warning",`Shader programs: ${e.programCount} (many unique materials)`,e.programCount,50,"Reduce material variations, share materials between objects, consider using a single uber-shader with defines.",i),null!==e.gpuTime&&e.gpuTime>16&&this.addWarning(t,"gpu_time",e.gpuTime>33?"critical":"warning",`GPU time: ${e.gpuTime.toFixed(1)}ms (above 16ms budget)`,e.gpuTime,16,"Simplify shaders, reduce overdraw, lower shadow map resolution, use fewer real-time lights, consider baked lighting.",i),t}addWarning(e,t,i,s,r,n,a,o){const l=`${t}-${i}`;if(this.warningHashes.has(l))return;this.warningHashes.add(l);const g={id:`${t}-${Date.now()}`,severity:i,category:t,message:s,value:r,threshold:n,timestamp:o,suggestion:a};e.push(g),this.warnings.push(g)}computeFramePacing(e){if(e.length<2)return this.emptyFramePacing();const t=e.map(e=>e.frameTime),i=t.reduce((e,t)=>e+t,0)/t.length,s=t.reduce((e,t)=>e+(t-i)**2,0)/t.length,r=Math.sqrt(s),n=16.67*.1,a=t.filter(e=>Math.abs(e-16.67)<=n).length/t.length*100,o=2*i,l=t.filter(e=>e>o).length,g=e.length>0?(e[e.length-1].timestamp-e[0].timestamp)/1e3:1,h=g>0?l/g*60:0,c=1.5*i;let u=0,m=0;for(const e of t)e<=c?(m++,m>u&&(u=m)):m=0;const d=[0,0,0,0,0];for(const e of t)e<8?d[0]++:e<16?d[1]++:e<33?d[2]++:e<50?d[3]++:d[4]++;let p="stable";if(t.length>=120){const e=this.config.thresholds.frameTime.green,i=Math.floor(t.length/2),s=t.slice(0,i).sort((e,t)=>e-t),r=t.slice(i).sort((e,t)=>e-t),n=s[Math.floor(.99*s.length)]??0,a=r[Math.floor(.99*r.length)]??0;a>1.2*n&&a>e?p="degrading":a<.83*n&&n>e&&(p="improving")}return{frameTimeStdDev:r,consistencyPercent:a,janksPerMinute:h,longestSmoothStreak:u,histogram:d,varianceTrend:p}}emptyFramePacing(){return{frameTimeStdDev:0,consistencyPercent:0,janksPerMinute:0,longestSmoothStreak:0,histogram:[0,0,0,0,0],varianceTrend:"stable"}}classifyBottleneck(e,t,i,s){if(i<=0)return{type:"unknown",description:"Insufficient data",confidence:0,suggestion:""};if(i<=17.5&&e<12&&(null===t||t<12))return{type:"vsync-limited",description:"Running at vsync cap with headroom available",confidence:.9,suggestion:"Performance is good. Add more visual quality or increase simulation complexity."};const r=null!==t&&t>0;if(s>500&&e>10)return{type:"draw-call-bound",description:`${s} draw calls causing ${e.toFixed(1)}ms CPU overhead`,confidence:.85,suggestion:"Use InstancedMesh for repeated geometry, merge static meshes, share materials, use texture atlases."};if(r){const i=e/t;if(i>2)return{type:"cpu-bound",description:`CPU render time (${e.toFixed(1)}ms) is ${i.toFixed(1)}x GPU time (${t.toFixed(1)}ms)`,confidence:Math.min(.95,.6+.1*i),suggestion:"Reduce draw call count, simplify scene graph, optimize JavaScript logic, use web workers for heavy computation."};if(i<.5)return{type:"gpu-bound",description:`GPU time (${t.toFixed(1)}ms) is ${(1/i).toFixed(1)}x CPU time (${e.toFixed(1)}ms)`,confidence:Math.min(.95,.6+1/i*.1),suggestion:"Simplify shaders, reduce overdraw, lower shadow/texture resolution, use LOD, reduce post-processing passes."}}const n=r?Math.max(e,t):e;return i>2*n&&n>0?{type:"main-thread",description:`Frame time (${i.toFixed(1)}ms) is ${(i/n).toFixed(1)}x render time (${n.toFixed(1)}ms) — non-render work blocking`,confidence:.75,suggestion:"Profile JavaScript execution. Check for GC pauses, expensive physics, or layout thrashing between frames."}:{type:"balanced",description:"No single bottleneck detected — CPU and GPU load are balanced",confidence:.5,suggestion:"For further optimization, reduce scene complexity across the board or enable LOD."}}computePerformanceScore(e){const t=this.config.thresholds,i=e.fps.avg>=60?100:e.fps.avg>=30?50+(e.fps.avg-30)/30*50:Math.max(0,e.fps.avg/30*50),s=e.framePacing,r=Math.max(0,Math.min(100,.4*s.consistencyPercent+.3*Math.max(0,100-5*s.janksPerMinute)+.3*Math.max(0,100-10*s.frameTimeStdDev))),n=e.textureMemoryMB+e.geometryMemoryMB,a=t.textureMemoryMB.green,o=t.textureMemoryMB.yellow,l=n<=a?100:n<=o?50+50*(1-(n-a)/(o-a)):Math.max(0,50-(n-o)/o*50),g=((e.drawCalls<=t.drawCalls.green?100:e.drawCalls<=t.drawCalls.yellow?50+50*(1-(e.drawCalls-t.drawCalls.green)/(t.drawCalls.yellow-t.drawCalls.green)):Math.max(0,50-(e.drawCalls-t.drawCalls.yellow)/t.drawCalls.yellow*50))+(e.triangles<=t.triangles.green?100:e.triangles<=t.triangles.yellow?50+50*(1-(e.triangles-t.triangles.green)/(t.triangles.yellow-t.triangles.green)):Math.max(0,50-(e.triangles-t.triangles.yellow)/t.triangles.yellow*50)))/2,h=null===e.gpuTime||e.gpuTime<=8?100:e.gpuTime<=16?50+50*(1-(e.gpuTime-8)/8):Math.max(0,50-(e.gpuTime-16)/16*50);let c=Math.round(.4*i+.2*r+.15*l+.15*g+.1*h);c=Math.max(0,Math.min(100,c));const u=this.lastComputedScore<0?c:Math.round(.3*c+.7*this.lastComputedScore);this.lastComputedScore=u;const{grade:m,label:d}=function(e){return e>=90?{grade:"excellent",label:"Excellent"}:e>=70?{grade:"good",label:"Good"}:e>=50?{grade:"needs-work",label:"Needs Work"}:e>=30?{grade:"poor",label:"Poor"}:{grade:"critical",label:"Critical"}}(u);return{score:u,grade:m,gradeLabel:d,categories:{performance:Math.round(Math.max(0,Math.min(100,i))),smoothness:Math.round(Math.max(0,Math.min(100,r))),memory:Math.round(Math.max(0,Math.min(100,l))),rendering:Math.round(Math.max(0,Math.min(100,g))),gpu:Math.round(Math.max(0,Math.min(100,h)))},issues:this.generateIssues(e)}}generateIssues(e){const a=[],o=this.config.thresholds;e.fps.avg>0&&e.fps.avg<o.fps.yellow&&a.push({id:"fps-low",severity:e.fps.avg<o.fps.yellow/2?"critical":"warning",title:"Game is running slowly",description:e.fps.avg<20?"Your game is very slow. Try reducing the number of objects or simplifying visual effects.":"Your game could be smoother. Consider simplifying busy scenes.",category:"performance",icon:t}),e.drawCalls>o.drawCalls.yellow&&a.push({id:"draw-calls-high",severity:e.drawCalls>3*o.drawCalls.yellow?"critical":"warning",title:"Too many objects drawing separately",description:"Group similar objects together so the game does less work each frame. Objects with the same look can often be merged.",category:"rendering",icon:i}),e.triangles>o.triangles.yellow&&a.push({id:"triangles-high",severity:e.triangles>3*o.triangles.yellow?"critical":"warning",title:"Too much geometry detail",description:"Some models have more detail than needed. Use simpler models for background objects or things far from the camera.",category:"rendering",icon:i}),e.textureMemoryMB>o.textureMemoryMB.yellow&&a.push({id:"texture-memory-high",severity:e.textureMemoryMB>2*o.textureMemoryMB.yellow?"critical":"warning",title:"Large images using lots of memory",description:"Your textures are using a lot of GPU memory. Try compressing images, using smaller sizes, or sharing textures between objects.",category:"memory",icon:s}),e.geometryMemoryMB>o.geometryMemoryMB.yellow&&a.push({id:"geometry-memory-high",severity:e.geometryMemoryMB>2*o.geometryMemoryMB.yellow?"critical":"warning",title:"Too much 3D data in memory",description:"Your models are using lots of memory. Share shapes between similar objects and remove unused geometry.",category:"memory",icon:s}),null!==e.gpuTime&&e.gpuTime>16&&a.push({id:"gpu-time-high",severity:e.gpuTime>33?"critical":"warning",title:"GPU is working too hard",description:"Your graphics card is struggling. Simplify visual effects, reduce shadow quality, or lower the resolution.",category:"gpu",icon:r}),e.framePacing.janksPerMinute>10&&a.push({id:"jank-detected",severity:e.framePacing.janksPerMinute>30?"critical":"warning",title:"Game stutters occasionally",description:"Your game has noticeable hiccups. This can be caused by loading assets during gameplay or doing too much work at once.",category:"smoothness",icon:n});const l=this.config.thresholds.frameTime.green,g=this.getBurnRate(1e4,l),h=this.getBurnRate(6e4,l),c=this.getBurnRate(3e5,l);return g>=10&&h>=10?a.push({id:"performance-degrading",severity:"critical",title:"Game is stuttering right now",description:"Frames are missing the target budget at 10× the rate the SLO allows, both in the last 10 seconds and the last minute. Something is actively wrong — recent code changes or an expensive scene transition.",category:"smoothness",icon:n}):c>=3&&h>=3&&a.push({id:"performance-degrading",severity:"warning",title:"Performance getting worse over time",description:"Frames have been missing the target budget at 3× the rate the SLO allows, sustained over the last few minutes. Common causes: objects accumulating without cleanup, growing particle pool, forgotten event listeners.",category:"smoothness",icon:n}),a}hookStateChangeTracking(){const e=this.getGLContext();if(!e)return;const t=this.stateChangeCounters;this.originalUseProgram=e.useProgram.bind(e),e.useProgram=e=>(t.programSwitches++,this.originalUseProgram(e)),this.originalBindTexture=e.bindTexture.bind(e),e.bindTexture=(e,i)=>(t.textureSwitches++,this.originalBindTexture(e,i)),this.originalBindFramebuffer=e.bindFramebuffer.bind(e),e.bindFramebuffer=(e,i)=>(t.fboSwitches++,this.originalBindFramebuffer(e,i)),this.log("WebGL state change tracking active")}unhookStateChangeTracking(){const e=this.getGLContext();e&&(this.originalUseProgram&&(e.useProgram=this.originalUseProgram,this.originalUseProgram=null),this.originalBindTexture&&(e.bindTexture=this.originalBindTexture,this.originalBindTexture=null),this.originalBindFramebuffer&&(e.bindFramebuffer=this.originalBindFramebuffer,this.originalBindFramebuffer=null))}startLoafObserver(){try{if("undefined"==typeof PerformanceObserver)return;const e=PerformanceObserver.supportedEntryTypes;if(!e?.includes("long-animation-frame"))return;this.loafObserver=new PerformanceObserver(e=>{for(const t of e.getEntries()){const e=t;this.loafEntries.push({duration:e.duration,renderStart:e.renderStart??0,styleAndLayoutStart:e.styleAndLayoutStart??0,scripts:(e.scripts??[]).map(e=>({sourceURL:e.sourceURL||"unknown",invoker:e.invoker||"unknown",duration:e.duration})),timestamp:e.startTime}),this.loafEntries.length>50&&this.loafEntries.shift()}}),this.loafObserver.observe({type:"long-animation-frame",buffered:!1}),this.log("Long Animation Frame (LoAF) observer active")}catch{}}stopLoafObserver(){this.loafObserver&&(this.loafObserver.disconnect(),this.loafObserver=null)}getWindowedStats(e){const t=performance.now()-e,i=this.ringBuffer.sliceSince(t),s=i.length;if(0===s)return{windowMs:e,sampleCount:0,fps:{p50:0,p95:0,p99:0,min:0,max:0,avg:0},frameTime:{p50:0,p95:0,p99:0,max:0,avg:0},heap:{start:0,end:0,min:0,max:0,deltaPerMin:0}};const r=i.map(e=>e.fps),n=i.map(e=>e.frameTime),a=i.map(e=>(e.jsHeapUsed??0)/1048576),o=a[a.length-1]-a[0],g=(i[i.length-1].timestamp-i[0].timestamp)/6e4,h=(e,t)=>e+t;return{windowMs:e,sampleCount:s,fps:{p50:l(r,50),p95:l(r,95),p99:l(r,99),min:Math.min(...r),max:Math.max(...r),avg:r.reduce(h,0)/s},frameTime:{p50:l(n,50),p95:l(n,95),p99:l(n,99),max:Math.max(...n),avg:n.reduce(h,0)/s},heap:{start:a[0],end:a[a.length-1],min:Math.min(...a),max:Math.max(...a),deltaPerMin:g>0?o/g:0}}}getBurnRate(e,t,i=30){const s=performance.now()-e;return function(e,t,i=30){if(e.length<i)return 0;let s=0;for(const i of e)i.frameTime>t&&(s+=1);return s/e.length/.01}(this.ringBuffer.sliceSince(s),t,i)}buildSnapshot(){const e=this.ringBuffer.sliceSince(0),t=e.length>0?this.aggregateStats(e):this.emptyStats();this.warningHashes.clear(),this.warnings=[],this.detectWarnings(t);let i=this.getHotObjects()??void 0;if(i&&i.length>0){const e=t.triangles||1,s=t.drawCalls||1;i=i.map(t=>({...t,triangleBudgetPercent:t.triangles/e*100,drawCallBudgetPercent:t.drawCalls/s*100}))}return{engine:this.engineType,timestamp:Date.now(),profilingDuration:performance.now()-this.profilingStartTime,stats:t,recentSamples:e.slice(-30),warnings:[...this.warnings],engineInfo:this.getEngineInfo(),hotObjects:i,loafEntries:this.loafEntries.length>0?[...this.loafEntries]:void 0}}getReport(){return function(e){const{stats:t,warnings:i,engineInfo:s,hotObjects:r}=e,n=["## Performance Profile","",`**Engine:** ${s.name} ${s.version} | **Renderer:** ${s.renderer}`,`**Canvas:** ${s.canvasWidth}x${s.canvasHeight} @ ${s.pixelRatio}x DPR`,`**Profiling Duration:** ${(e.profilingDuration/1e3).toFixed(1)}s | **Samples:** ${e.recentSamples.length}`,"","### Frame Performance","| Metric | Current | Min | Max | Avg |","|--------|---------|-----|-----|-----|",`| FPS | ${t.fps.current.toFixed(1)} | ${t.fps.min.toFixed(1)} | ${t.fps.max.toFixed(1)} | ${t.fps.avg.toFixed(1)} |`,`| Frame Time (ms) | ${t.frameTime.current.toFixed(2)} | ${t.frameTime.min.toFixed(2)} | ${t.frameTime.max.toFixed(2)} | ${t.frameTime.avg.toFixed(2)} |`,`| CPU Render (ms) | ${t.cpuTime.current.toFixed(2)} | ${t.cpuTime.min.toFixed(2)} | ${t.cpuTime.max.toFixed(2)} | ${t.cpuTime.avg.toFixed(2)} |`,null!==t.gpuTime?`| GPU Time (ms) | ${t.gpuTime.toFixed(2)} | - | - | - |`:"","","### Render Pipeline","| Metric | Value |","|--------|-------|",`| Draw Calls | ${t.drawCalls.toLocaleString()} |`,`| Triangles | ${t.triangles.toLocaleString()} |`,`| Points | ${t.points.toLocaleString()} |`,`| Lines | ${t.lines.toLocaleString()} |`,`| Shader Programs | ${t.programCount} |`,"","### Memory","| Metric | Value |","|--------|-------|",`| Textures | ${t.textureCount} (${t.textureMemoryMB.toFixed(1)} MB) |`,`| Geometries | ${t.geometryCount} (${t.geometryMemoryMB.toFixed(1)} MB) |`,null!==t.jsHeapUsedMB?`| JS Heap | ${t.jsHeapUsedMB.toFixed(1)} MB |`:"","","### Scene Graph","| Metric | Value |","|--------|-------|",`| Total Objects | ${t.totalObjects.toLocaleString()} |`,`| Visible Objects | ${t.visibleObjects.toLocaleString()} |`,`| Lights | ${t.lightsCount} |`,`| Cameras | ${t.camerasCount} |`],a=t.framePacing;a&&n.push("### Frame Pacing (Smoothness)","| Metric | Value |","|--------|-------|",`| Consistency | ${a.consistencyPercent.toFixed(1)}% of frames on-target |`,`| Std Deviation | ${a.frameTimeStdDev.toFixed(2)}ms |`,`| Janks/min | ${a.janksPerMinute.toFixed(1)} |`,`| Longest Smooth Streak | ${a.longestSmoothStreak} frames |`,`| Variance Trend | ${a.varianceTrend} |`,`| Histogram (0-8/8-16/16-33/33-50/50+ms) | ${a.histogram.join(" / ")} |`,"");const o=t.bottleneck;if(o&&"unknown"!==o.type&&n.push("### Bottleneck Analysis",`- **Type:** ${o.type} (${(100*o.confidence).toFixed(0)}% confidence)`,`- **Analysis:** ${o.description}`,`- **Suggestion:** ${o.suggestion}`,""),(t.programSwitches>0||t.textureSwitches>0||t.fboSwitches>0)&&n.push("### WebGL State Changes (per frame)","| Metric | Value |","|--------|-------|",`| Program Switches | ${t.programSwitches} |`,`| Texture Binds | ${t.textureSwitches} |`,`| FBO Switches | ${t.fboSwitches} |`,""),(void 0!==s.antialias||s.shadows||s.toneMapping)&&(n.push("","### Renderer Settings"),void 0!==s.antialias&&n.push("- Antialiasing: "+(s.antialias?"ON":"OFF")),s.shadows&&n.push("- Shadows: "+(s.shadows.enabled?`ON (${s.shadows.type||"default"})`:"OFF")),s.toneMapping&&n.push(`- Tone Mapping: ${s.toneMapping}`),s.maxTextureSize&&n.push(`- Max Texture Size: ${s.maxTextureSize}`)),i.length>0){n.push("","### Performance Warnings");for(const e of i){const t="critical"===e.severity?"CRITICAL":"warning"===e.severity?"WARNING":"INFO";n.push(`- **[${t}]** ${e.message} (${e.value} > threshold ${e.threshold})`),n.push(` Suggestion: ${e.suggestion}`)}}if(r&&r.length>0){n.push("","### Top Objects by Cost"),n.push("| Object | Type | Triangles | Tri% | Draw Calls | DC% | Tex MB |"),n.push("|--------|------|-----------|------|------------|-----|--------|");for(const e of r.slice(0,10)){const t=void 0!==e.triangleBudgetPercent?`${e.triangleBudgetPercent.toFixed(1)}%`:"-",i=void 0!==e.drawCallBudgetPercent?`${e.drawCallBudgetPercent.toFixed(1)}%`:"-";n.push(`| ${e.name} | ${e.type} | ${e.triangles.toLocaleString()} | ${t} | ${e.drawCalls} | ${i} | ${(e.textureBytes/1024/1024).toFixed(1)} |`)}}if(e.loafEntries&&e.loafEntries.length>0){n.push("","### Long Animation Frames (Browser Jank)"),n.push("| Duration | Render Start | Scripts |"),n.push("|----------|-------------|---------|");for(const t of e.loafEntries.slice(-5)){const e=t.scripts.map(e=>`${e.invoker}(${e.duration.toFixed(0)}ms)`).join(", ")||"none";n.push(`| ${t.duration.toFixed(0)}ms | ${t.renderStart.toFixed(0)}ms | ${e} |`)}}if(e.recentSamples.length>0){const t=e.recentSamples.slice(-10);n.push("",`### Recent Frame Times (last ${t.length} samples)`),n.push(`\`${t.map(e=>e.frameTime.toFixed(1)).join(" → ")} ms\``);const i=t.reduce((e,t)=>e+t.frameTime,0)/t.length,s=t.filter(e=>e.frameTime>2*i);s.length>0&&n.push(`⚠ ${s.length} frame time spike(s) detected (>2x average)`)}return n.filter(e=>""!==e).join("\n")}(this.buildSnapshot())}updateConfig(e){this.config={...this.config,...e},e.bufferSize&&e.bufferSize!==this.ringBuffer.capacity&&(this.ringBuffer=new o(e.bufferSize))}exposeGlobalAPI(){window.__funpixelProfiler={start:()=>this.start(),stop:()=>this.stop(),isRunning:()=>this.isRunning,getSnapshot:()=>this.buildSnapshot(),getReport:()=>this.getReport()}}log(e,t="log"){(this.config.debug||"log"!==t)&&console[t](`[Funpixel Profiler] ${e}`)}destroy(){this.stop(),this.gpuTimer?.destroy(),this.messages.destroy(),delete window.__funpixelProfiler}}class u extends c{engineType="pixi";app=null;gl=null;tickerCallback=null;originalDrawElements=null;originalDrawArrays=null;originalDrawElementsInstanced=null;originalDrawArraysInstanced=null;counters={drawCalls:0,triangles:0,points:0,lines:0};lastFrameCounters={drawCalls:0,triangles:0,points:0,lines:0};constructor(e){super(e),this.init()}collectRenderStats(){const e=this.lastFrameCounters;let t=0;this.app?.renderer?.texture?.managedTextures&&(t=this.app.renderer.texture.managedTextures.length);const i=262144*t;return{drawCalls:e.drawCalls,triangles:e.triangles,points:e.points,lines:e.lines,textureCount:t,textureBytes:i,geometryCount:0,geometryBytes:0,programCount:0}}collectSceneStats(){if(!this.app?.stage)return{totalObjects:0,visibleObjects:0,lightsCount:0,camerasCount:0};let e=0,t=0;const i=[this.app.stage];for(;i.length>0;){const s=i.pop();if(e++,s.visible&&t++,s.children)for(let e=s.children.length-1;e>=0;e--)i.push(s.children[e])}return{totalObjects:e,visibleObjects:t,lightsCount:0,camerasCount:0}}hookRenderLoop(){this.app&&!this.tickerCallback&&(this.hookWebGLCalls(),this.tickerCallback=()=>{this.lastFrameCounters={...this.counters},this.counters.drawCalls=0,this.counters.triangles=0,this.counters.points=0,this.counters.lines=0,this.gpuTimer?.beginFrame(),this.gpuTimer?.endFrame();const e=this.app?.ticker?.deltaMS??16.67;this.onFrameEnd(e)},this.app.ticker.add(this.tickerCallback),this.log("Hooked PixiJS ticker for frame timing"))}unhookRenderLoop(){this.app&&this.tickerCallback&&(this.app.ticker.remove(this.tickerCallback),this.tickerCallback=null),this.unhookWebGLCalls(),this.log("Unhooked PixiJS ticker")}isEngineReady(){const e=this.findPixiApp();return!!(e?.stage&&e?.renderer&&e?.ticker)}getGLContext(){if(this.gl)return this.gl;if(this.app?.renderer?.gl)return this.gl=this.app.renderer.gl,this.gl;const e=this.getCanvas();return e?(this.gl=e.getContext("webgl2",{failIfMajorPerformanceCaveat:!1})||e.getContext("webgl",{failIfMajorPerformanceCaveat:!1}),this.gl):null}getCanvas(){return this.app?.canvas||this.app?.view||this.findGameCanvas()}getEngineInfo(){const e=this.app?.renderer,t=this.getCanvas(),i=this.getGLContext(),s=i instanceof WebGL2RenderingContext;return{name:"PixiJS",version:window.PIXI?.VERSION?String(window.PIXI.VERSION):"unknown",renderer:2===e?.type?"Canvas2D":s?"WebGL2":"WebGL",canvasWidth:t?.width??e?.width??0,canvasHeight:t?.height??e?.height??0,pixelRatio:e?.resolution??(window.devicePixelRatio||1),maxTextureSize:i?i.getParameter(i.MAX_TEXTURE_SIZE):void 0,antialias:i?!!i.getContextAttributes()?.antialias:void 0}}getHotObjects(){if(!this.app?.stage)return null;const e=[],t=[this.app.stage];for(;t.length>0;){const i=t.pop(),s=i.constructor?.name??"Unknown";if(("Container"!==s||i.label||i.name)&&i!==this.app.stage&&e.push({name:i.label||i.name||s,type:s,triangles:"Sprite"===s?2:"Graphics"===s?10:0,drawCalls:1,textureBytes:0,visible:i.visible,position:{x:i.position?.x??0,y:i.position?.y??0}}),i.children)for(let e=i.children.length-1;e>=0;e--)t.push(i.children[e])}return e.slice(0,20)}onEngineReady(){this.app=this.findPixiApp(),this.app&&(this.log(`PixiJS ${window.PIXI?.VERSION??""} detected`),this.log(`Stage: ${this.app.stage.children.length} top-level objects`)),super.onEngineReady()}hookWebGLCalls(){const e=this.getGLContext();if(!e)return void this.log("No WebGL context — draw call counting unavailable","warn");const t=this.counters,i=(e,i)=>{switch(t.drawCalls++,e){case 4:t.triangles+=i/3;break;case 5:case 6:t.triangles+=Math.max(0,i-2);break;case 1:t.lines+=i/2;break;case 2:t.lines+=i;break;case 3:t.lines+=Math.max(0,i-1);break;case 0:t.points+=i}};if(this.originalDrawElements=e.drawElements.bind(e),e.drawElements=(e,t,s,r)=>(i(e,t),this.originalDrawElements(e,t,s,r)),this.originalDrawArrays=e.drawArrays.bind(e),e.drawArrays=(e,t,s)=>(i(e,s),this.originalDrawArrays(e,t,s)),"drawElementsInstanced"in e){const t=e;this.originalDrawElementsInstanced=t.drawElementsInstanced.bind(t),t.drawElementsInstanced=(e,t,s,r,n)=>(i(e,t*n),this.originalDrawElementsInstanced(e,t,s,r,n))}if("drawArraysInstanced"in e){const t=e;this.originalDrawArraysInstanced=t.drawArraysInstanced.bind(t),t.drawArraysInstanced=(e,t,s,r)=>(i(e,s*r),this.originalDrawArraysInstanced(e,t,s,r))}this.log("WebGL draw call interception active")}unhookWebGLCalls(){const e=this.gl;e&&(this.originalDrawElements&&(e.drawElements=this.originalDrawElements,this.originalDrawElements=null),this.originalDrawArrays&&(e.drawArrays=this.originalDrawArrays,this.originalDrawArrays=null),this.originalDrawElementsInstanced&&"drawElementsInstanced"in e&&(e.drawElementsInstanced=this.originalDrawElementsInstanced,this.originalDrawElementsInstanced=null),this.originalDrawArraysInstanced&&"drawArraysInstanced"in e&&(e.drawArraysInstanced=this.originalDrawArraysInstanced,this.originalDrawArraysInstanced=null),this.log("WebGL draw call interception removed"))}findPixiApp(){if(window.__PIXI_APP__)return window.__PIXI_APP__;const e=window;if(e.app&&this.isPixiApp(e.app))return e.app;if(e.game&&this.isPixiApp(e.game))return e.game;if(e.pixiApp&&this.isPixiApp(e.pixiApp))return e.pixiApp;if(window.PIXI){const e=window.PIXI;if(e.app&&this.isPixiApp(e.app))return e.app}for(const t in window)try{const i=e[t];if(i&&this.isPixiApp(i))return i}catch{}return null}isPixiApp(e){if(!e||"object"!=typeof e)return!1;const t=e;return!!(t.stage&&t.renderer&&t.ticker)}findGameCanvas(){const e=document.querySelectorAll("canvas");for(const t of e){const e=t;if(e.__pixi_app||e.__PIXI_APP__||t.getAttribute("data-pixi"))return t}return e[0]||null}}function m(){new u({debug:!0})}return"loading"===document.readyState?document.addEventListener("DOMContentLoaded",m):m(),e.PixiProfiler=u,e}({});
@@ -0,0 +1 @@
1
+ var FunpixelProfiler=function(e){"use strict";const t="🎬",i="🎨",s="💾",r="🖥️",n="✨";const a={sampleInterval:1e3,bufferSize:3e4,thresholds:{fps:{green:55,yellow:30},frameTime:{green:18,yellow:33},drawCalls:{green:200,yellow:1e3},triangles:{green:2e5,yellow:1e6},textureMemoryMB:{green:100,yellow:500},geometryMemoryMB:{green:50,yellow:200}},debug:!1};class o{buf;head=0;size=0;capacity;constructor(e){if(e<1)throw new Error("TimeWindowedRingBuffer capacity must be >= 1");this.capacity=e,this.buf=new Array(e)}push(e){this.buf[this.head]=e,this.head=(this.head+1)%this.capacity,this.size<this.capacity&&(this.size+=1)}sliceSince(e){if(0===this.size)return[];const t=[],i=(this.head-this.size+this.capacity)%this.capacity;for(let s=0;s<this.size;s++){const r=(i+s)%this.capacity,n=this.buf[r];n&&n.timestamp>=e&&t.push(n)}return t}clear(){this.head=0,this.size=0}get length(){return this.size}}function l(e,t){if(0===e.length)return 0;if(1===e.length)return e[0];const i=[...e].sort((e,t)=>e-t),s=t/100*(i.length-1),r=Math.floor(s),n=Math.ceil(s);if(r===n)return i[r];const a=s-r;return i[r]*(1-a)+i[n]*a}class h{engine;handlers=new Map;isListening=!1;boundHandleMessage;constructor(e){this.engine=e,this.boundHandleMessage=this.handleMessage.bind(this)}send(e){const t={...e,engine:this.engine,source:"funpixel-profiler"};try{window.parent.postMessage(t,"*")}catch{}}on(e,t){const i=this.handlers.get(e)||[];i.push(t),this.handlers.set(e,i),this.isListening||this.startListening()}off(e,t){const i=this.handlers.get(e)||[],s=i.indexOf(t);s>-1&&i.splice(s,1)}startListening(){this.isListening||(this.isListening=!0,window.addEventListener("message",this.boundHandleMessage))}handleMessage(e){const t=e.data;if(!t?.type)return;const i=this.normalizeMessageType(t.type);if(!i)return;const s=this.handlers.get(i);if(s){const e={type:i,config:t.config};for(const t of s)t(e)}}normalizeMessageType(e){switch(e){case"PROFILER_START":case"START_PROFILER":return"PROFILER_START";case"PROFILER_STOP":case"STOP_PROFILER":return"PROFILER_STOP";case"PROFILER_REQUEST_SNAPSHOT":case"REQUEST_PROFILER_SNAPSHOT":return"PROFILER_REQUEST_SNAPSHOT";case"PROFILER_SET_CONFIG":case"SET_PROFILER_CONFIG":return"PROFILER_SET_CONFIG";default:return null}}destroy(){this.isListening&&(window.removeEventListener("message",this.boundHandleMessage),this.isListening=!1),this.handlers.clear()}}class g{gl=null;ext=null;isWebGL2=!1;_available=!1;currentQuery=null;pendingQuery=null;lastResult=null;frameActive=!1;constructor(e){e&&(this.gl=e,this.isWebGL2="createQuery"in e,this.initExtension())}initExtension(){if(this.gl)try{this.isWebGL2&&(this.ext=this.gl.getExtension("EXT_disjoint_timer_query_webgl2")),this.ext||(this.ext=this.gl.getExtension("EXT_disjoint_timer_query")),this.ext&&(this._available=!0)}catch{this._available=!1}}get available(){return this._available}beginFrame(){if(this._available&&this.gl&&this.ext&&!this.frameActive){this.resolvePendingQuery(),this.currentQuery&&(this.pendingQuery=this.currentQuery);try{this.isWebGL2?(this.currentQuery=this.gl.createQuery(),this.currentQuery&&(this.gl.beginQuery(this.ext.TIME_ELAPSED_EXT,this.currentQuery),this.frameActive=!0)):(this.currentQuery=this.ext.createQueryEXT(),this.currentQuery&&(this.ext.beginQueryEXT(this.ext.TIME_ELAPSED_EXT,this.currentQuery),this.frameActive=!0))}catch{this._available=!1}}}endFrame(){if(this._available&&this.gl&&this.ext&&this.frameActive){try{this.isWebGL2?this.gl.endQuery(this.ext.TIME_ELAPSED_EXT):this.ext.endQueryEXT(this.ext.TIME_ELAPSED_EXT)}catch{this._available=!1}this.frameActive=!1}}getResult(){return this.resolvePendingQuery(),this.lastResult}resolvePendingQuery(){if(this.pendingQuery&&this.gl&&this.ext)try{if(this.gl.getParameter(this.ext.GPU_DISJOINT_EXT))return this.cleanupQuery(this.pendingQuery),this.pendingQuery=null,void(this.lastResult=null);let e,t;if(this.isWebGL2){const i=this.gl;e=i.getQueryParameter(this.pendingQuery,i.QUERY_RESULT_AVAILABLE),e&&(t=i.getQueryParameter(this.pendingQuery,i.QUERY_RESULT))}else e=this.ext.getQueryObjectEXT(this.pendingQuery,this.ext.QUERY_RESULT_AVAILABLE_EXT),e&&(t=this.ext.getQueryObjectEXT(this.pendingQuery,this.ext.QUERY_RESULT_EXT));e&&"number"==typeof t&&(this.lastResult=t/1e6,this.cleanupQuery(this.pendingQuery),this.pendingQuery=null)}catch{this.pendingQuery&&this.cleanupQuery(this.pendingQuery),this.pendingQuery=null,this.lastResult=null}}cleanupQuery(e){try{this.isWebGL2?this.gl.deleteQuery(e):this.ext&&this.ext.deleteQueryEXT(e)}catch{}}destroy(){this.currentQuery&&(this.frameActive&&this.endFrame(),this.cleanupQuery(this.currentQuery),this.currentQuery=null),this.pendingQuery&&(this.cleanupQuery(this.pendingQuery),this.pendingQuery=null),this._available=!1}}class c{messages;ringBuffer;gpuTimer=null;config;isRunning=!1;profilingStartTime=0;lastSampleSentTime=0;lastFrameTimestamp=0;accumulatedCpuTime=0;sampleAccumulator=[];warnings=[];warningHashes=new Set;sceneStatsCache=null;sceneStatsCacheTime=0;SCENE_STATS_CACHE_MS=200;pendingFrameEmit=!1;frameRenderStats={};stateChangeCounters={programSwitches:0,textureSwitches:0,fboSwitches:0};lastFrameStateChanges={programSwitches:0,textureSwitches:0,fboSwitches:0};originalUseProgram=null;originalBindTexture=null;originalBindFramebuffer=null;lastComputedScore=-1;loafObserver=null;loafEntries=[];constructor(e={}){this.config={...a,...e},this.ringBuffer=new o(this.config.bufferSize)}init(){this.messages=new h(this.engineType),this.setupMessageHandlers(),this.waitForEngine(),this.exposeGlobalAPI(),this.log("Profiler initialized")}waitForEngine(){const e=Date.now();let t=!1;const i=()=>{this.isEngineReady()?this.onEngineReady():(!t&&Date.now()-e>15e3&&(t=!0,this.log("Engine not detected yet — continuing to poll slowly (menu-first game?)","warn")),setTimeout(i,t?2e3:100))};setTimeout(i,100)}onEngineReady(){this.log("Engine detected");const e=this.getGLContext();e&&(this.gpuTimer=new g(e),this.gpuTimer.available&&this.log("GPU timer query available")),this.messages.send({type:"PROFILER_READY"}),this.messages.send({type:"PROFILER_ENGINE_DETECTED",engine:this.engineType}),this.start()}setupMessageHandlers(){this.messages.on("PROFILER_START",e=>{e.config&&this.updateConfig(e.config),this.start()}),this.messages.on("PROFILER_STOP",()=>{this.stop()}),this.messages.on("PROFILER_REQUEST_SNAPSHOT",()=>{const e=this.buildSnapshot();this.messages.send({type:"PROFILER_SNAPSHOT",snapshot:e})}),this.messages.on("PROFILER_SET_CONFIG",e=>{e.config&&this.updateConfig(e.config)})}start(){this.isRunning||(this.isRunning=!0,this.profilingStartTime=performance.now(),this.lastSampleSentTime=performance.now(),this.lastFrameTimestamp=0,this.accumulatedCpuTime=0,this.frameRenderStats={},this.pendingFrameEmit=!1,this.sampleAccumulator=[],this.warnings=[],this.warningHashes.clear(),this.hookRenderLoop(),this.hookStateChangeTracking(),this.startLoafObserver(),this.log("Profiling started"))}stop(){this.isRunning&&(this.isRunning=!1,this.unhookRenderLoop(),this.unhookStateChangeTracking(),this.stopLoafObserver(),this.log("Profiling stopped"))}onFrameEnd(e){if(!this.isRunning)return;let t;this.accumulatedCpuTime+=e;try{t=this.collectRenderStats()}catch{t={}}const i=this.frameRenderStats;i.drawCalls=(i.drawCalls||0)+(t.drawCalls||0),i.triangles=(i.triangles||0)+(t.triangles||0),i.points=(i.points||0)+(t.points||0),i.lines=(i.lines||0)+(t.lines||0),void 0!==t.textureCount&&(i.textureCount=t.textureCount),void 0!==t.textureBytes&&(i.textureBytes=t.textureBytes),void 0!==t.geometryCount&&(i.geometryCount=t.geometryCount),void 0!==t.geometryBytes&&(i.geometryBytes=t.geometryBytes),void 0!==t.programCount&&(i.programCount=t.programCount),this.pendingFrameEmit||(this.pendingFrameEmit=!0,queueMicrotask(()=>this.emitFrameSample()))}emitFrameSample(){if(this.pendingFrameEmit=!1,!this.isRunning)return;const e=performance.now(),t=this.lastFrameTimestamp>0?e-this.lastFrameTimestamp:16.67;this.lastFrameTimestamp=e,this.lastFrameStateChanges={...this.stateChangeCounters},this.stateChangeCounters.programSwitches=0,this.stateChangeCounters.textureSwitches=0,this.stateChangeCounters.fboSwitches=0;const i=this.buildFrameSample(t,this.accumulatedCpuTime,this.frameRenderStats);if(this.accumulatedCpuTime=0,this.frameRenderStats={},this.ringBuffer.push(i),this.sampleAccumulator.push(i),e-this.lastSampleSentTime>=this.config.sampleInterval){const t=this.aggregateStats(this.sampleAccumulator),i=this.detectWarnings(t);this.messages.send({type:"PROFILER_SAMPLE",stats:t,warnings:i});for(const e of i)this.messages.send({type:"PROFILER_WARNING",warning:e});this.sampleAccumulator=[],this.lastSampleSentTime=e}}buildFrameSample(e,t,i){const s=this.getSceneStatsCached(),r=this.gpuTimer?.getResult()??null;let n=null,a=null;return performance.memory&&(n=performance.memory.usedJSHeapSize,a=performance.memory.totalJSHeapSize),{timestamp:performance.now(),frameTime:e,fps:e>0?1e3/e:0,cpuTime:t,drawCalls:i.drawCalls||0,triangles:i.triangles||0,points:i.points||0,lines:i.lines||0,textureCount:i.textureCount||0,textureBytes:i.textureBytes||0,geometryCount:i.geometryCount||0,geometryBytes:i.geometryBytes||0,programCount:i.programCount||0,programSwitches:this.lastFrameStateChanges.programSwitches,textureSwitches:this.lastFrameStateChanges.textureSwitches,fboSwitches:this.lastFrameStateChanges.fboSwitches,totalObjects:s.totalObjects,visibleObjects:s.visibleObjects,lightsCount:s.lightsCount,camerasCount:s.camerasCount,gpuTime:r,jsHeapUsed:n,jsHeapTotal:a}}getSceneStatsCached(){const e=performance.now();if(!this.sceneStatsCache||e-this.sceneStatsCacheTime>this.SCENE_STATS_CACHE_MS){try{this.sceneStatsCache=this.collectSceneStats()}catch{this.sceneStatsCache={totalObjects:0,visibleObjects:0,lightsCount:0,camerasCount:0}}this.sceneStatsCacheTime=e}return this.sceneStatsCache}aggregateStats(e){if(0===e.length)return this.emptyStats();const t=e[e.length-1],i=e.map(e=>e.fps),s=e.map(e=>e.frameTime),r=e.map(e=>e.cpuTime),n=this.computeMinMaxAvg(r),a={fps:this.computeMinMaxAvg(i),frameTime:this.computeMinMaxAvg(s),cpuTime:n,drawCalls:t.drawCalls,triangles:t.triangles,points:t.points,lines:t.lines,textureCount:t.textureCount,textureMemoryMB:t.textureBytes/1024/1024,geometryCount:t.geometryCount,geometryMemoryMB:t.geometryBytes/1024/1024,programCount:t.programCount,programSwitches:t.programSwitches,textureSwitches:t.textureSwitches,fboSwitches:t.fboSwitches,totalObjects:t.totalObjects,visibleObjects:t.visibleObjects,lightsCount:t.lightsCount,camerasCount:t.camerasCount,gpuTime:t.gpuTime,jsHeapUsedMB:null!==t.jsHeapUsed?t.jsHeapUsed/1024/1024:null,framePacing:this.computeFramePacing(e),bottleneck:this.classifyBottleneck(n.avg,t.gpuTime,this.computeMinMaxAvg(s).avg,t.drawCalls),sampleCount:e.length};return a.performanceScore=this.computePerformanceScore(a),a}computeMinMaxAvg(e){let t=1/0,i=-1/0,s=0;for(const r of e)r<t&&(t=r),r>i&&(i=r),s+=r;return{current:e[e.length-1],min:t,max:i,avg:s/e.length}}emptyStats(){return{fps:{current:0,min:0,max:0,avg:0},frameTime:{current:0,min:0,max:0,avg:0},cpuTime:{current:0,min:0,max:0,avg:0},drawCalls:0,triangles:0,points:0,lines:0,textureCount:0,textureMemoryMB:0,geometryCount:0,geometryMemoryMB:0,programCount:0,programSwitches:0,textureSwitches:0,fboSwitches:0,totalObjects:0,visibleObjects:0,lightsCount:0,camerasCount:0,gpuTime:null,jsHeapUsedMB:null,framePacing:this.emptyFramePacing(),bottleneck:{type:"unknown",description:"Insufficient data",confidence:0,suggestion:""},sampleCount:0}}detectWarnings(e){const t=[],i=performance.now(),s=this.config.thresholds;return e.fps.avg>0&&e.fps.avg<s.fps.yellow&&this.addWarning(t,"fps",e.fps.avg<s.fps.yellow/2?"critical":"warning",`Average FPS is ${e.fps.avg.toFixed(1)} (below ${s.fps.yellow})`,e.fps.avg,s.fps.yellow,"Consider reducing draw calls, lowering resolution, or simplifying geometry. Use LOD (Level of Detail) for distant objects.",i),e.frameTime.avg>s.frameTime.yellow&&this.addWarning(t,"frame_time",e.frameTime.avg>2*s.frameTime.yellow?"critical":"warning",`Average frame time is ${e.frameTime.avg.toFixed(1)}ms (above ${s.frameTime.yellow}ms)`,e.frameTime.avg,s.frameTime.yellow,"Profile individual systems. Common causes: expensive shaders, too many lights with shadows, unoptimized physics, GC pauses.",i),e.drawCalls>s.drawCalls.yellow&&this.addWarning(t,"draw_calls",e.drawCalls>3*s.drawCalls.yellow?"critical":"warning",`Draw calls: ${e.drawCalls.toLocaleString()} (above ${s.drawCalls.yellow})`,e.drawCalls,s.drawCalls.yellow,"Batch similar materials, use instanced rendering (InstancedMesh/InstancedBufferGeometry), merge static geometry, use texture atlases.",i),e.triangles>s.triangles.yellow&&this.addWarning(t,"triangles",e.triangles>3*s.triangles.yellow?"critical":"warning",`Triangle count: ${e.triangles.toLocaleString()} (above ${s.triangles.yellow.toLocaleString()})`,e.triangles,s.triangles.yellow,"Use LOD, reduce polygon count on distant/small objects, enable frustum culling, consider simpler geometry for non-hero assets.",i),e.textureMemoryMB>s.textureMemoryMB.yellow&&this.addWarning(t,"texture_memory",e.textureMemoryMB>2*s.textureMemoryMB.yellow?"critical":"warning",`Texture memory: ${e.textureMemoryMB.toFixed(1)}MB (above ${s.textureMemoryMB.yellow}MB)`,e.textureMemoryMB,s.textureMemoryMB.yellow,"Use compressed textures (KTX2/Basis), reduce texture resolution, use power-of-2 sizes, share textures via atlases, dispose unused textures.",i),e.geometryMemoryMB>s.geometryMemoryMB.yellow&&this.addWarning(t,"geometry_memory",e.geometryMemoryMB>2*s.geometryMemoryMB.yellow?"critical":"warning",`Geometry memory: ${e.geometryMemoryMB.toFixed(1)}MB (above ${s.geometryMemoryMB.yellow}MB)`,e.geometryMemoryMB,s.geometryMemoryMB.yellow,"Share geometry between meshes, use BufferGeometry instead of Geometry, dispose unused geometries, use instancing for repeated shapes.",i),e.programCount>50&&this.addWarning(t,"shader_count","warning",`Shader programs: ${e.programCount} (many unique materials)`,e.programCount,50,"Reduce material variations, share materials between objects, consider using a single uber-shader with defines.",i),null!==e.gpuTime&&e.gpuTime>16&&this.addWarning(t,"gpu_time",e.gpuTime>33?"critical":"warning",`GPU time: ${e.gpuTime.toFixed(1)}ms (above 16ms budget)`,e.gpuTime,16,"Simplify shaders, reduce overdraw, lower shadow map resolution, use fewer real-time lights, consider baked lighting.",i),t}addWarning(e,t,i,s,r,n,a,o){const l=`${t}-${i}`;if(this.warningHashes.has(l))return;this.warningHashes.add(l);const h={id:`${t}-${Date.now()}`,severity:i,category:t,message:s,value:r,threshold:n,timestamp:o,suggestion:a};e.push(h),this.warnings.push(h)}computeFramePacing(e){if(e.length<2)return this.emptyFramePacing();const t=e.map(e=>e.frameTime),i=t.reduce((e,t)=>e+t,0)/t.length,s=t.reduce((e,t)=>e+(t-i)**2,0)/t.length,r=Math.sqrt(s),n=16.67*.1,a=t.filter(e=>Math.abs(e-16.67)<=n).length/t.length*100,o=2*i,l=t.filter(e=>e>o).length,h=e.length>0?(e[e.length-1].timestamp-e[0].timestamp)/1e3:1,g=h>0?l/h*60:0,c=1.5*i;let m=0,u=0;for(const e of t)e<=c?(u++,u>m&&(m=u)):u=0;const d=[0,0,0,0,0];for(const e of t)e<8?d[0]++:e<16?d[1]++:e<33?d[2]++:e<50?d[3]++:d[4]++;let p="stable";if(t.length>=120){const e=this.config.thresholds.frameTime.green,i=Math.floor(t.length/2),s=t.slice(0,i).sort((e,t)=>e-t),r=t.slice(i).sort((e,t)=>e-t),n=s[Math.floor(.99*s.length)]??0,a=r[Math.floor(.99*r.length)]??0;a>1.2*n&&a>e?p="degrading":a<.83*n&&n>e&&(p="improving")}return{frameTimeStdDev:r,consistencyPercent:a,janksPerMinute:g,longestSmoothStreak:m,histogram:d,varianceTrend:p}}emptyFramePacing(){return{frameTimeStdDev:0,consistencyPercent:0,janksPerMinute:0,longestSmoothStreak:0,histogram:[0,0,0,0,0],varianceTrend:"stable"}}classifyBottleneck(e,t,i,s){if(i<=0)return{type:"unknown",description:"Insufficient data",confidence:0,suggestion:""};if(i<=17.5&&e<12&&(null===t||t<12))return{type:"vsync-limited",description:"Running at vsync cap with headroom available",confidence:.9,suggestion:"Performance is good. Add more visual quality or increase simulation complexity."};const r=null!==t&&t>0;if(s>500&&e>10)return{type:"draw-call-bound",description:`${s} draw calls causing ${e.toFixed(1)}ms CPU overhead`,confidence:.85,suggestion:"Use InstancedMesh for repeated geometry, merge static meshes, share materials, use texture atlases."};if(r){const i=e/t;if(i>2)return{type:"cpu-bound",description:`CPU render time (${e.toFixed(1)}ms) is ${i.toFixed(1)}x GPU time (${t.toFixed(1)}ms)`,confidence:Math.min(.95,.6+.1*i),suggestion:"Reduce draw call count, simplify scene graph, optimize JavaScript logic, use web workers for heavy computation."};if(i<.5)return{type:"gpu-bound",description:`GPU time (${t.toFixed(1)}ms) is ${(1/i).toFixed(1)}x CPU time (${e.toFixed(1)}ms)`,confidence:Math.min(.95,.6+1/i*.1),suggestion:"Simplify shaders, reduce overdraw, lower shadow/texture resolution, use LOD, reduce post-processing passes."}}const n=r?Math.max(e,t):e;return i>2*n&&n>0?{type:"main-thread",description:`Frame time (${i.toFixed(1)}ms) is ${(i/n).toFixed(1)}x render time (${n.toFixed(1)}ms) — non-render work blocking`,confidence:.75,suggestion:"Profile JavaScript execution. Check for GC pauses, expensive physics, or layout thrashing between frames."}:{type:"balanced",description:"No single bottleneck detected — CPU and GPU load are balanced",confidence:.5,suggestion:"For further optimization, reduce scene complexity across the board or enable LOD."}}computePerformanceScore(e){const t=this.config.thresholds,i=e.fps.avg>=60?100:e.fps.avg>=30?50+(e.fps.avg-30)/30*50:Math.max(0,e.fps.avg/30*50),s=e.framePacing,r=Math.max(0,Math.min(100,.4*s.consistencyPercent+.3*Math.max(0,100-5*s.janksPerMinute)+.3*Math.max(0,100-10*s.frameTimeStdDev))),n=e.textureMemoryMB+e.geometryMemoryMB,a=t.textureMemoryMB.green,o=t.textureMemoryMB.yellow,l=n<=a?100:n<=o?50+50*(1-(n-a)/(o-a)):Math.max(0,50-(n-o)/o*50),h=((e.drawCalls<=t.drawCalls.green?100:e.drawCalls<=t.drawCalls.yellow?50+50*(1-(e.drawCalls-t.drawCalls.green)/(t.drawCalls.yellow-t.drawCalls.green)):Math.max(0,50-(e.drawCalls-t.drawCalls.yellow)/t.drawCalls.yellow*50))+(e.triangles<=t.triangles.green?100:e.triangles<=t.triangles.yellow?50+50*(1-(e.triangles-t.triangles.green)/(t.triangles.yellow-t.triangles.green)):Math.max(0,50-(e.triangles-t.triangles.yellow)/t.triangles.yellow*50)))/2,g=null===e.gpuTime||e.gpuTime<=8?100:e.gpuTime<=16?50+50*(1-(e.gpuTime-8)/8):Math.max(0,50-(e.gpuTime-16)/16*50);let c=Math.round(.4*i+.2*r+.15*l+.15*h+.1*g);c=Math.max(0,Math.min(100,c));const m=this.lastComputedScore<0?c:Math.round(.3*c+.7*this.lastComputedScore);this.lastComputedScore=m;const{grade:u,label:d}=function(e){return e>=90?{grade:"excellent",label:"Excellent"}:e>=70?{grade:"good",label:"Good"}:e>=50?{grade:"needs-work",label:"Needs Work"}:e>=30?{grade:"poor",label:"Poor"}:{grade:"critical",label:"Critical"}}(m);return{score:m,grade:u,gradeLabel:d,categories:{performance:Math.round(Math.max(0,Math.min(100,i))),smoothness:Math.round(Math.max(0,Math.min(100,r))),memory:Math.round(Math.max(0,Math.min(100,l))),rendering:Math.round(Math.max(0,Math.min(100,h))),gpu:Math.round(Math.max(0,Math.min(100,g)))},issues:this.generateIssues(e)}}generateIssues(e){const a=[],o=this.config.thresholds;e.fps.avg>0&&e.fps.avg<o.fps.yellow&&a.push({id:"fps-low",severity:e.fps.avg<o.fps.yellow/2?"critical":"warning",title:"Game is running slowly",description:e.fps.avg<20?"Your game is very slow. Try reducing the number of objects or simplifying visual effects.":"Your game could be smoother. Consider simplifying busy scenes.",category:"performance",icon:t}),e.drawCalls>o.drawCalls.yellow&&a.push({id:"draw-calls-high",severity:e.drawCalls>3*o.drawCalls.yellow?"critical":"warning",title:"Too many objects drawing separately",description:"Group similar objects together so the game does less work each frame. Objects with the same look can often be merged.",category:"rendering",icon:i}),e.triangles>o.triangles.yellow&&a.push({id:"triangles-high",severity:e.triangles>3*o.triangles.yellow?"critical":"warning",title:"Too much geometry detail",description:"Some models have more detail than needed. Use simpler models for background objects or things far from the camera.",category:"rendering",icon:i}),e.textureMemoryMB>o.textureMemoryMB.yellow&&a.push({id:"texture-memory-high",severity:e.textureMemoryMB>2*o.textureMemoryMB.yellow?"critical":"warning",title:"Large images using lots of memory",description:"Your textures are using a lot of GPU memory. Try compressing images, using smaller sizes, or sharing textures between objects.",category:"memory",icon:s}),e.geometryMemoryMB>o.geometryMemoryMB.yellow&&a.push({id:"geometry-memory-high",severity:e.geometryMemoryMB>2*o.geometryMemoryMB.yellow?"critical":"warning",title:"Too much 3D data in memory",description:"Your models are using lots of memory. Share shapes between similar objects and remove unused geometry.",category:"memory",icon:s}),null!==e.gpuTime&&e.gpuTime>16&&a.push({id:"gpu-time-high",severity:e.gpuTime>33?"critical":"warning",title:"GPU is working too hard",description:"Your graphics card is struggling. Simplify visual effects, reduce shadow quality, or lower the resolution.",category:"gpu",icon:r}),e.framePacing.janksPerMinute>10&&a.push({id:"jank-detected",severity:e.framePacing.janksPerMinute>30?"critical":"warning",title:"Game stutters occasionally",description:"Your game has noticeable hiccups. This can be caused by loading assets during gameplay or doing too much work at once.",category:"smoothness",icon:n});const l=this.config.thresholds.frameTime.green,h=this.getBurnRate(1e4,l),g=this.getBurnRate(6e4,l),c=this.getBurnRate(3e5,l);return h>=10&&g>=10?a.push({id:"performance-degrading",severity:"critical",title:"Game is stuttering right now",description:"Frames are missing the target budget at 10× the rate the SLO allows, both in the last 10 seconds and the last minute. Something is actively wrong — recent code changes or an expensive scene transition.",category:"smoothness",icon:n}):c>=3&&g>=3&&a.push({id:"performance-degrading",severity:"warning",title:"Performance getting worse over time",description:"Frames have been missing the target budget at 3× the rate the SLO allows, sustained over the last few minutes. Common causes: objects accumulating without cleanup, growing particle pool, forgotten event listeners.",category:"smoothness",icon:n}),a}hookStateChangeTracking(){const e=this.getGLContext();if(!e)return;const t=this.stateChangeCounters;this.originalUseProgram=e.useProgram.bind(e),e.useProgram=e=>(t.programSwitches++,this.originalUseProgram(e)),this.originalBindTexture=e.bindTexture.bind(e),e.bindTexture=(e,i)=>(t.textureSwitches++,this.originalBindTexture(e,i)),this.originalBindFramebuffer=e.bindFramebuffer.bind(e),e.bindFramebuffer=(e,i)=>(t.fboSwitches++,this.originalBindFramebuffer(e,i)),this.log("WebGL state change tracking active")}unhookStateChangeTracking(){const e=this.getGLContext();e&&(this.originalUseProgram&&(e.useProgram=this.originalUseProgram,this.originalUseProgram=null),this.originalBindTexture&&(e.bindTexture=this.originalBindTexture,this.originalBindTexture=null),this.originalBindFramebuffer&&(e.bindFramebuffer=this.originalBindFramebuffer,this.originalBindFramebuffer=null))}startLoafObserver(){try{if("undefined"==typeof PerformanceObserver)return;const e=PerformanceObserver.supportedEntryTypes;if(!e?.includes("long-animation-frame"))return;this.loafObserver=new PerformanceObserver(e=>{for(const t of e.getEntries()){const e=t;this.loafEntries.push({duration:e.duration,renderStart:e.renderStart??0,styleAndLayoutStart:e.styleAndLayoutStart??0,scripts:(e.scripts??[]).map(e=>({sourceURL:e.sourceURL||"unknown",invoker:e.invoker||"unknown",duration:e.duration})),timestamp:e.startTime}),this.loafEntries.length>50&&this.loafEntries.shift()}}),this.loafObserver.observe({type:"long-animation-frame",buffered:!1}),this.log("Long Animation Frame (LoAF) observer active")}catch{}}stopLoafObserver(){this.loafObserver&&(this.loafObserver.disconnect(),this.loafObserver=null)}getWindowedStats(e){const t=performance.now()-e,i=this.ringBuffer.sliceSince(t),s=i.length;if(0===s)return{windowMs:e,sampleCount:0,fps:{p50:0,p95:0,p99:0,min:0,max:0,avg:0},frameTime:{p50:0,p95:0,p99:0,max:0,avg:0},heap:{start:0,end:0,min:0,max:0,deltaPerMin:0}};const r=i.map(e=>e.fps),n=i.map(e=>e.frameTime),a=i.map(e=>(e.jsHeapUsed??0)/1048576),o=a[a.length-1]-a[0],h=(i[i.length-1].timestamp-i[0].timestamp)/6e4,g=(e,t)=>e+t;return{windowMs:e,sampleCount:s,fps:{p50:l(r,50),p95:l(r,95),p99:l(r,99),min:Math.min(...r),max:Math.max(...r),avg:r.reduce(g,0)/s},frameTime:{p50:l(n,50),p95:l(n,95),p99:l(n,99),max:Math.max(...n),avg:n.reduce(g,0)/s},heap:{start:a[0],end:a[a.length-1],min:Math.min(...a),max:Math.max(...a),deltaPerMin:h>0?o/h:0}}}getBurnRate(e,t,i=30){const s=performance.now()-e;return function(e,t,i=30){if(e.length<i)return 0;let s=0;for(const i of e)i.frameTime>t&&(s+=1);return s/e.length/.01}(this.ringBuffer.sliceSince(s),t,i)}buildSnapshot(){const e=this.ringBuffer.sliceSince(0),t=e.length>0?this.aggregateStats(e):this.emptyStats();this.warningHashes.clear(),this.warnings=[],this.detectWarnings(t);let i=this.getHotObjects()??void 0;if(i&&i.length>0){const e=t.triangles||1,s=t.drawCalls||1;i=i.map(t=>({...t,triangleBudgetPercent:t.triangles/e*100,drawCallBudgetPercent:t.drawCalls/s*100}))}return{engine:this.engineType,timestamp:Date.now(),profilingDuration:performance.now()-this.profilingStartTime,stats:t,recentSamples:e.slice(-30),warnings:[...this.warnings],engineInfo:this.getEngineInfo(),hotObjects:i,loafEntries:this.loafEntries.length>0?[...this.loafEntries]:void 0}}getReport(){return function(e){const{stats:t,warnings:i,engineInfo:s,hotObjects:r}=e,n=["## Performance Profile","",`**Engine:** ${s.name} ${s.version} | **Renderer:** ${s.renderer}`,`**Canvas:** ${s.canvasWidth}x${s.canvasHeight} @ ${s.pixelRatio}x DPR`,`**Profiling Duration:** ${(e.profilingDuration/1e3).toFixed(1)}s | **Samples:** ${e.recentSamples.length}`,"","### Frame Performance","| Metric | Current | Min | Max | Avg |","|--------|---------|-----|-----|-----|",`| FPS | ${t.fps.current.toFixed(1)} | ${t.fps.min.toFixed(1)} | ${t.fps.max.toFixed(1)} | ${t.fps.avg.toFixed(1)} |`,`| Frame Time (ms) | ${t.frameTime.current.toFixed(2)} | ${t.frameTime.min.toFixed(2)} | ${t.frameTime.max.toFixed(2)} | ${t.frameTime.avg.toFixed(2)} |`,`| CPU Render (ms) | ${t.cpuTime.current.toFixed(2)} | ${t.cpuTime.min.toFixed(2)} | ${t.cpuTime.max.toFixed(2)} | ${t.cpuTime.avg.toFixed(2)} |`,null!==t.gpuTime?`| GPU Time (ms) | ${t.gpuTime.toFixed(2)} | - | - | - |`:"","","### Render Pipeline","| Metric | Value |","|--------|-------|",`| Draw Calls | ${t.drawCalls.toLocaleString()} |`,`| Triangles | ${t.triangles.toLocaleString()} |`,`| Points | ${t.points.toLocaleString()} |`,`| Lines | ${t.lines.toLocaleString()} |`,`| Shader Programs | ${t.programCount} |`,"","### Memory","| Metric | Value |","|--------|-------|",`| Textures | ${t.textureCount} (${t.textureMemoryMB.toFixed(1)} MB) |`,`| Geometries | ${t.geometryCount} (${t.geometryMemoryMB.toFixed(1)} MB) |`,null!==t.jsHeapUsedMB?`| JS Heap | ${t.jsHeapUsedMB.toFixed(1)} MB |`:"","","### Scene Graph","| Metric | Value |","|--------|-------|",`| Total Objects | ${t.totalObjects.toLocaleString()} |`,`| Visible Objects | ${t.visibleObjects.toLocaleString()} |`,`| Lights | ${t.lightsCount} |`,`| Cameras | ${t.camerasCount} |`],a=t.framePacing;a&&n.push("### Frame Pacing (Smoothness)","| Metric | Value |","|--------|-------|",`| Consistency | ${a.consistencyPercent.toFixed(1)}% of frames on-target |`,`| Std Deviation | ${a.frameTimeStdDev.toFixed(2)}ms |`,`| Janks/min | ${a.janksPerMinute.toFixed(1)} |`,`| Longest Smooth Streak | ${a.longestSmoothStreak} frames |`,`| Variance Trend | ${a.varianceTrend} |`,`| Histogram (0-8/8-16/16-33/33-50/50+ms) | ${a.histogram.join(" / ")} |`,"");const o=t.bottleneck;if(o&&"unknown"!==o.type&&n.push("### Bottleneck Analysis",`- **Type:** ${o.type} (${(100*o.confidence).toFixed(0)}% confidence)`,`- **Analysis:** ${o.description}`,`- **Suggestion:** ${o.suggestion}`,""),(t.programSwitches>0||t.textureSwitches>0||t.fboSwitches>0)&&n.push("### WebGL State Changes (per frame)","| Metric | Value |","|--------|-------|",`| Program Switches | ${t.programSwitches} |`,`| Texture Binds | ${t.textureSwitches} |`,`| FBO Switches | ${t.fboSwitches} |`,""),(void 0!==s.antialias||s.shadows||s.toneMapping)&&(n.push("","### Renderer Settings"),void 0!==s.antialias&&n.push("- Antialiasing: "+(s.antialias?"ON":"OFF")),s.shadows&&n.push("- Shadows: "+(s.shadows.enabled?`ON (${s.shadows.type||"default"})`:"OFF")),s.toneMapping&&n.push(`- Tone Mapping: ${s.toneMapping}`),s.maxTextureSize&&n.push(`- Max Texture Size: ${s.maxTextureSize}`)),i.length>0){n.push("","### Performance Warnings");for(const e of i){const t="critical"===e.severity?"CRITICAL":"warning"===e.severity?"WARNING":"INFO";n.push(`- **[${t}]** ${e.message} (${e.value} > threshold ${e.threshold})`),n.push(` Suggestion: ${e.suggestion}`)}}if(r&&r.length>0){n.push("","### Top Objects by Cost"),n.push("| Object | Type | Triangles | Tri% | Draw Calls | DC% | Tex MB |"),n.push("|--------|------|-----------|------|------------|-----|--------|");for(const e of r.slice(0,10)){const t=void 0!==e.triangleBudgetPercent?`${e.triangleBudgetPercent.toFixed(1)}%`:"-",i=void 0!==e.drawCallBudgetPercent?`${e.drawCallBudgetPercent.toFixed(1)}%`:"-";n.push(`| ${e.name} | ${e.type} | ${e.triangles.toLocaleString()} | ${t} | ${e.drawCalls} | ${i} | ${(e.textureBytes/1024/1024).toFixed(1)} |`)}}if(e.loafEntries&&e.loafEntries.length>0){n.push("","### Long Animation Frames (Browser Jank)"),n.push("| Duration | Render Start | Scripts |"),n.push("|----------|-------------|---------|");for(const t of e.loafEntries.slice(-5)){const e=t.scripts.map(e=>`${e.invoker}(${e.duration.toFixed(0)}ms)`).join(", ")||"none";n.push(`| ${t.duration.toFixed(0)}ms | ${t.renderStart.toFixed(0)}ms | ${e} |`)}}if(e.recentSamples.length>0){const t=e.recentSamples.slice(-10);n.push("",`### Recent Frame Times (last ${t.length} samples)`),n.push(`\`${t.map(e=>e.frameTime.toFixed(1)).join(" → ")} ms\``);const i=t.reduce((e,t)=>e+t.frameTime,0)/t.length,s=t.filter(e=>e.frameTime>2*i);s.length>0&&n.push(`⚠ ${s.length} frame time spike(s) detected (>2x average)`)}return n.filter(e=>""!==e).join("\n")}(this.buildSnapshot())}updateConfig(e){this.config={...this.config,...e},e.bufferSize&&e.bufferSize!==this.ringBuffer.capacity&&(this.ringBuffer=new o(e.bufferSize))}exposeGlobalAPI(){window.__funpixelProfiler={start:()=>this.start(),stop:()=>this.stop(),isRunning:()=>this.isRunning,getSnapshot:()=>this.buildSnapshot(),getReport:()=>this.getReport()}}log(e,t="log"){(this.config.debug||"log"!==t)&&console[t](`[Funpixel Profiler] ${e}`)}destroy(){this.stop(),this.gpuTimer?.destroy(),this.messages.destroy(),delete window.__funpixelProfiler}}const m={0:"BasicShadowMap",1:"PCFShadowMap",2:"PCFSoftShadowMap",3:"VSMShadowMap"},u={0:"NoToneMapping",1:"LinearToneMapping",2:"ReinhardToneMapping",3:"CineonToneMapping",4:"ACESFilmicToneMapping",5:"CustomToneMapping",6:"AgXToneMapping",7:"NeutralToneMapping"};class d extends c{engineType="threejs";scene=null;renderer=null;camera=null;originalRender=null;cachedTextureBytes=0;cachedGeometryBytes=0;constructor(e){super(e),this.init()}collectRenderStats(){if(!this.renderer)return{};const e=this.renderer.info,t=e.render,i=e.memory,s=e.programs,r=this.cachedTextureBytes&&isFinite(this.cachedTextureBytes)?this.cachedTextureBytes:512*i.textures*512*4,n=this.cachedGeometryBytes&&isFinite(this.cachedGeometryBytes)?this.cachedGeometryBytes:50*i.geometries*1024;return{drawCalls:t.calls,triangles:t.triangles,points:t.points,lines:t.lines,textureCount:i.textures,textureBytes:r,geometryCount:i.geometries,geometryBytes:n,programCount:s?.length??0}}collectSceneStats(){if(!this.scene)return{totalObjects:0,visibleObjects:0,lightsCount:0,camerasCount:0};let e=0,t=0,i=0,s=0,r=!1;const n=new Set,a=new Set;let o=0,l=0;const h=[this.scene];for(;h.length>0;){const g=h.pop();e++,g.visible&&t++,g.isLight&&i++,g.isCamera&&(s++,g===this.camera&&(r=!0)),g.geometry&&!n.has(g.geometry)&&(n.add(g.geometry),o+=this.computeGeometryBytes(g.geometry));const c=Array.isArray(g.material)?g.material:g.material?[g.material]:[];for(const e of c){const t=[e.map,e.normalMap,e.roughnessMap,e.metalnessMap,e.emissiveMap,e.aoMap,e.envMap];for(const e of t)e&&!a.has(e)&&(a.add(e),l+=this.computeTextureBytes(e))}for(let e=g.children.length-1;e>=0;e--)h.push(g.children[e])}return this.camera&&!r&&s++,this.cachedTextureBytes=l,this.cachedGeometryBytes=o,{totalObjects:e,visibleObjects:t,lightsCount:i,camerasCount:s}}computeGeometryBytes(e){let t=0;if(e.attributes)for(const i of Object.values(e.attributes))i.array&&"byteLength"in i.array?t+=i.array.byteLength||0:i.count&&i.itemSize&&(t+=i.count*i.itemSize*4);return e.index?.array&&"byteLength"in e.index.array?t+=e.index.array.byteLength||0:e.index?.count&&(t+=4*e.index.count),t||0}computeTextureBytes(e){const t=e.image||e.source?.data;if(t?.width&&t?.height){return t.width*t.height*4||0}return 1048576}hookRenderLoop(){if(!this.renderer||this.originalRender)return;this.originalRender=this.renderer.render.bind(this.renderer);const e=this;this.renderer.render=(t,i)=>{e.gpuTimer?.beginFrame();const s=performance.now();e.originalRender(t,i);const r=performance.now()-s;e.gpuTimer?.endFrame(),e.onFrameEnd(r)},this.log("Hooked renderer.render() for frame timing")}unhookRenderLoop(){this.renderer&&this.originalRender&&(this.renderer.render=this.originalRender,this.originalRender=null,this.log("Unhooked renderer.render()"))}isEngineReady(){return!(!window.__THREEJS_RENDERER__||!window.__THREEJS_SCENE__||!window.__THREEJS_CAMERA__&&!this.findCamera(window.__THREEJS_SCENE__))}getGLContext(){if(!this.renderer)return null;if(this.renderer.getContext)try{return this.renderer.getContext()}catch{}const e=this.renderer.domElement;return e.getContext("webgl2",{failIfMajorPerformanceCaveat:!1})||e.getContext("webgl",{failIfMajorPerformanceCaveat:!1})}getCanvas(){return this.renderer?.domElement??null}getEngineInfo(){const e=this.renderer,t=e?.capabilities,i=e?.domElement,s=this.getGLContext(),r=t?.isWebGL2??s instanceof WebGL2RenderingContext,n=[];if(s){const e=s.getSupportedExtensions();if(e){const t=["EXT_disjoint_timer_query","EXT_disjoint_timer_query_webgl2","OES_texture_float","OES_texture_half_float","WEBGL_compressed_texture_s3tc","WEBGL_compressed_texture_astc","EXT_texture_filter_anisotropic","WEBGL_draw_buffers","OES_element_index_uint"];for(const i of t)e.includes(i)&&n.push(i)}}return{name:"Three.js",version:window.THREE?.REVISION?`r${window.THREE.REVISION}`:"unknown",renderer:r?"WebGL2":"WebGL",canvasWidth:i?.width??0,canvasHeight:i?.height??0,pixelRatio:e?.getPixelRatio()??1,extensions:n,maxTextureSize:t?.maxTextureSize??(s?s.getParameter(s.MAX_TEXTURE_SIZE):void 0),antialias:s?!!s.getContextAttributes()?.antialias:void 0,shadows:e?.shadowMap?{enabled:e.shadowMap.enabled,type:void 0!==e.shadowMap.type?m[e.shadowMap.type]:void 0}:void 0,toneMapping:void 0!==e?.toneMapping?u[e.toneMapping]:void 0}}getHotObjects(){if(!this.scene)return null;const e=[],t=[this.scene];for(;t.length>0;){const i=t.pop();if(i.isMesh||i.isSkinnedMesh||i.isInstancedMesh||i.isSprite||i.isPoints||i.isLine){const t=i.geometry;let s=0;t&&(t.index?s=(t.index.count??0)/3:t.attributes?.position&&(s=(t.attributes.position.count??0)/3),i.isInstancedMesh&&i.count&&(s*=i.count));let r=0;const n=Array.isArray(i.material)?i.material:i.material?[i.material]:[];for(const e of n){const t=[e.map,e.normalMap,e.roughnessMap,e.metalnessMap,e.emissiveMap,e.aoMap,e.envMap];for(const e of t)if(e){const t=e.image||e.source?.data;t?.width&&t?.height&&(r+=t.width*t.height*4)}}e.push({name:i.name||i.type,type:i.type,triangles:s,drawCalls:i.isInstancedMesh?1:n.length||1,textureBytes:r,visible:i.visible,position:{x:i.position.x,y:i.position.y,z:i.position.z}})}for(let e=i.children.length-1;e>=0;e--)t.push(i.children[e])}return e.sort((e,t)=>t.triangles-e.triangles),e.slice(0,20)}onEngineReady(){this.renderer=window.__THREEJS_RENDERER__,this.scene=window.__THREEJS_SCENE__,this.camera=window.__THREEJS_CAMERA__||this.findCamera(this.scene),this.log(`Three.js ${window.THREE?.REVISION?"r"+window.THREE.REVISION:""} detected`),this.log(`Scene: ${this.scene.children.length} top-level objects`),super.onEngineReady()}findCamera(e){if(!e)return null;const t=[e];for(;t.length>0;){const e=t.pop();if(e.isCamera)return e;for(const i of e.children)t.push(i)}return null}}function p(){new d({debug:!0})}return"loading"===document.readyState?document.addEventListener("DOMContentLoaded",p):p(),e.ThreeJsProfiler=d,e}({});
@@ -0,0 +1,234 @@
1
+ import { deltaE, lab, palette } from "../score/measure.js";
2
+ const DEG = Math.PI / 180;
3
+ const r1 = (v) => Math.round(v * 10) / 10;
4
+ const r2 = (v) => Math.round(v * 100) / 100;
5
+ const clamp = (v, lo, hi) => Math.max(lo, Math.min(hi, v));
6
+ const fmt = (v) => `(${v.map((x) => r1(x)).join(', ')})`;
7
+ export function horizonAt(pitch, vfov) {
8
+ return 0.5 - 0.5 * Math.tan(pitch) / Math.tan((vfov * DEG) / 2);
9
+ }
10
+ export function pitchFor(h, vfov) {
11
+ return Math.atan((0.5 - h) * 2 * Math.tan((vfov * DEG) / 2));
12
+ }
13
+ export function fovFor(vfov, k) {
14
+ return (2 * Math.atan(Math.tan((vfov * DEG) / 2) / k)) / DEG;
15
+ }
16
+ const hfovOf = (vfov, aspect) => (2 * Math.atan(Math.tan((vfov * DEG) / 2) * aspect)) / DEG;
17
+ export const HORIZON_TRUST = 0.2;
18
+ export const YAW_GAIN = 0.5;
19
+ export const CLEARANCE = 0.4;
20
+ export function framingK(d) {
21
+ if (d.hero)
22
+ return d.hero.target / d.hero.capture;
23
+ return d.zoom >= 1.12 || d.zoom <= 0.9 ? d.zoom : null;
24
+ }
25
+ export const LENS = { min: 22, max: 75, step: 1.25 };
26
+ export function cameraMoves(d, cam) {
27
+ if (!cam)
28
+ return [];
29
+ return cam.kind === '2d' ? moves2d(d, cam) : moves3d(d, cam);
30
+ }
31
+ function moves3d(d, cam) {
32
+ const out = [];
33
+ const sp = cam.shotParams ?? null;
34
+ const vfov = sp?.fov ?? cam.fov ?? null;
35
+ if (vfov === null)
36
+ return out;
37
+ const aspect = cam.aspect ?? 16 / 9;
38
+ const k = framingK(d);
39
+ let fov = vfov, distK = 1;
40
+ if (k !== null && Math.abs(Math.log(k)) > Math.log(1.08)) {
41
+ const lensK = clamp(k, 1 / LENS.step, LENS.step);
42
+ fov = clamp(fovFor(vfov, lensK), LENS.min, LENS.max);
43
+ const got = Math.tan((vfov * DEG) / 2) / Math.tan((fov * DEG) / 2);
44
+ distK = got / k;
45
+ }
46
+ const ht = d.horizon.target, hc = d.horizon.capture;
47
+ let horizonNote = null;
48
+ const pitchToward = (pitch, lens) => {
49
+ if (ht === null)
50
+ return pitch;
51
+ if (hc !== null && Math.abs(hc - horizonAt(pitch, vfov)) > HORIZON_TRUST) {
52
+ horizonNote = `the read skyline (${Math.round(hc * 100)}% down) is not where this camera's pitch puts the horizon (${Math.round(horizonAt(pitch, vfov) * 100)}%): an edge, not a horizon, so no tilt from it`;
53
+ return pitch;
54
+ }
55
+ if (hc === null) {
56
+ horizonNote = `a skyline is read in the target only (${Math.round(ht * 100)}% down), none in the capture: tilt by eye if the target's is a true horizon`;
57
+ return pitch;
58
+ }
59
+ if (Math.abs(ht - hc) < 0.06)
60
+ return pitch;
61
+ return pitchFor(horizonAt(pitch, lens) + (ht - hc), lens);
62
+ };
63
+ if (sp) {
64
+ const pitch = Math.atan2(sp.height, sp.distance), reach = Math.hypot(sp.distance, sp.height);
65
+ const want = pitchToward(pitch, fov);
66
+ const newReach = reach * distK;
67
+ const dist = newReach * Math.cos(want), height = newReach * Math.sin(want);
68
+ const base = cam.source;
69
+ if (Math.abs(fov - vfov) >= 1)
70
+ out.push({ param: `${base}.fov`, from: r1(vfov), to: r1(fov), closes: d.hero ? 'hero' : 'composition', why: `frame ×${r2(k)} ${k > 1 ? 'tighter' : 'wider'}${d.hero ? ` (the hero is ${Math.round(d.hero.capture * 100)}% of the height, the target's ${Math.round(d.hero.target * 100)}%)` : ' (the edge fit of the capture over the target)'}` });
71
+ if (Math.abs(height - sp.height) >= 0.1)
72
+ out.push({ param: `${base}.height`, from: r2(sp.height), to: r2(height), closes: 'composition', why: ht !== null ? `the horizon at ${Math.round(ht * 100)}% down the frame, as the target's (pitch ${r1(pitch / DEG)}° → ${r1(want / DEG)}° down at the same reach)` : `the same pitch at ${distK > 1 ? 'a longer' : 'a shorter'} reach` });
73
+ if (Math.abs(dist - sp.distance) >= 0.1)
74
+ out.push({ param: `${base}.distance`, from: r2(sp.distance), to: r2(dist), closes: 'composition', why: distK !== 1 ? `the rest of the framing is distance: the reach ×${r2(distK)} (the lens moves at most ×${LENS.step} a round, within ${LENS.min}–${LENS.max}°)` : 'keeps the reach while the pitch changes' });
75
+ const yaw = yawMove(d, fov, aspect);
76
+ if (horizonNote)
77
+ out.push({ param: 'note', from: '', to: '', closes: 'composition', why: horizonNote });
78
+ if (yaw !== null)
79
+ out.push({ param: `${base}.yaw`, from: r2(sp.yaw ?? 0), to: r2((sp.yaw ?? 0) + yaw), closes: 'composition', why: `the scene sits ${Math.round(Math.abs(d.pan.x) * 100)}% of the width to the ${d.pan.x > 0 ? 'left' : 'right'} of the target's: turn ${yaw > 0 ? 'left' : 'right'} ${r1(Math.abs(yaw) / DEG)}°` });
80
+ return out;
81
+ }
82
+ if (!cam.position || !cam.target) {
83
+ if (Math.abs(fov - vfov) >= 1)
84
+ out.push({ param: 'camera.fov', from: r1(vfov), to: r1(fov), closes: 'composition', why: `frame ×${r2(k)} ${k > 1 ? 'tighter' : 'wider'}` });
85
+ return out;
86
+ }
87
+ const P = cam.position, T0 = cam.target;
88
+ const L = [T0[0] - P[0], T0[1] - P[1], T0[2] - P[2]];
89
+ const reach = Math.hypot(...L), flat = Math.hypot(L[0], L[2]) || 1e-6;
90
+ const pitch = Math.atan2(-L[1], flat);
91
+ const vt = vanishTurn(d, vfov, aspect);
92
+ const yaw = vt ? (Math.abs(vt.left) >= 0.5 * DEG ? vt.left : null) : yawMove(d, fov, aspect);
93
+ const want = vt ? pitch - vt.up : pitchToward(pitch, fov);
94
+ let fx = L[0] / flat, fz = L[2] / flat;
95
+ if (yaw !== null) {
96
+ const c = Math.cos(yaw), s2 = Math.sin(yaw);
97
+ [fx, fz] = [fx * c + fz * s2, -fx * s2 + fz * c];
98
+ }
99
+ const dir = [fx * Math.cos(want), -Math.sin(want), fz * Math.cos(want)];
100
+ const turned = yaw !== null || Math.abs(want - pitch) >= 0.3 * DEG;
101
+ const T = turned ? [P[0] + dir[0] * reach, P[1] + dir[1] * reach, P[2] + dir[2] * reach] : T0;
102
+ const roomBehind = cam.room?.behind ?? null, roomAbove = cam.room?.above ?? null;
103
+ let nr = reach * distK, boxed = false;
104
+ if (roomBehind !== null && nr > reach + Math.max(0, roomBehind - CLEARANCE)) {
105
+ nr = reach + Math.max(0, roomBehind - CLEARANCE);
106
+ boxed = true;
107
+ }
108
+ const np = [T[0] - dir[0] * nr, T[1] - dir[1] * nr, T[2] - dir[2] * nr];
109
+ if (roomAbove !== null && np[1] > P[1] + Math.max(0, roomAbove - CLEARANCE)) {
110
+ np[1] = P[1] + Math.max(0, roomAbove - CLEARANCE);
111
+ boxed = true;
112
+ }
113
+ if (Math.abs(fov - vfov) >= 1)
114
+ out.push({ param: 'camera.fov', from: r1(vfov), to: r1(fov), closes: d.hero ? 'hero' : 'composition', why: `frame ×${r2(k)} ${k > 1 ? 'tighter' : 'wider'}${d.hero ? ` (hero ${Math.round(d.hero.capture * 100)}% of the height, target ${Math.round(d.hero.target * 100)}%)` : ''}` });
115
+ if (turned) {
116
+ const how = [yaw !== null ? `turn ${yaw > 0 ? 'left' : 'right'} ${r1(Math.abs(yaw) / DEG)}°` : '', Math.abs(want - pitch) >= 0.3 * DEG ? `tilt ${want < pitch ? 'up' : 'down'} ${r1(Math.abs(want - pitch) / DEG)}°` : ''].filter(Boolean).join(' and ');
117
+ const from = vt ? `the lines meet ${Math.round(d.vanish.capture.x * 100)}% across, ${Math.round(d.vanish.capture.y * 100)}% down; the target's at ${Math.round(d.vanish.target.x * 100)}%, ${Math.round(d.vanish.target.y * 100)}%` : yaw !== null ? `the scene sits ${Math.round(Math.abs(d.pan.x) * 100)}% of the width to the ${d.pan.x > 0 ? 'left' : 'right'} of the target's` : `the horizon to ${Math.round((ht ?? 0) * 100)}% down`;
118
+ out.push({ param: 'camera.lookAt', from: fmt(T0), to: fmt(T), closes: 'composition', why: `${from}: ${how}, in place` });
119
+ }
120
+ const moved = Math.hypot(np[0] - P[0], np[1] - P[1], np[2] - P[2]);
121
+ if (moved >= 0.1)
122
+ out.push({ param: 'camera.position', from: fmt(P), to: fmt(np), closes: 'composition', why: `along the view, ${r2(nr / reach)}× the reach (the lens moves at most ×${LENS.step} a round)${boxed ? `; held inside the room (${roomBehind !== null ? `${r1(roomBehind)} m free behind` : ''}${roomBehind !== null && roomAbove !== null ? ', ' : ''}${roomAbove !== null ? `${r1(roomAbove)} m above` : ''}): the rest of a wider frame is the lens, next round` : ''}` });
123
+ if (horizonNote)
124
+ out.push({ param: 'note', from: '', to: '', closes: 'composition', why: horizonNote });
125
+ return out;
126
+ }
127
+ export function vanishTurn(d, vfov, aspect) {
128
+ if (!d.vanish)
129
+ return null;
130
+ const th = Math.tan((hfovOf(vfov, aspect) * DEG) / 2), tv = Math.tan((vfov * DEG) / 2);
131
+ const ang = (u, t) => Math.atan(u * t);
132
+ return {
133
+ left: ang(2 * d.vanish.target.x - 1, th) - ang(2 * d.vanish.capture.x - 1, th),
134
+ up: ang(2 * d.vanish.target.y - 1, tv) - ang(2 * d.vanish.capture.y - 1, tv),
135
+ };
136
+ }
137
+ function yawMove(d, vfov, aspect) {
138
+ if (Math.abs(d.pan.x) < 0.05)
139
+ return null;
140
+ return YAW_GAIN * Math.atan(2 * d.pan.x * Math.tan((hfovOf(vfov, aspect) * DEG) / 2));
141
+ }
142
+ function moves2d(d, cam) {
143
+ const out = [];
144
+ const z = cam.zoom ?? 1, [w, h] = cam.viewport ?? [1280, 720], [ox, oy] = cam.offset ?? [0, 0];
145
+ const k = framingK(d);
146
+ if (k !== null && Math.abs(Math.log(k)) > Math.log(1.08))
147
+ out.push({ param: `${cam.source}.scale`, from: r2(z), to: r2(z * k), closes: d.hero ? 'hero' : 'composition', why: `frame ×${r2(k)} ${k > 1 ? 'tighter' : 'wider'}${d.hero ? ` (the hero ${Math.round(d.hero.capture * 100)}% of the height, the target's ${Math.round(d.hero.target * 100)}%)` : ''}` });
148
+ const dx = Math.abs(d.pan.x) >= 0.05 ? d.pan.x * w : 0;
149
+ const dy = Math.abs(d.pan.y) >= 0.05 ? d.pan.y * h : 0;
150
+ if (dx || dy)
151
+ out.push({ param: `${cam.source}.position`, from: `(${Math.round(ox)}, ${Math.round(oy)})`, to: `(${Math.round(ox + dx)}, ${Math.round(oy + dy)})`, closes: 'composition', why: `the scene moves ${dx ? `${Math.round(Math.abs(dx))} px ${dx > 0 ? 'right' : 'left'}` : ''}${dx && dy ? ' and ' : ''}${dy ? `${Math.round(Math.abs(dy))} px ${dy > 0 ? 'down' : 'up'}` : ''} to sit where the target has it` });
152
+ return out;
153
+ }
154
+ const lin = (c) => { const s = c / 255; return s <= 0.04045 ? s / 12.92 : ((s + 0.055) / 1.055) ** 2.4; };
155
+ export function meanLuminance(p) {
156
+ let s = 0;
157
+ const n = p.width * p.height;
158
+ for (let i = 0; i < n; i++)
159
+ s += 0.2126 * lin(p.data[i * 4]) + 0.7152 * lin(p.data[i * 4 + 1]) + 0.0722 * lin(p.data[i * 4 + 2]);
160
+ return n ? s / n : 0;
161
+ }
162
+ export function labToHex([L, a, b]) {
163
+ const fy = (L + 16) / 116, fx = fy + a / 500, fz = fy - b / 200;
164
+ const inv = (t) => (t ** 3 > 0.008856 ? t ** 3 : (t - 16 / 116) / 7.787);
165
+ const X = inv(fx) * 0.95047, Y = inv(fy), Z = inv(fz) * 1.08883;
166
+ const R = 3.2406 * X - 1.5372 * Y - 0.4986 * Z, G = -0.9689 * X + 1.8758 * Y + 0.0415 * Z, B = 0.0557 * X - 0.204 * Y + 1.057 * Z;
167
+ const g = (c) => Math.round(255 * clamp(c <= 0.0031308 ? 12.92 * c : 1.055 * c ** (1 / 2.4) - 0.055, 0, 1));
168
+ return `#${[R, G, B].map((c) => g(c).toString(16).padStart(2, '0')).join('')}`;
169
+ }
170
+ export function lookMoves(capture, target, cam) {
171
+ const out = [];
172
+ const yc = meanLuminance(capture), yt = meanLuminance(target);
173
+ if (yc > 0 && yt > 0) {
174
+ const ratio = yt / yc;
175
+ if (ratio > 1.25 || ratio < 0.8) {
176
+ const say = `the target's mean light is ×${r2(ratio)} the capture's (${ratio > 1 ? 'lighter' : 'darker'})`;
177
+ if (cam?.exposure != null)
178
+ out.push({ param: 'renderer.toneMappingExposure', from: r2(cam.exposure), to: r2(cam.exposure * ratio), closes: 'palette_light', why: say });
179
+ else
180
+ out.push({ param: 'light', from: '×1', to: `×${r2(ratio)}`, closes: 'palette_light', why: `${say}: scale the key and ambient light (or the sprites' tint) by that much` });
181
+ }
182
+ }
183
+ const pc = palette(capture), pt = palette(target);
184
+ const near = (s, list) => list.reduce((best, x) => { const e = deltaE(s.lab, x.lab); return e < best.e ? { e, x } : best; }, { e: Infinity, x: list[0] });
185
+ for (const s of pt.filter((x) => x.weight >= 0.1)) {
186
+ const n = near(s, pc);
187
+ if (n.e > 18 && n.x)
188
+ out.push({ param: 'colour', from: labToHex(n.x.lab), to: labToHex(s.lab), closes: 'palette_light', why: `the target spends ${Math.round(s.weight * 100)}% of the frame on ${labToHex(s.lab)}; the capture's nearest is ${labToHex(n.x.lab)} (ΔE ${Math.round(n.e)}): move that surface (sky, fog, ground or light) to it` });
189
+ }
190
+ for (const s of pc.filter((x) => x.weight >= 0.12)) {
191
+ const n = near(s, pt);
192
+ if (n.e > 22 && n.x && !out.some((m) => m.from === labToHex(s.lab)))
193
+ out.push({ param: 'colour', from: labToHex(s.lab), to: labToHex(n.x.lab), closes: 'palette_light', why: `the capture spends ${Math.round(s.weight * 100)}% of the frame on ${labToHex(s.lab)}, a colour the target does not use (nearest ${labToHex(n.x.lab)}, ΔE ${Math.round(n.e)})` });
194
+ }
195
+ return out.slice(0, 4);
196
+ }
197
+ const REGION = ['top left', 'top', 'top right', 'left', 'centre', 'right', 'bottom left', 'bottom', 'bottom right'];
198
+ function busyThirds(p, spread = 18) {
199
+ const out = new Array(9).fill(0), n = new Array(9).fill(0);
200
+ const TX = 16, TY = 9;
201
+ for (let ty = 0; ty < TY; ty++)
202
+ for (let tx = 0; tx < TX; tx++) {
203
+ let lo = 255, hi = 0;
204
+ for (let y = Math.floor((ty * p.height) / TY); y < Math.floor(((ty + 1) * p.height) / TY); y++)
205
+ for (let x = Math.floor((tx * p.width) / TX); x < Math.floor(((tx + 1) * p.width) / TX); x++) {
206
+ const i = (y * p.width + x) * 4, v = 0.299 * p.data[i] + 0.587 * p.data[i + 1] + 0.114 * p.data[i + 2];
207
+ lo = Math.min(lo, v);
208
+ hi = Math.max(hi, v);
209
+ }
210
+ const r = Math.min(2, Math.floor((ty * 3) / TY)) * 3 + Math.min(2, Math.floor((tx * 3) / TX));
211
+ n[r]++;
212
+ if (hi - lo > spread)
213
+ out[r]++;
214
+ }
215
+ return out.map((v, i) => (n[i] ? v / n[i] : 0));
216
+ }
217
+ export function densityMoves(capture, target) {
218
+ const c = busyThirds(capture), t = busyThirds(target);
219
+ const bare = REGION.filter((_, i) => t[i] - c[i] >= 0.35), busy = REGION.filter((_, i) => c[i] - t[i] >= 0.35);
220
+ const out = [];
221
+ const pct = (xs) => Math.round((xs.reduce((a, b) => a + b, 0) / xs.length) * 100);
222
+ if (bare.length)
223
+ out.push({ param: 'dressing', from: `${pct(c)}% of the frame with detail`, to: `${pct(t)}%`, closes: 'density', why: `the target carries detail where the capture is bare: ${bare.join(', ')} — props, texture or set dressing there` });
224
+ if (busy.length)
225
+ out.push({ param: 'dressing', from: busy.join(', '), to: 'quieter', closes: 'density', why: `the capture is busy where the target rests: ${busy.join(', ')}` });
226
+ return out;
227
+ }
228
+ export function fixesFor(o) {
229
+ const all = [...(o.delta ? cameraMoves(o.delta, o.cam) : []), ...lookMoves(o.capture, o.target, o.cam), ...densityMoves(o.capture, o.target)];
230
+ const rank = (m) => (o.gaps.includes(m.closes) ? 0 : 1);
231
+ return all.map((m, i) => ({ m, i })).sort((a, b) => rank(a.m) - rank(b.m) || a.i - b.i).map((x) => x.m);
232
+ }
233
+ export const moveLine = (m) => `${m.param} ${m.from} → ${m.to} — ${m.why}`;
234
+ export { lab };
@@ -0,0 +1,59 @@
1
+ export const READ_CAMERA_JS = `(() => { try {
2
+ const W = window, out = (o) => JSON.stringify(o);
3
+ if (typeof W.__FPX_CAMERA__ === 'function') { const c = W.__FPX_CAMERA__(); if (c && typeof c === 'object') return out(c); }
4
+ const cam = W.__THREEJS_CAMERA__ || (W.camera && W.camera.isPerspectiveCamera ? W.camera : null);
5
+ if (cam && cam.isPerspectiveCamera) {
6
+ cam.updateMatrixWorld && cam.updateMatrixWorld();
7
+ const p = cam.getWorldPosition ? cam.getWorldPosition(new cam.position.constructor()) : cam.position;
8
+ const d = cam.getWorldDirection ? cam.getWorldDirection(new cam.position.constructor()) : null;
9
+ let hy = 0;
10
+ const scene = W.__THREEJS_SCENE__;
11
+ const hero = scene && scene.getObjectByName ? scene.getObjectByName('player') : null;
12
+ if (hero && hero.getWorldPosition) hy = hero.getWorldPosition(new cam.position.constructor()).y + 1;
13
+ let t = null;
14
+ if (d) { const k = Math.abs(d.y) > 1e-3 ? (hy - p.y) / d.y : -1; const s = k > 0.5 && k < 200 ? k : 10; t = [p.x + d.x * s, p.y + d.y * s, p.z + d.z * s]; }
15
+ const r = W.__THREEJS_RENDERER__;
16
+ // Room behind and above the eye, when the page offers three.js to cast with: a pull-back never leaves the room.
17
+ let room = null;
18
+ try { const T3 = W.THREE; if (T3 && scene && d) { const rc = new T3.Raycaster(); const free = (dir) => { rc.set(p, dir); rc.far = 200; const hit = rc.intersectObjects(scene.children, true).find((h) => h.object && h.object.isMesh && h.object.visible); return hit ? hit.distance : null; };
19
+ // Behind: the frustum's centre and its four edges cast backwards, each hit projected on the view axis (a wall with a
20
+ // doorway on the axis still frames the shot, so the centre ray alone overstates the room; one game's vestibule).
21
+ const back = d.clone().negate(), up = new T3.Vector3(0, 1, 0), right = new T3.Vector3().crossVectors(d, up).normalize(), up2 = new T3.Vector3().crossVectors(right, d).normalize();
22
+ const tv = Math.tan(cam.fov * Math.PI / 360), th = tv * (cam.aspect || 1.78);
23
+ let behind = null;
24
+ for (const [a, b] of [[0, 0], [th, 0], [-th, 0], [0, tv], [0, -tv]]) { const e = back.clone().addScaledVector(right, a).addScaledVector(up2, b).normalize(); const h = free(e); if (h !== null) { const along = h * e.dot(back); behind = behind === null ? along : Math.min(behind, along); } }
25
+ room = { behind, above: free(up) }; } } catch (e) { room = null; }
26
+ return out({ kind: '3d', source: 'the three.js camera', room, position: [p.x, p.y, p.z], target: t, fov: cam.fov / (cam.zoom || 1) === cam.fov ? cam.fov : 2 * Math.atan(Math.tan(cam.fov * Math.PI / 360) / (cam.zoom || 1)) * 180 / Math.PI, aspect: cam.aspect, exposure: r && typeof r.toneMappingExposure === 'number' ? r.toneMappingExposure : null });
27
+ }
28
+ const app = W.__PIXI_APP__;
29
+ if (app && app.stage) {
30
+ const kids = app.stage.children || [];
31
+ const world = kids.find((c) => c.label === 'world' || c.name === 'world') || kids[0];
32
+ if (world) return out({ kind: '2d', source: 'the world container (' + (world.label || world.name || 'stage child 0') + ')', zoom: world.scale ? world.scale.x : 1, offset: [world.position ? world.position.x : 0, world.position ? world.position.y : 0], viewport: [innerWidth, innerHeight] });
33
+ }
34
+ return null;
35
+ } catch (e) { return null; } })()`;
36
+ export function parseCamera(raw) {
37
+ if (typeof raw !== 'string')
38
+ return null;
39
+ let c;
40
+ try {
41
+ c = JSON.parse(raw);
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ if (!c || (c.kind !== '3d' && c.kind !== '2d'))
47
+ return null;
48
+ const v3 = (x) => (Array.isArray(x) && x.length === 3 && x.every((n) => Number.isFinite(n)) ? [x[0], x[1], x[2]] : undefined);
49
+ const num = (x) => (Number.isFinite(x) ? Number(x) : undefined);
50
+ const sp = c.shotParams && typeof c.shotParams === 'object' && [c.shotParams.distance, c.shotParams.height, c.shotParams.fov].every(Number.isFinite)
51
+ ? { distance: c.shotParams.distance, height: c.shotParams.height, fov: c.shotParams.fov, ...(Number.isFinite(c.shotParams.lookHeight) ? { lookHeight: c.shotParams.lookHeight } : {}), ...(Number.isFinite(c.shotParams.yaw) ? { yaw: c.shotParams.yaw } : {}) }
52
+ : null;
53
+ const read = { kind: c.kind, source: typeof c.source === 'string' ? c.source : c.kind === '3d' ? 'the camera' : 'the world', shot: typeof c.shot === 'string' ? c.shot : null, position: v3(c.position), target: v3(c.target), fov: num(c.fov), aspect: num(c.aspect), shotParams: sp, zoom: num(c.zoom), offset: Array.isArray(c.offset) && c.offset.length === 2 ? [Number(c.offset[0]), Number(c.offset[1])] : undefined, viewport: Array.isArray(c.viewport) && c.viewport.length === 2 ? [Number(c.viewport[0]), Number(c.viewport[1])] : undefined, exposure: num(c.exposure) ?? null, room: c.room && typeof c.room === 'object' ? { behind: num(c.room.behind) ?? null, above: num(c.room.above) ?? null } : null };
54
+ if (read.kind === '3d' && read.fov === undefined && !sp)
55
+ return null;
56
+ if (read.kind === '2d' && read.zoom === undefined)
57
+ return null;
58
+ return read;
59
+ }
@@ -0,0 +1,80 @@
1
+ import { appendFileSync, mkdirSync, readFileSync } from 'node:fs';
2
+ import { dirname, join } from 'node:path';
3
+ export const SCORES_PATH = join('design', 'look', 'scores.json');
4
+ export const HISTORY_PATH = join('design', 'look', 'score-history.jsonl');
5
+ export const BAR_DEFAULT = 75;
6
+ export const STRETCH_DEFAULT = 90;
7
+ export const GAIN_MIN = 1;
8
+ export const FLAT_ROUNDS = 3;
9
+ const readJson = (p) => { try {
10
+ return JSON.parse(readFileSync(p, 'utf8'));
11
+ }
12
+ catch {
13
+ return null;
14
+ } };
15
+ export function appendHistory(root, record) {
16
+ if (!record || !Array.isArray(record.moments))
17
+ return;
18
+ const line = {
19
+ at: record.at ?? new Date().toISOString(), viewport: record.viewport ?? null, bar: record.bar ?? BAR_DEFAULT,
20
+ moments: record.moments.filter((m) => typeof m?.score === 'number').map((m) => ({ moment: m.moment, score: m.score, axes: Object.fromEntries(Object.entries(m.axes ?? {}).map(([k, v]) => [k, v?.score ?? null])), fixes: (m.fixes ?? []).slice(0, 6) })),
21
+ };
22
+ if (!line.moments.length)
23
+ return;
24
+ const p = join(root, HISTORY_PATH);
25
+ try {
26
+ mkdirSync(dirname(p), { recursive: true });
27
+ appendFileSync(p, JSON.stringify(line) + '\n');
28
+ }
29
+ catch { }
30
+ }
31
+ export function readHistory(root) {
32
+ let text = '';
33
+ try {
34
+ text = readFileSync(join(root, HISTORY_PATH), 'utf8');
35
+ }
36
+ catch {
37
+ return [];
38
+ }
39
+ return text.split('\n').filter(Boolean).map((l) => { try {
40
+ return JSON.parse(l);
41
+ }
42
+ catch {
43
+ return null;
44
+ } }).filter((l) => !!l && Array.isArray(l.moments));
45
+ }
46
+ export function meanScore(record) {
47
+ const s = (record?.moments ?? []).map((m) => m?.score).filter((n) => typeof n === 'number');
48
+ return s.length ? Math.round(s.reduce((a, b) => a + b, 0) / s.length) : null;
49
+ }
50
+ export function fixList(root, raw = readJson(join(root, SCORES_PATH))) {
51
+ const bar = typeof raw?.bar === 'number' ? raw.bar : BAR_DEFAULT, stretch = typeof raw?.stretch === 'number' ? raw.stretch : STRETCH_DEFAULT;
52
+ const list = Array.isArray(raw?.moments) ? raw.moments : [];
53
+ const scored = list.filter((m) => typeof m?.score === 'number');
54
+ const below = scored.filter((m) => m.score < bar).sort((a, b) => a.score - b.score).map((m) => ({
55
+ moment: String(m.moment), score: m.score, bar, stretch, gaps: Array.isArray(m.gaps) ? m.gaps : [], source: m.camera_read?.source ?? null,
56
+ fixes: Array.isArray(m.fixes) && m.fixes.length ? m.fixes : (m.camera?.moves ?? []).map((w) => ({ param: 'camera', from: '', to: '', closes: 'composition', why: w })),
57
+ }));
58
+ return { at: raw?.at ?? null, bar, stretch, mean: meanScore(raw), below, atBar: scored.filter((m) => m.score >= bar).map((m) => `${m.moment} ${m.score}`) };
59
+ }
60
+ export const fixLine = (f) => (f.from === '' && f.to === '' ? f.why : `${f.param} ${f.from} → ${f.to} — ${f.why}`);
61
+ export function fixSummary(fl, n = 3) {
62
+ const m = fl.below[0];
63
+ if (!m)
64
+ return null;
65
+ const moves = m.fixes.slice(0, n).map(fixLine);
66
+ return `${m.moment} ${m.score}/${m.bar}${fl.below.length > 1 ? ` (+${fl.below.length - 1} more under the bar)` : ''}: ${moves.length ? moves.join('; ') : `no move printed (gaps: ${m.gaps.join(', ') || 'none named'})`}`;
67
+ }
68
+ export function flatRounds(rounds, stage) {
69
+ const scored = rounds.filter((r) => r.stage === stage && r.closed_at && typeof r.accuracy === 'number');
70
+ let flat = 0;
71
+ for (let i = scored.length - 1; i >= 0; i--) {
72
+ const best = Math.max(-Infinity, ...scored.slice(0, i).map((r) => r.accuracy));
73
+ if (i > 0 && scored[i].accuracy >= best + GAIN_MIN)
74
+ break;
75
+ if (i === 0)
76
+ break;
77
+ flat++;
78
+ }
79
+ return flat;
80
+ }