@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.
- package/LICENSE +115 -0
- package/NOTICE +28 -0
- package/README.md +110 -2
- package/bench/LICENSE +674 -0
- package/bench/README.md +10 -0
- package/bench/entrypoint.py +94 -0
- package/bench/handlers/__init__.py +53 -0
- package/bench/handlers/apply_skin.py +192 -0
- package/bench/handlers/apply_texture.py +195 -0
- package/bench/handlers/audit_clips.py +351 -0
- package/bench/handlers/author_clips.py +297 -0
- package/bench/handlers/author_motion.py +298 -0
- package/bench/handlers/bake_emissive.py +136 -0
- package/bench/handlers/build_level.py +395 -0
- package/bench/handlers/decimate.py +220 -0
- package/bench/handlers/fit_rig.py +273 -0
- package/bench/handlers/fracture.py +233 -0
- package/bench/handlers/humanoid.py +119 -0
- package/bench/handlers/inspect.py +212 -0
- package/bench/handlers/level_check.py +68 -0
- package/bench/handlers/level_geo.py +150 -0
- package/bench/handlers/level_proof.py +117 -0
- package/bench/handlers/level_props.py +135 -0
- package/bench/handlers/lod.py +83 -0
- package/bench/handlers/merge_clips.py +122 -0
- package/bench/handlers/mirror_limb.py +336 -0
- package/bench/handlers/motion_specs.json +11 -0
- package/bench/handlers/normalize_materials.py +182 -0
- package/bench/handlers/normalize_transform.py +174 -0
- package/bench/handlers/prune_clips.py +141 -0
- package/bench/handlers/raster.py +98 -0
- package/bench/handlers/render.py +239 -0
- package/bench/handlers/render_views.py +101 -0
- package/bench/handlers/retarget_clips.py +185 -0
- package/bench/handlers/scene.py +311 -0
- package/bench/handlers/sheet.py +118 -0
- package/bench/handlers/texels.py +176 -0
- package/bench/handlers/views.py +232 -0
- package/dist/api/generated/openapi.js +1 -0
- package/dist/api/http.js +71 -0
- package/dist/api/jobs.js +94 -0
- package/dist/assets/bakeoff.js +61 -0
- package/dist/assets/counts.js +60 -0
- package/dist/assets/gen.js +230 -0
- package/dist/assets/lock.js +77 -0
- package/dist/assets/manifest.js +236 -0
- package/dist/assets/palette-fit.js +99 -0
- package/dist/assets/pixelart.js +192 -0
- package/dist/assets/pixels.js +131 -0
- package/dist/assets/plan.js +169 -0
- package/dist/assets/process.js +209 -0
- package/dist/assets/script.js +194 -0
- package/dist/assets/steps.js +294 -0
- package/dist/bin.js +8 -0
- package/dist/board/board.js +99 -0
- package/dist/cast/library.js +102 -0
- package/dist/cast/measure.js +222 -0
- package/dist/cli.js +2917 -0
- package/dist/clip/clip.js +83 -0
- package/dist/commands/account.js +158 -0
- package/dist/commands/assets-pixels.js +106 -0
- package/dist/commands/assets.js +473 -0
- package/dist/commands/beats.js +77 -0
- package/dist/commands/board.js +162 -0
- package/dist/commands/boxes.js +89 -0
- package/dist/commands/capture-all.js +92 -0
- package/dist/commands/cast.js +84 -0
- package/dist/commands/character.js +58 -0
- package/dist/commands/check.js +404 -0
- package/dist/commands/clip.js +112 -0
- package/dist/commands/compare-takes.js +204 -0
- package/dist/commands/compare-target.js +149 -0
- package/dist/commands/compare.js +117 -0
- package/dist/commands/compose-variations.js +202 -0
- package/dist/commands/compose.js +163 -0
- package/dist/commands/cut.js +13 -0
- package/dist/commands/decide.js +90 -0
- package/dist/commands/depth.js +171 -0
- package/dist/commands/dev.js +138 -0
- package/dist/commands/directions.js +106 -0
- package/dist/commands/doctor.js +281 -0
- package/dist/commands/export.js +88 -0
- package/dist/commands/feedback.js +496 -0
- package/dist/commands/feel.js +144 -0
- package/dist/commands/fidelity.js +95 -0
- package/dist/commands/find.js +116 -0
- package/dist/commands/firstlook.js +138 -0
- package/dist/commands/flow.js +600 -0
- package/dist/commands/framing.js +53 -0
- package/dist/commands/gdd.js +227 -0
- package/dist/commands/gen.js +512 -0
- package/dist/commands/greenlight.js +148 -0
- package/dist/commands/hook.js +171 -0
- package/dist/commands/init.js +234 -0
- package/dist/commands/inspect.js +161 -0
- package/dist/commands/job.js +41 -0
- package/dist/commands/jobs.js +87 -0
- package/dist/commands/journal.js +58 -0
- package/dist/commands/journey.js +228 -0
- package/dist/commands/judge.js +191 -0
- package/dist/commands/lanes.js +571 -0
- package/dist/commands/lessons.js +74 -0
- package/dist/commands/life.js +134 -0
- package/dist/commands/login.js +134 -0
- package/dist/commands/look-3d.js +105 -0
- package/dist/commands/look-fit.js +116 -0
- package/dist/commands/look-hud.js +180 -0
- package/dist/commands/look-read.js +162 -0
- package/dist/commands/look-sheet.js +152 -0
- package/dist/commands/look-theme.js +136 -0
- package/dist/commands/look.js +373 -0
- package/dist/commands/loop.js +112 -0
- package/dist/commands/loudness.js +69 -0
- package/dist/commands/mobile-qa.js +119 -0
- package/dist/commands/model.js +256 -0
- package/dist/commands/models.js +93 -0
- package/dist/commands/motion.js +305 -0
- package/dist/commands/next.js +72 -0
- package/dist/commands/note.js +294 -0
- package/dist/commands/optimize.js +212 -0
- package/dist/commands/owner.js +109 -0
- package/dist/commands/pack.js +66 -0
- package/dist/commands/parts.js +635 -0
- package/dist/commands/phone.js +398 -0
- package/dist/commands/pick.js +146 -0
- package/dist/commands/pitch.js +205 -0
- package/dist/commands/places.js +89 -0
- package/dist/commands/play.js +368 -0
- package/dist/commands/playable.js +51 -0
- package/dist/commands/playtest.js +262 -0
- package/dist/commands/profile.js +292 -0
- package/dist/commands/progress.js +537 -0
- package/dist/commands/publish.js +165 -0
- package/dist/commands/reach.js +72 -0
- package/dist/commands/reel.js +177 -0
- package/dist/commands/review.js +112 -0
- package/dist/commands/rooms.js +180 -0
- package/dist/commands/schema.js +29 -0
- package/dist/commands/score.js +326 -0
- package/dist/commands/serve.js +67 -0
- package/dist/commands/setup.js +254 -0
- package/dist/commands/sim.js +179 -0
- package/dist/commands/simulator.js +154 -0
- package/dist/commands/smoke-build.js +305 -0
- package/dist/commands/smoke.js +37 -0
- package/dist/commands/spec.js +114 -0
- package/dist/commands/store.js +154 -0
- package/dist/commands/test.js +104 -0
- package/dist/commands/trailer.js +255 -0
- package/dist/commands/unity-editor.js +322 -0
- package/dist/commands/unity-player.js +672 -0
- package/dist/commands/unity.js +198 -0
- package/dist/commands/upgrade.js +186 -0
- package/dist/commands/variety.js +108 -0
- package/dist/commands/verify.js +293 -0
- package/dist/commands/walk.js +449 -0
- package/dist/commands/widen.js +133 -0
- package/dist/commands/world.js +175 -0
- package/dist/commands/wow.js +143 -0
- package/dist/commands/zero.js +71 -0
- package/dist/compose/adsheet.js +61 -0
- package/dist/compose/contract.js +248 -0
- package/dist/compose/facts.js +81 -0
- package/dist/compose/hyperframes.js +102 -0
- package/dist/compose/page.js +216 -0
- package/dist/compose/probe.js +160 -0
- package/dist/compose/run.js +170 -0
- package/dist/compose/sheet.js +92 -0
- package/dist/compose/starters.js +247 -0
- package/dist/compose/variations.js +203 -0
- package/dist/criteria.js +35 -0
- package/dist/depth/experience.js +61 -0
- package/dist/depth/fill.js +102 -0
- package/dist/depth/inventory.js +161 -0
- package/dist/depth/pacing.js +173 -0
- package/dist/depth/story.js +97 -0
- package/dist/dev/devtools.js +119 -0
- package/dist/dev/hold.js +46 -0
- package/dist/dev/lan.js +15 -0
- package/dist/dev/open.js +30 -0
- package/dist/dev/qr.js +124 -0
- package/dist/devtools/LICENSES/pixi.js.LICENSE +21 -0
- package/dist/devtools/LICENSES/preact.LICENSE +21 -0
- package/dist/devtools/LICENSES/source-map-js.LICENSE +28 -0
- package/dist/devtools/LICENSES/three.LICENSE +21 -0
- package/dist/devtools/inspector/funpixel-inspector.pixi.min.js +1 -0
- package/dist/devtools/inspector/funpixel-inspector.threejs.min.js +1 -0
- package/dist/devtools/inspector/hooked-engines/pixi.min.js +8 -0
- package/dist/devtools/inspector/hooked-engines/preact.min.js +1 -0
- package/dist/devtools/inspector/hooked-engines/threejs.min.js +12 -0
- package/dist/devtools/kapture/funpixel-kapture.min.js +1 -0
- package/dist/devtools/profiler/funpixel-profiler.pixi.min.js +1 -0
- package/dist/devtools/profiler/funpixel-profiler.threejs.min.js +1 -0
- package/dist/direct/moves.js +234 -0
- package/dist/direct/read.js +59 -0
- package/dist/direct/round.js +80 -0
- package/dist/doctor/host.js +245 -0
- package/dist/doctor/unity-checks.js +380 -0
- package/dist/doctor/unity-history.js +589 -0
- package/dist/doctor/unity-host.js +160 -0
- package/dist/doctor/unity-import-rules.js +874 -0
- package/dist/doctor/unity-meta.js +225 -0
- package/dist/doctor/unity-project.js +297 -0
- package/dist/doctor/unity.js +171 -0
- package/dist/export/export.js +165 -0
- package/dist/export/metadata.js +25 -0
- package/dist/export/runtime.js +119 -0
- package/dist/export/scan.js +78 -0
- package/dist/export/select.js +193 -0
- package/dist/export/strip.js +42 -0
- package/dist/feedback/ab.js +55 -0
- package/dist/feedback/auto.js +44 -0
- package/dist/feedback/learn.js +255 -0
- package/dist/feedback/measure.js +49 -0
- package/dist/feedback/page.js +66 -0
- package/dist/feel/feedback.js +85 -0
- package/dist/feel/judge.js +420 -0
- package/dist/feel/run.js +185 -0
- package/dist/feel/spec.js +124 -0
- package/dist/feel/sweep.js +156 -0
- package/dist/fidelity/consistency.js +205 -0
- package/dist/fidelity/match.js +675 -0
- package/dist/fidelity/run.js +107 -0
- package/dist/find/keywords.js +97 -0
- package/dist/find/names.js +45 -0
- package/dist/find/route.js +59 -0
- package/dist/firstlook/quality.js +261 -0
- package/dist/firstlook/render.js +111 -0
- package/dist/firstlook/set.js +218 -0
- package/dist/flow/flow.js +455 -0
- package/dist/flow/look.js +139 -0
- package/dist/frame/behaviour.js +53 -0
- package/dist/frame/clock.js +117 -0
- package/dist/frame/contract.js +111 -0
- package/dist/frame/genre.js +65 -0
- package/dist/frame/idle.js +58 -0
- package/dist/frame/opening.js +171 -0
- package/dist/frames/loop.js +52 -0
- package/dist/frames/sheet.js +69 -0
- package/dist/gdd/book.js +483 -0
- package/dist/gdd/chapters.js +71 -0
- package/dist/gdd/design.js +135 -0
- package/dist/gdd/doc.js +32 -0
- package/dist/gdd/levelmap.js +428 -0
- package/dist/gdd/measures.js +477 -0
- package/dist/gdd/page.js +111 -0
- package/dist/gdd/rubric.js +250 -0
- package/dist/gdd/size.js +83 -0
- package/dist/gdd/tiers.js +148 -0
- package/dist/gdd/world.js +98 -0
- package/dist/gdd/worth.js +507 -0
- package/dist/gen/kinds.js +451 -0
- package/dist/gen/local/doctor.js +25 -0
- package/dist/gen/local/index.js +3 -0
- package/dist/gen/local/kokoro.js +334 -0
- package/dist/gen/local/master.js +248 -0
- package/dist/gen/local/provider.js +65 -0
- package/dist/gen/local/voice-rules.js +156 -0
- package/dist/gen/models.generated.js +469 -0
- package/dist/gen/models.js +53 -0
- package/dist/gen/prompt-lint.js +35 -0
- package/dist/gen/record.js +73 -0
- package/dist/gen/save.js +101 -0
- package/dist/gen/title.js +55 -0
- package/dist/gen/unity.js +334 -0
- package/dist/goals/goals.js +204 -0
- package/dist/goals/run.js +90 -0
- package/dist/greenlight/ambition.js +42 -0
- package/dist/greenlight/bible.js +138 -0
- package/dist/greenlight/lock.js +48 -0
- package/dist/greenlight/match.js +19 -0
- package/dist/greenlight/md.js +82 -0
- package/dist/greenlight/page.js +100 -0
- package/dist/greenlight/pitches.js +66 -0
- package/dist/greenlight/worth.js +90 -0
- package/dist/guidance.js +24 -0
- package/dist/init/bare.js +114 -0
- package/dist/init/git.js +56 -0
- package/dist/init/starter.js +166 -0
- package/dist/init/starters.js +179 -0
- package/dist/inspect/describe.js +125 -0
- package/dist/inspect/devserver.js +40 -0
- package/dist/journey/diff.js +74 -0
- package/dist/journey/from-round.js +44 -0
- package/dist/journey/record.js +76 -0
- package/dist/journey/run.js +139 -0
- package/dist/journey/script.js +223 -0
- package/dist/judge/common.js +60 -0
- package/dist/judge/identity.js +68 -0
- package/dist/judge/sources.js +37 -0
- package/dist/judge/structure.js +59 -0
- package/dist/keys/device.js +145 -0
- package/dist/keys/store.js +167 -0
- package/dist/lanes/fence.js +108 -0
- package/dist/lanes/gate.js +123 -0
- package/dist/lanes/lanes.js +355 -0
- package/dist/lanes/union.js +62 -0
- package/dist/lanes/where.js +49 -0
- package/dist/lessons/motifs.js +97 -0
- package/dist/lessons/store.js +56 -0
- package/dist/look/anim.js +206 -0
- package/dist/look/boxes.js +209 -0
- package/dist/look/dressing.js +24 -0
- package/dist/look/feedback.js +50 -0
- package/dist/look/fit.js +123 -0
- package/dist/look/held.js +92 -0
- package/dist/look/hook.js +169 -0
- package/dist/look/hud.js +189 -0
- package/dist/look/image-io.js +50 -0
- package/dist/look/life.js +96 -0
- package/dist/look/light.js +42 -0
- package/dist/look/look.js +85 -0
- package/dist/look/loops.js +108 -0
- package/dist/look/made-of.js +242 -0
- package/dist/look/moments.js +32 -0
- package/dist/look/motion.js +44 -0
- package/dist/look/phone-play.js +142 -0
- package/dist/look/player.js +32 -0
- package/dist/look/png.js +117 -0
- package/dist/look/readability.js +100 -0
- package/dist/look/roles.js +109 -0
- package/dist/look/sheet.js +104 -0
- package/dist/look/theme.js +278 -0
- package/dist/look/touch.js +129 -0
- package/dist/look/ui-style.js +102 -0
- package/dist/machine/procs.js +117 -0
- package/dist/managed.js +15 -0
- package/dist/mcp/hosted.js +174 -0
- package/dist/mcp/models.generated.js +538 -0
- package/dist/mcp/models.js +35 -0
- package/dist/mcp/server.js +330 -0
- package/dist/memory/decisions.js +138 -0
- package/dist/memory/journal.js +108 -0
- package/dist/model/bench.js +83 -0
- package/dist/model/blender.js +106 -0
- package/dist/model/clips.js +34 -0
- package/dist/model/finalize.js +33 -0
- package/dist/motion/checks.js +173 -0
- package/dist/motion/contract.js +177 -0
- package/dist/motion/encode.js +37 -0
- package/dist/motion/render.js +167 -0
- package/dist/motion/starter.js +54 -0
- package/dist/optimize/check.js +29 -0
- package/dist/optimize/helper.js +80 -0
- package/dist/owner/bar.js +285 -0
- package/dist/owner/match.js +105 -0
- package/dist/pack/build.js +97 -0
- package/dist/pack/deps.js +28 -0
- package/dist/pack/leaks.js +77 -0
- package/dist/pack/limits.js +51 -0
- package/dist/pack/report.js +35 -0
- package/dist/phone/baguette.js +139 -0
- package/dist/phone/listen.js +65 -0
- package/dist/pipeline/pipeline.js +929 -0
- package/dist/plan/actions.js +18 -0
- package/dist/plan/notes.js +15 -0
- package/dist/play/clock.js +40 -0
- package/dist/play/condition.js +45 -0
- package/dist/play/frames.js +60 -0
- package/dist/play/input.js +118 -0
- package/dist/play/pointer.js +21 -0
- package/dist/play/report.js +124 -0
- package/dist/play/server.js +274 -0
- package/dist/play/session.js +231 -0
- package/dist/play/steps.js +192 -0
- package/dist/playable/build.js +90 -0
- package/dist/playable/cta.js +88 -0
- package/dist/playable/networks.js +33 -0
- package/dist/playable/scan.js +46 -0
- package/dist/playtest/after-round.js +60 -0
- package/dist/playtest/assemble.js +168 -0
- package/dist/playtest/experience-run.js +69 -0
- package/dist/playtest/experience.js +77 -0
- package/dist/playtest/facts.js +90 -0
- package/dist/playtest/fidelity.js +179 -0
- package/dist/playtest/history.js +115 -0
- package/dist/playtest/hits.js +48 -0
- package/dist/playtest/hosted.js +98 -0
- package/dist/playtest/keep.js +110 -0
- package/dist/playtest/ledger.js +77 -0
- package/dist/playtest/length.js +113 -0
- package/dist/playtest/measure.js +181 -0
- package/dist/playtest/mobile-qa.js +391 -0
- package/dist/playtest/mockups.js +198 -0
- package/dist/playtest/moments.js +28 -0
- package/dist/playtest/prepare.js +162 -0
- package/dist/playtest/rank.js +184 -0
- package/dist/playtest/report.js +209 -0
- package/dist/playtest/route.js +139 -0
- package/dist/playtest/seats.js +128 -0
- package/dist/playtest/sheet.js +38 -0
- package/dist/playtest/stop.js +54 -0
- package/dist/playtest/stuck.js +47 -0
- package/dist/production/contract.js +61 -0
- package/dist/production/mirror.js +96 -0
- package/dist/production/tier.js +66 -0
- package/dist/profile/compare.js +171 -0
- package/dist/progress/answers.js +35 -0
- package/dist/progress/holds.js +106 -0
- package/dist/progress/notify.js +25 -0
- package/dist/progress/progress.js +300 -0
- package/dist/publish/build.js +54 -0
- package/dist/publish/folder.js +106 -0
- package/dist/publish/funpixel.js +96 -0
- package/dist/publish/hosts.js +48 -0
- package/dist/reach/envelope.js +111 -0
- package/dist/reach/load.js +84 -0
- package/dist/reach/side.js +320 -0
- package/dist/reach/spec3d.js +338 -0
- package/dist/reach/tiles.js +163 -0
- package/dist/reel/encode.js +34 -0
- package/dist/reel/tour.js +81 -0
- package/dist/relay/bots.js +62 -0
- package/dist/relay/bridge.js +54 -0
- package/dist/relay/local.js +82 -0
- package/dist/relay/redis.js +40 -0
- package/dist/review/audio.js +72 -0
- package/dist/review/ledger.js +60 -0
- package/dist/review/media.js +114 -0
- package/dist/review/model.js +348 -0
- package/dist/review/picture.js +113 -0
- package/dist/review/specs.js +134 -0
- package/dist/review/video.js +248 -0
- package/dist/schema/game.js +308 -0
- package/dist/score/comfort.js +79 -0
- package/dist/score/light.js +62 -0
- package/dist/score/measure.js +386 -0
- package/dist/score/vision.js +59 -0
- package/dist/serve/webgl.js +415 -0
- package/dist/setup/lsp.js +42 -0
- package/dist/sim/curve.js +122 -0
- package/dist/sim/judge.js +240 -0
- package/dist/sim/skeleton.js +65 -0
- package/dist/simulator/lease.js +159 -0
- package/dist/simulator/orient.js +57 -0
- package/dist/simulator/screen.js +113 -0
- package/dist/simulator/simctl.js +79 -0
- package/dist/smoke/art.js +20 -0
- package/dist/smoke/checks.js +165 -0
- package/dist/smoke/logic.js +73 -0
- package/dist/smoke/orphans.js +78 -0
- package/dist/smoke/palette.js +16 -0
- package/dist/smoke/sources.js +36 -0
- package/dist/sound/beats.js +95 -0
- package/dist/sound/loudness.js +94 -0
- package/dist/spec/extract.js +123 -0
- package/dist/spec/lint.js +261 -0
- package/dist/spec/presets.js +30 -0
- package/dist/spec/rooms.js +188 -0
- package/dist/spec/scaffold.js +457 -0
- package/dist/spec/sections.js +16 -0
- package/dist/spec/tunables.js +74 -0
- package/dist/stage/harnessignore.js +90 -0
- package/dist/stage/stage.js +57 -0
- package/dist/stage/tar.js +41 -0
- package/dist/status/board.js +172 -0
- package/dist/status/file.js +112 -0
- package/dist/status/inbox.js +55 -0
- package/dist/status/status.js +311 -0
- package/dist/store/answers.js +47 -0
- package/dist/store/doctor.js +120 -0
- package/dist/store/images.js +65 -0
- package/dist/store/init.js +101 -0
- package/dist/store/lint.js +392 -0
- package/dist/store/plan.js +133 -0
- package/dist/store/sdks.js +107 -0
- package/dist/studio/forks.js +93 -0
- package/dist/studio/pitch.js +294 -0
- package/dist/studio/widen.js +212 -0
- package/dist/suite/node-run.js +81 -0
- package/dist/suite/test-types.js +71 -0
- package/dist/trailer/assemble.js +90 -0
- package/dist/trailer/beats.js +74 -0
- package/dist/trailer/cards.js +77 -0
- package/dist/trailer/cues.js +78 -0
- package/dist/trailer/cut.js +49 -0
- package/dist/trailer/find.js +33 -0
- package/dist/trailer/mix.js +109 -0
- package/dist/trailer/placement.js +30 -0
- package/dist/types.js +1 -0
- package/dist/ui.js +79 -0
- package/dist/unity/bridge.js +251 -0
- package/dist/unity/disk.js +666 -0
- package/dist/unity/editor.js +471 -0
- package/dist/unity/gc.js +140 -0
- package/dist/unity/mcp-stdio.js +141 -0
- package/dist/unity/probe/budgets.js +84 -0
- package/dist/unity/probe/client.js +93 -0
- package/dist/unity/probe/install.js +118 -0
- package/dist/unity/probe/player.js +255 -0
- package/dist/unity/probe/report.js +102 -0
- package/dist/unity/probe/script.js +225 -0
- package/dist/unity/queue.js +353 -0
- package/dist/unity/run.js +172 -0
- package/dist/update.js +111 -0
- package/dist/variety/compare.js +104 -0
- package/dist/variety/places.js +109 -0
- package/dist/variety/profile.js +127 -0
- package/dist/vendor/verify/README.md +19 -0
- package/dist/vendor/verify/package.json +14 -0
- package/dist/vendor/verify/src/index.d.ts +105 -0
- package/dist/vendor/verify/src/index.js +78 -0
- package/dist/vendor/verify/src/init/preview_shim.js +63 -0
- package/dist/vendor/verify/src/page/actors.js +258 -0
- package/dist/vendor/verify/src/page/audio.js +106 -0
- package/dist/vendor/verify/src/page/audio_cues.js +141 -0
- package/dist/vendor/verify/src/page/audio_files.js +56 -0
- package/dist/vendor/verify/src/page/bot_sweep.js +72 -0
- package/dist/vendor/verify/src/page/capture_view.js +164 -0
- package/dist/vendor/verify/src/page/context_loss_listener.js +23 -0
- package/dist/vendor/verify/src/page/dressing.js +106 -0
- package/dist/vendor/verify/src/page/enter_view.js +33 -0
- package/dist/vendor/verify/src/page/feel.js +126 -0
- package/dist/vendor/verify/src/page/feel_sweep.js +75 -0
- package/dist/vendor/verify/src/page/first_paint.js +54 -0
- package/dist/vendor/verify/src/page/fonts.js +50 -0
- package/dist/vendor/verify/src/page/frame_honesty.js +44 -0
- package/dist/vendor/verify/src/page/front_door.js +197 -0
- package/dist/vendor/verify/src/page/grounding.js +448 -0
- package/dist/vendor/verify/src/page/hooks.js +74 -0
- package/dist/vendor/verify/src/page/hud.js +261 -0
- package/dist/vendor/verify/src/page/inventory.js +15 -0
- package/dist/vendor/verify/src/page/layout.js +378 -0
- package/dist/vendor/verify/src/page/levels.js +40 -0
- package/dist/vendor/verify/src/page/life.js +123 -0
- package/dist/vendor/verify/src/page/life_anim.js +501 -0
- package/dist/vendor/verify/src/page/made_of.js +83 -0
- package/dist/vendor/verify/src/page/mechanic_check.js +272 -0
- package/dist/vendor/verify/src/page/moments.js +36 -0
- package/dist/vendor/verify/src/page/motion.js +139 -0
- package/dist/vendor/verify/src/page/perf.js +255 -0
- package/dist/vendor/verify/src/page/phone_check.js +229 -0
- package/dist/vendor/verify/src/page/play.js +117 -0
- package/dist/vendor/verify/src/page/play_act.js +164 -0
- package/dist/vendor/verify/src/page/preview.js +33 -0
- package/dist/vendor/verify/src/page/recorder.js +54 -0
- package/dist/vendor/verify/src/page/render_health.js +83 -0
- package/dist/vendor/verify/src/page/renderer.js +75 -0
- package/dist/vendor/verify/src/page/scene.js +222 -0
- package/dist/vendor/verify/src/page/self_test.js +25 -0
- package/dist/vendor/verify/src/page/step_clock.js +247 -0
- package/dist/vendor/verify/src/page/surfaces.js +261 -0
- package/dist/vendor/verify/src/page/world_actors.js +264 -0
- package/dist/verify/browser.js +245 -0
- package/dist/verify/console.js +34 -0
- package/dist/verify/fingerprint.js +72 -0
- package/dist/verify/gpu.js +33 -0
- package/dist/verify/health.js +172 -0
- package/dist/verify/hooks.js +34 -0
- package/dist/verify/judge.js +303 -0
- package/dist/verify/players.js +123 -0
- package/dist/verify/probe.js +236 -0
- package/dist/verify/reads.js +32 -0
- package/dist/verify/run.js +56 -0
- package/dist/verify/serve.js +36 -0
- package/dist/walk/film.js +37 -0
- package/dist/walk/judge.js +287 -0
- package/dist/walk/routes.js +199 -0
- package/dist/walk/world.js +292 -0
- package/dist/world/brief.js +86 -0
- package/dist/world/check.js +254 -0
- package/dist/world/forge.js +542 -0
- package/dist/world/format.js +40 -0
- package/dist/world/variety.js +59 -0
- package/dist/wow/catalogue.js +86 -0
- package/dist/wow/picks.js +74 -0
- package/package.json +51 -4
- package/panel/asset-identity.md +61 -0
- package/panel/asset-structure.md +55 -0
- package/panel/blockers.md +47 -0
- package/panel/brief.md +89 -0
- package/panel/clip.md +54 -0
- package/panel/experience-personas.json +4 -0
- package/panel/experience.md +96 -0
- package/panel/fidelity-ui.md +74 -0
- package/panel/fidelity.md +83 -0
- package/panel/greenlight-pitch.md +69 -0
- package/panel/greenlight.md +87 -0
- package/panel/mobile-qa.md +128 -0
- package/panel/personas.json +6 -0
- package/panel/reference-match.md +12 -0
- package/panel/versus.md +31 -0
- package/plugins/.agents/plugins/marketplace.json +18 -0
- package/plugins/.claude-plugin/marketplace.json +17 -0
- package/plugins/.cursor-plugin/marketplace.json +13 -0
- package/plugins/LICENSE +115 -0
- package/plugins/README.md +16 -0
- package/plugins/THIRD_PARTY_NOTICES.md +75 -0
- package/plugins/claude/.claude-plugin/plugin.json +19 -0
- package/plugins/claude/.mcp.json +10 -0
- package/plugins/claude/LICENSE +115 -0
- package/plugins/claude/README.md +14 -0
- package/plugins/claude/THIRD_PARTY_NOTICES.md +75 -0
- package/plugins/claude/agents/art-director.md +54 -0
- package/plugins/claude/agents/audio-director.md +51 -0
- package/plugins/claude/agents/critic.md +113 -0
- package/plugins/claude/agents/lane.md +38 -0
- package/plugins/claude/agents/level-designer.md +45 -0
- package/plugins/claude/agents/mobile-qa.md +71 -0
- package/plugins/claude/agents/player.md +144 -0
- package/plugins/claude/agents/qa-lead.md +52 -0
- package/plugins/claude/commands/first-look.md +59 -0
- package/plugins/claude/commands/flow.md +50 -0
- package/plugins/claude/commands/lanes.md +38 -0
- package/plugins/claude/commands/mobile-qa.md +28 -0
- package/plugins/claude/commands/new.md +94 -0
- package/plugins/claude/commands/playtest.md +66 -0
- package/plugins/claude/commands/publish.md +23 -0
- package/plugins/claude/commands/smoke-build.md +25 -0
- package/plugins/claude/commands/verify.md +20 -0
- package/plugins/claude/hooks/brief.md +135 -0
- package/plugins/claude/hooks/critic-receipts.mjs +86 -0
- package/plugins/claude/hooks/durable.mjs +56 -0
- package/plugins/claude/hooks/fence.mjs +30 -0
- package/plugins/claude/hooks/floors.mjs +181 -0
- package/plugins/claude/hooks/flow.mjs +154 -0
- package/plugins/claude/hooks/front-door.mjs +68 -0
- package/plugins/claude/hooks/guidance.json +3 -0
- package/plugins/claude/hooks/hints.mjs +183 -0
- package/plugins/claude/hooks/hooks.json +62 -0
- package/plugins/claude/hooks/lib.mjs +362 -0
- package/plugins/claude/hooks/memory.mjs +92 -0
- package/plugins/claude/hooks/mobile-qa.mjs +43 -0
- package/plugins/claude/hooks/note.mjs +63 -0
- package/plugins/claude/hooks/nudge.mjs +98 -0
- package/plugins/claude/hooks/pipeline.mjs +207 -0
- package/plugins/claude/hooks/prompt.mjs +51 -0
- package/plugins/claude/hooks/quality.mjs +310 -0
- package/plugins/claude/hooks/reach.mjs +93 -0
- package/plugins/claude/hooks/scope.mjs +44 -0
- package/plugins/claude/hooks/session-log.mjs +101 -0
- package/plugins/claude/hooks/session-start.mjs +194 -0
- package/plugins/claude/hooks/skill-names.json +19 -0
- package/plugins/claude/hooks/stop-gate.mjs +303 -0
- package/plugins/claude/hooks/vendor/direct/round.mjs +81 -0
- package/plugins/claude/hooks/vendor/find/names.mjs +46 -0
- package/plugins/claude/hooks/vendor/firstlook/set.mjs +219 -0
- package/plugins/claude/hooks/vendor/flow/flow.mjs +456 -0
- package/plugins/claude/hooks/vendor/flow/look.mjs +140 -0
- package/plugins/claude/hooks/vendor/gdd/book.mjs +484 -0
- package/plugins/claude/hooks/vendor/gdd/chapters.mjs +72 -0
- package/plugins/claude/hooks/vendor/gdd/doc.mjs +33 -0
- package/plugins/claude/hooks/vendor/gdd/levelmap.mjs +429 -0
- package/plugins/claude/hooks/vendor/gdd/rubric.mjs +251 -0
- package/plugins/claude/hooks/vendor/gdd/worth.mjs +508 -0
- package/plugins/claude/hooks/vendor/lanes/fence.mjs +109 -0
- package/plugins/claude/hooks/vendor/lanes/lanes.mjs +356 -0
- package/plugins/claude/hooks/vendor/lanes/union.mjs +63 -0
- package/plugins/claude/hooks/vendor/lessons/motifs.mjs +98 -0
- package/plugins/claude/hooks/vendor/lessons/store.mjs +57 -0
- package/plugins/claude/hooks/vendor/look/made-of.mjs +243 -0
- package/plugins/claude/hooks/vendor/look/roles.mjs +110 -0
- package/plugins/claude/hooks/vendor/memory/decisions.mjs +139 -0
- package/plugins/claude/hooks/vendor/memory/journal.mjs +109 -0
- package/plugins/claude/hooks/vendor/owner/bar.mjs +286 -0
- package/plugins/claude/hooks/vendor/pipeline/pipeline.mjs +930 -0
- package/plugins/claude/hooks/vendor/playtest/keep.mjs +111 -0
- package/plugins/claude/hooks/vendor/playtest/stuck.mjs +48 -0
- package/plugins/claude/hooks/vendor/progress/holds.mjs +107 -0
- package/plugins/claude/hooks/vendor/progress/progress.mjs +301 -0
- package/plugins/claude/hooks/vendor/sim/judge.mjs +241 -0
- package/plugins/claude/hooks/vendor/spec/rooms.mjs +189 -0
- package/plugins/claude/hooks/vendor/spec/tunables.mjs +75 -0
- package/plugins/claude/hooks/vendor/stage/harnessignore.mjs +91 -0
- package/plugins/claude/hooks/vendor/stage/stage.mjs +58 -0
- package/plugins/claude/hooks/vendor/status/board.mjs +173 -0
- package/plugins/claude/hooks/vendor/status/file.mjs +113 -0
- package/plugins/claude/hooks/vendor/studio/forks.mjs +94 -0
- package/plugins/claude/hooks/vendor/studio/pitch.mjs +295 -0
- package/plugins/claude/hooks/vendor/verify/fingerprint.mjs +73 -0
- package/plugins/claude/hooks/vendor/verify/reads.mjs +33 -0
- package/plugins/claude/hooks/vendor/wow/picks.mjs +75 -0
- package/plugins/claude/skills/3d/SKILL.md +89 -0
- package/plugins/claude/skills/3d/references/bake-off.md +48 -0
- package/plugins/claude/skills/3d/references/bench.md +103 -0
- package/plugins/claude/skills/3d/references/budgets.md +48 -0
- package/plugins/claude/skills/3d/references/characters.md +67 -0
- package/plugins/claude/skills/3d/references/concept-image.md +47 -0
- package/plugins/claude/skills/3d/references/engine-targets.md +31 -0
- package/plugins/claude/skills/3d/references/hero-route.md +104 -0
- package/plugins/claude/skills/3d/references/level-spec.md +109 -0
- package/plugins/claude/skills/3d/references/levels.md +84 -0
- package/plugins/claude/skills/3d/references/light-and-places.md +141 -0
- package/plugins/claude/skills/3d/references/models.md +111 -0
- package/plugins/claude/skills/3d/references/painted-target.md +184 -0
- package/plugins/claude/skills/3d/references/reading.md +41 -0
- package/plugins/claude/skills/3d/references/skin.md +85 -0
- package/plugins/claude/skills/3d/references/skyboxes.md +65 -0
- package/plugins/claude/skills/3d/references/textures.md +71 -0
- package/plugins/claude/skills/3d/references/three-loading.md +199 -0
- package/plugins/claude/skills/3d/references/unity.md +78 -0
- package/plugins/claude/skills/art/SKILL.md +104 -0
- package/plugins/claude/skills/art/references/2d-assets.md +108 -0
- package/plugins/claude/skills/art/references/animation.md +126 -0
- package/plugins/claude/skills/art/references/cast.md +73 -0
- package/plugins/claude/skills/art/references/characters.md +49 -0
- package/plugins/claude/skills/art/references/cost.md +107 -0
- package/plugins/claude/skills/art/references/effects.md +85 -0
- package/plugins/claude/skills/art/references/frames.md +87 -0
- package/plugins/claude/skills/art/references/judging-frames.md +64 -0
- package/plugins/claude/skills/art/references/look.md +102 -0
- package/plugins/claude/skills/art/references/measure.md +119 -0
- package/plugins/claude/skills/art/references/pipeline.md +185 -0
- package/plugins/claude/skills/art/references/pixi.md +277 -0
- package/plugins/claude/skills/art/references/planes.md +27 -0
- package/plugins/claude/skills/art/references/prompts.md +171 -0
- package/plugins/claude/skills/art/references/sheets.md +141 -0
- package/plugins/claude/skills/art/references/style-file.md +39 -0
- package/plugins/claude/skills/art/references/three.md +232 -0
- package/plugins/claude/skills/art/references/ui.md +163 -0
- package/plugins/claude/skills/art/references/unity.md +78 -0
- package/plugins/claude/skills/art/references/wiring.md +41 -0
- package/plugins/claude/skills/audio/SKILL.md +92 -0
- package/plugins/claude/skills/audio/references/adaptive-music.md +204 -0
- package/plugins/claude/skills/audio/references/engine.md +78 -0
- package/plugins/claude/skills/audio/references/measure.md +101 -0
- package/plugins/claude/skills/audio/references/unity.md +74 -0
- package/plugins/claude/skills/feedback/SKILL.md +120 -0
- package/plugins/claude/skills/feedback/references/memory.md +99 -0
- package/plugins/claude/skills/game-feel/SKILL.md +104 -0
- package/plugins/claude/skills/game-feel/references/contact.md +110 -0
- package/plugins/claude/skills/game-feel/references/measure.md +125 -0
- package/plugins/claude/skills/game-feel/references/motion.md +134 -0
- package/plugins/claude/skills/game-feel/references/payoffs.md +35 -0
- package/plugins/claude/skills/game-feel/references/recipes.md +107 -0
- package/plugins/claude/skills/game-feel/references/unity.md +73 -0
- package/plugins/claude/skills/game-logic/SKILL.md +113 -0
- package/plugins/claude/skills/game-logic/references/balance.md +88 -0
- package/plugins/claude/skills/game-logic/references/content-at-scale.md +147 -0
- package/plugins/claude/skills/game-logic/references/depth.md +89 -0
- package/plugins/claude/skills/game-logic/references/escalation.md +41 -0
- package/plugins/claude/skills/game-logic/references/levels.md +61 -0
- package/plugins/claude/skills/game-logic/references/probes.md +122 -0
- package/plugins/claude/skills/game-logic/references/unity.md +108 -0
- package/plugins/claude/skills/game-spine/SKILL.md +118 -0
- package/plugins/claude/skills/game-spine/references/camera.md +94 -0
- package/plugins/claude/skills/game-spine/references/multiplayer.md +101 -0
- package/plugins/claude/skills/game-spine/references/patterns.md +103 -0
- package/plugins/claude/skills/game-spine/references/performance.md +96 -0
- package/plugins/claude/skills/game-spine/references/pixi.md +26 -0
- package/plugins/claude/skills/game-spine/references/replay.md +102 -0
- package/plugins/claude/skills/game-spine/references/room-api.md +63 -0
- package/plugins/claude/skills/game-spine/references/room-modes.md +40 -0
- package/plugins/claude/skills/game-spine/references/sdk.md +114 -0
- package/plugins/claude/skills/game-spine/references/three.md +62 -0
- package/plugins/claude/skills/gdd/SKILL.md +116 -0
- package/plugins/claude/skills/gdd/references/as-built.md +40 -0
- package/plugins/claude/skills/gdd/references/design-measures.md +24 -0
- package/plugins/claude/skills/gdd/references/design-note.md +88 -0
- package/plugins/claude/skills/gdd/references/experience.md +92 -0
- package/plugins/claude/skills/gdd/references/first-look.md +226 -0
- package/plugins/claude/skills/gdd/references/floors.md +62 -0
- package/plugins/claude/skills/gdd/references/frame.md +75 -0
- package/plugins/claude/skills/gdd/references/gameplay-contract.md +81 -0
- package/plugins/claude/skills/gdd/references/gdd-template.md +417 -0
- package/plugins/claude/skills/gdd/references/genre-card.md +109 -0
- package/plugins/claude/skills/gdd/references/genre-platformer.md +159 -0
- package/plugins/claude/skills/gdd/references/genre-puzzle.md +145 -0
- package/plugins/claude/skills/gdd/references/genre-racing.md +137 -0
- package/plugins/claude/skills/gdd/references/genre-rpg.md +125 -0
- package/plugins/claude/skills/gdd/references/genre-shooter.md +128 -0
- package/plugins/claude/skills/gdd/references/genre-simulation.md +112 -0
- package/plugins/claude/skills/gdd/references/genre-strategy.md +116 -0
- package/plugins/claude/skills/gdd/references/genre-survival.md +122 -0
- package/plugins/claude/skills/gdd/references/in-the-loop.md +106 -0
- package/plugins/claude/skills/gdd/references/invent-first.md +131 -0
- package/plugins/claude/skills/gdd/references/level-and-fun.md +112 -0
- package/plugins/claude/skills/gdd/references/pages.md +47 -0
- package/plugins/claude/skills/gdd/references/plan-at-size.md +140 -0
- package/plugins/claude/skills/gdd/references/production-tiers.md +117 -0
- package/plugins/claude/skills/gdd/references/sections.md +148 -0
- package/plugins/claude/skills/gdd/references/spec-folder.md +131 -0
- package/plugins/claude/skills/gdd/references/start.md +110 -0
- package/plugins/claude/skills/gdd/references/starters.md +175 -0
- package/plugins/claude/skills/gdd/references/the-path.md +133 -0
- package/plugins/claude/skills/gdd/references/track.md +29 -0
- package/plugins/claude/skills/gdd/references/world-and-identity.md +165 -0
- package/plugins/claude/skills/gdd/references/worth.md +74 -0
- package/plugins/claude/skills/mobile-ui/SKILL.md +107 -0
- package/plugins/claude/skills/mobile-ui/references/contrast.md +123 -0
- package/plugins/claude/skills/mobile-ui/references/hud-and-title.md +108 -0
- package/plugins/claude/skills/mobile-ui/references/hud-genres.md +124 -0
- package/plugins/claude/skills/mobile-ui/references/phone-check.md +156 -0
- package/plugins/claude/skills/mobile-ui/references/recipes.md +279 -0
- package/plugins/claude/skills/mobile-ui/references/restyle-ui.md +229 -0
- package/plugins/claude/skills/mobile-ui/references/unity.md +61 -0
- package/plugins/claude/skills/publishing/SKILL.md +109 -0
- package/plugins/claude/skills/publishing/references/compose.md +113 -0
- package/plugins/claude/skills/publishing/references/motion.md +120 -0
- package/plugins/claude/skills/publishing/references/networks.md +75 -0
- package/plugins/claude/skills/publishing/references/other-hosts.md +65 -0
- package/plugins/claude/skills/publishing/references/playable-ad.md +90 -0
- package/plugins/claude/skills/publishing/references/server-build.md +85 -0
- package/plugins/claude/skills/publishing/references/store-shots.md +85 -0
- package/plugins/claude/skills/publishing/references/trailer.md +55 -0
- package/plugins/claude/skills/publishing/references/what-ships.md +30 -0
- package/plugins/claude/skills/store/SKILL.md +81 -0
- package/plugins/claude/skills/store/references/app-store.md +73 -0
- package/plugins/claude/skills/store/references/google-play.md +141 -0
- package/plugins/claude/skills/store/references/ios-release.md +63 -0
- package/plugins/claude/skills/store/references/money.md +66 -0
- package/plugins/claude/skills/store/references/purchases-and-review.md +74 -0
- package/plugins/claude/skills/store/references/readiness-page.md +24 -0
- package/plugins/claude/skills/store/references/readiness.md +107 -0
- package/plugins/claude/skills/store/references/steam.md +38 -0
- package/plugins/claude/skills/store/references/unity-store.md +55 -0
- package/plugins/claude/skills/store/references/web-portals.md +43 -0
- package/plugins/claude/skills/unity-game/SKILL.md +103 -0
- package/plugins/claude/skills/unity-game/references/agent-ops.md +54 -0
- package/plugins/claude/skills/unity-game/references/fixes.md +40 -0
- package/plugins/claude/skills/unity-game/references/from-a-web-game.md +108 -0
- package/plugins/claude/skills/unity-game/references/handing-off.md +42 -0
- package/plugins/claude/skills/unity-game/references/performance.md +59 -0
- package/plugins/claude/skills/unity-game/references/probe.md +80 -0
- package/plugins/claude/skills/unity-game/references/shared-mac.md +121 -0
- package/plugins/claude/skills/unity-game/references/traps.md +108 -0
- package/plugins/claude/skills/verifying/SKILL.md +109 -0
- package/plugins/claude/skills/verifying/references/actors.md +94 -0
- package/plugins/claude/skills/verifying/references/bar.md +62 -0
- package/plugins/claude/skills/verifying/references/checks.md +69 -0
- package/plugins/claude/skills/verifying/references/experience.md +67 -0
- package/plugins/claude/skills/verifying/references/eyes.md +54 -0
- package/plugins/claude/skills/verifying/references/fidelity.md +126 -0
- package/plugins/claude/skills/verifying/references/hit-bar.md +31 -0
- package/plugins/claude/skills/verifying/references/journeys.md +77 -0
- package/plugins/claude/skills/verifying/references/mobile-qa.md +123 -0
- package/plugins/claude/skills/verifying/references/playtest.md +161 -0
- package/plugins/claude/skills/verifying/references/review.md +105 -0
- package/plugins/claude/skills/verifying/references/rubric.md +67 -0
- package/plugins/claude/skills/verifying/references/scenes.md +49 -0
- package/plugins/claude/skills/verifying/references/unity.md +60 -0
- package/plugins/claude/skills/world-and-story/SKILL.md +99 -0
- package/plugins/claude/skills/world-and-story/references/atmosphere.md +208 -0
- package/plugins/claude/skills/world-and-story/references/forged-world.md +79 -0
- package/plugins/claude/skills/world-and-story/references/living-world.md +237 -0
- package/plugins/claude/skills/world-and-story/references/opening-and-chapters.md +215 -0
- package/plugins/claude/skills/world-and-story/references/shelf.md +80 -0
- package/plugins/claude/skills/world-and-story/references/story-at-size.md +159 -0
- package/plugins/claude/skills/world-and-story/references/voice.md +175 -0
- package/plugins/claude/skills/world-and-story/references/world-kit.md +154 -0
- package/plugins/codex/.codex-plugin/plugin.json +27 -0
- package/plugins/codex/.mcp.json +7 -0
- package/plugins/codex/AGENTS.md +135 -0
- package/plugins/codex/LICENSE +115 -0
- package/plugins/codex/README.md +17 -0
- package/plugins/codex/THIRD_PARTY_NOTICES.md +75 -0
- package/plugins/codex/hooks/brief.md +135 -0
- package/plugins/codex/hooks/codex-critic.mjs +15 -0
- package/plugins/codex/hooks/critic-receipts.mjs +86 -0
- package/plugins/codex/hooks/durable.mjs +56 -0
- package/plugins/codex/hooks/fence.mjs +30 -0
- package/plugins/codex/hooks/floors.mjs +181 -0
- package/plugins/codex/hooks/flow.mjs +154 -0
- package/plugins/codex/hooks/front-door.mjs +68 -0
- package/plugins/codex/hooks/guidance.json +3 -0
- package/plugins/codex/hooks/hints.mjs +183 -0
- package/plugins/codex/hooks/hooks.json +59 -0
- package/plugins/codex/hooks/host.md +54 -0
- package/plugins/codex/hooks/lib.mjs +362 -0
- package/plugins/codex/hooks/memory.mjs +92 -0
- package/plugins/codex/hooks/mobile-qa.mjs +43 -0
- package/plugins/codex/hooks/note.mjs +63 -0
- package/plugins/codex/hooks/nudge.mjs +98 -0
- package/plugins/codex/hooks/pipeline.mjs +207 -0
- package/plugins/codex/hooks/prompt.mjs +51 -0
- package/plugins/codex/hooks/quality.mjs +310 -0
- package/plugins/codex/hooks/reach.mjs +93 -0
- package/plugins/codex/hooks/scope.mjs +44 -0
- package/plugins/codex/hooks/session-log.mjs +101 -0
- package/plugins/codex/hooks/session-start.mjs +194 -0
- package/plugins/codex/hooks/stop-gate.mjs +303 -0
- package/plugins/codex/hooks/vendor/direct/round.mjs +81 -0
- package/plugins/codex/hooks/vendor/find/names.mjs +46 -0
- package/plugins/codex/hooks/vendor/firstlook/set.mjs +219 -0
- package/plugins/codex/hooks/vendor/flow/flow.mjs +456 -0
- package/plugins/codex/hooks/vendor/flow/look.mjs +140 -0
- package/plugins/codex/hooks/vendor/gdd/book.mjs +484 -0
- package/plugins/codex/hooks/vendor/gdd/chapters.mjs +72 -0
- package/plugins/codex/hooks/vendor/gdd/doc.mjs +33 -0
- package/plugins/codex/hooks/vendor/gdd/levelmap.mjs +429 -0
- package/plugins/codex/hooks/vendor/gdd/rubric.mjs +251 -0
- package/plugins/codex/hooks/vendor/gdd/worth.mjs +508 -0
- package/plugins/codex/hooks/vendor/lanes/fence.mjs +109 -0
- package/plugins/codex/hooks/vendor/lanes/lanes.mjs +356 -0
- package/plugins/codex/hooks/vendor/lanes/union.mjs +63 -0
- package/plugins/codex/hooks/vendor/lessons/motifs.mjs +98 -0
- package/plugins/codex/hooks/vendor/lessons/store.mjs +57 -0
- package/plugins/codex/hooks/vendor/look/made-of.mjs +243 -0
- package/plugins/codex/hooks/vendor/look/roles.mjs +110 -0
- package/plugins/codex/hooks/vendor/memory/decisions.mjs +139 -0
- package/plugins/codex/hooks/vendor/memory/journal.mjs +109 -0
- package/plugins/codex/hooks/vendor/owner/bar.mjs +286 -0
- package/plugins/codex/hooks/vendor/pipeline/pipeline.mjs +930 -0
- package/plugins/codex/hooks/vendor/playtest/keep.mjs +111 -0
- package/plugins/codex/hooks/vendor/playtest/stuck.mjs +48 -0
- package/plugins/codex/hooks/vendor/progress/holds.mjs +107 -0
- package/plugins/codex/hooks/vendor/progress/progress.mjs +301 -0
- package/plugins/codex/hooks/vendor/sim/judge.mjs +241 -0
- package/plugins/codex/hooks/vendor/spec/rooms.mjs +189 -0
- package/plugins/codex/hooks/vendor/spec/tunables.mjs +75 -0
- package/plugins/codex/hooks/vendor/stage/harnessignore.mjs +91 -0
- package/plugins/codex/hooks/vendor/stage/stage.mjs +58 -0
- package/plugins/codex/hooks/vendor/status/board.mjs +173 -0
- package/plugins/codex/hooks/vendor/status/file.mjs +113 -0
- package/plugins/codex/hooks/vendor/studio/forks.mjs +94 -0
- package/plugins/codex/hooks/vendor/studio/pitch.mjs +295 -0
- package/plugins/codex/hooks/vendor/verify/fingerprint.mjs +73 -0
- package/plugins/codex/hooks/vendor/verify/reads.mjs +33 -0
- package/plugins/codex/hooks/vendor/wow/picks.mjs +75 -0
- package/plugins/codex/mcp.json +9 -0
- package/plugins/codex/plugin.json +26 -0
- package/plugins/codex/skills/fp-art-director/SKILL.md +58 -0
- package/plugins/codex/skills/fp-art-director/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-art-director/references/codex.md +54 -0
- package/plugins/codex/skills/fp-audio-director/SKILL.md +55 -0
- package/plugins/codex/skills/fp-audio-director/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-audio-director/references/codex.md +54 -0
- package/plugins/codex/skills/fp-critic/SKILL.md +117 -0
- package/plugins/codex/skills/fp-critic/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-critic/references/codex.md +54 -0
- package/plugins/codex/skills/fp-first-look/SKILL.md +59 -0
- package/plugins/codex/skills/fp-first-look/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-flow/SKILL.md +50 -0
- package/plugins/codex/skills/fp-flow/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-lane/SKILL.md +41 -0
- package/plugins/codex/skills/fp-lane/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-lane/references/codex.md +54 -0
- package/plugins/codex/skills/fp-lanes/SKILL.md +38 -0
- package/plugins/codex/skills/fp-lanes/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-level-designer/SKILL.md +49 -0
- package/plugins/codex/skills/fp-level-designer/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-level-designer/references/codex.md +54 -0
- package/plugins/codex/skills/fp-mobile-qa/SKILL.md +28 -0
- package/plugins/codex/skills/fp-mobile-qa/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-mobile-qa-seat/SKILL.md +74 -0
- package/plugins/codex/skills/fp-mobile-qa-seat/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-mobile-qa-seat/references/codex.md +54 -0
- package/plugins/codex/skills/fp-new/SKILL.md +94 -0
- package/plugins/codex/skills/fp-new/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-player/SKILL.md +147 -0
- package/plugins/codex/skills/fp-player/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-player/references/codex.md +54 -0
- package/plugins/codex/skills/fp-playtest/SKILL.md +66 -0
- package/plugins/codex/skills/fp-playtest/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-publish/SKILL.md +23 -0
- package/plugins/codex/skills/fp-publish/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-qa-lead/SKILL.md +56 -0
- package/plugins/codex/skills/fp-qa-lead/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-qa-lead/references/codex.md +54 -0
- package/plugins/codex/skills/fp-smoke-build/SKILL.md +25 -0
- package/plugins/codex/skills/fp-smoke-build/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-studio/SKILL.md +59 -0
- package/plugins/codex/skills/fp-studio/agents/openai.yaml +12 -0
- package/plugins/codex/skills/fp-verify/SKILL.md +20 -0
- package/plugins/codex/skills/fp-verify/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-3d/SKILL.md +89 -0
- package/plugins/codex/skills/funpixel-3d/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-3d/references/bake-off.md +48 -0
- package/plugins/codex/skills/funpixel-3d/references/bench.md +103 -0
- package/plugins/codex/skills/funpixel-3d/references/budgets.md +48 -0
- package/plugins/codex/skills/funpixel-3d/references/characters.md +67 -0
- package/plugins/codex/skills/funpixel-3d/references/concept-image.md +47 -0
- package/plugins/codex/skills/funpixel-3d/references/engine-targets.md +31 -0
- package/plugins/codex/skills/funpixel-3d/references/hero-route.md +104 -0
- package/plugins/codex/skills/funpixel-3d/references/level-spec.md +109 -0
- package/plugins/codex/skills/funpixel-3d/references/levels.md +84 -0
- package/plugins/codex/skills/funpixel-3d/references/light-and-places.md +141 -0
- package/plugins/codex/skills/funpixel-3d/references/models.md +111 -0
- package/plugins/codex/skills/funpixel-3d/references/painted-target.md +184 -0
- package/plugins/codex/skills/funpixel-3d/references/reading.md +41 -0
- package/plugins/codex/skills/funpixel-3d/references/skin.md +85 -0
- package/plugins/codex/skills/funpixel-3d/references/skyboxes.md +65 -0
- package/plugins/codex/skills/funpixel-3d/references/textures.md +71 -0
- package/plugins/codex/skills/funpixel-3d/references/three-loading.md +199 -0
- package/plugins/codex/skills/funpixel-3d/references/unity.md +78 -0
- package/plugins/codex/skills/funpixel-art/SKILL.md +104 -0
- package/plugins/codex/skills/funpixel-art/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-art/references/2d-assets.md +108 -0
- package/plugins/codex/skills/funpixel-art/references/animation.md +126 -0
- package/plugins/codex/skills/funpixel-art/references/cast.md +73 -0
- package/plugins/codex/skills/funpixel-art/references/characters.md +49 -0
- package/plugins/codex/skills/funpixel-art/references/cost.md +107 -0
- package/plugins/codex/skills/funpixel-art/references/effects.md +85 -0
- package/plugins/codex/skills/funpixel-art/references/frames.md +87 -0
- package/plugins/codex/skills/funpixel-art/references/judging-frames.md +64 -0
- package/plugins/codex/skills/funpixel-art/references/look.md +102 -0
- package/plugins/codex/skills/funpixel-art/references/measure.md +119 -0
- package/plugins/codex/skills/funpixel-art/references/pipeline.md +185 -0
- package/plugins/codex/skills/funpixel-art/references/pixi.md +277 -0
- package/plugins/codex/skills/funpixel-art/references/planes.md +27 -0
- package/plugins/codex/skills/funpixel-art/references/prompts.md +171 -0
- package/plugins/codex/skills/funpixel-art/references/sheets.md +141 -0
- package/plugins/codex/skills/funpixel-art/references/style-file.md +39 -0
- package/plugins/codex/skills/funpixel-art/references/three.md +232 -0
- package/plugins/codex/skills/funpixel-art/references/ui.md +163 -0
- package/plugins/codex/skills/funpixel-art/references/unity.md +78 -0
- package/plugins/codex/skills/funpixel-art/references/wiring.md +41 -0
- package/plugins/codex/skills/funpixel-audio/SKILL.md +92 -0
- package/plugins/codex/skills/funpixel-audio/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-audio/references/adaptive-music.md +204 -0
- package/plugins/codex/skills/funpixel-audio/references/engine.md +78 -0
- package/plugins/codex/skills/funpixel-audio/references/measure.md +101 -0
- package/plugins/codex/skills/funpixel-audio/references/unity.md +74 -0
- package/plugins/codex/skills/funpixel-feedback/SKILL.md +120 -0
- package/plugins/codex/skills/funpixel-feedback/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-feedback/references/memory.md +99 -0
- package/plugins/codex/skills/funpixel-game-feel/SKILL.md +104 -0
- package/plugins/codex/skills/funpixel-game-feel/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-game-feel/references/contact.md +110 -0
- package/plugins/codex/skills/funpixel-game-feel/references/measure.md +125 -0
- package/plugins/codex/skills/funpixel-game-feel/references/motion.md +134 -0
- package/plugins/codex/skills/funpixel-game-feel/references/payoffs.md +35 -0
- package/plugins/codex/skills/funpixel-game-feel/references/recipes.md +107 -0
- package/plugins/codex/skills/funpixel-game-feel/references/unity.md +73 -0
- package/plugins/codex/skills/funpixel-game-logic/SKILL.md +113 -0
- package/plugins/codex/skills/funpixel-game-logic/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-game-logic/references/balance.md +88 -0
- package/plugins/codex/skills/funpixel-game-logic/references/content-at-scale.md +147 -0
- package/plugins/codex/skills/funpixel-game-logic/references/depth.md +89 -0
- package/plugins/codex/skills/funpixel-game-logic/references/escalation.md +41 -0
- package/plugins/codex/skills/funpixel-game-logic/references/levels.md +61 -0
- package/plugins/codex/skills/funpixel-game-logic/references/probes.md +122 -0
- package/plugins/codex/skills/funpixel-game-logic/references/unity.md +108 -0
- package/plugins/codex/skills/funpixel-game-spine/SKILL.md +118 -0
- package/plugins/codex/skills/funpixel-game-spine/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-game-spine/references/camera.md +94 -0
- package/plugins/codex/skills/funpixel-game-spine/references/multiplayer.md +101 -0
- package/plugins/codex/skills/funpixel-game-spine/references/patterns.md +103 -0
- package/plugins/codex/skills/funpixel-game-spine/references/performance.md +96 -0
- package/plugins/codex/skills/funpixel-game-spine/references/pixi.md +26 -0
- package/plugins/codex/skills/funpixel-game-spine/references/replay.md +102 -0
- package/plugins/codex/skills/funpixel-game-spine/references/room-api.md +63 -0
- package/plugins/codex/skills/funpixel-game-spine/references/room-modes.md +40 -0
- package/plugins/codex/skills/funpixel-game-spine/references/sdk.md +114 -0
- package/plugins/codex/skills/funpixel-game-spine/references/three.md +62 -0
- package/plugins/codex/skills/funpixel-gdd/SKILL.md +116 -0
- package/plugins/codex/skills/funpixel-gdd/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-gdd/references/as-built.md +40 -0
- package/plugins/codex/skills/funpixel-gdd/references/design-measures.md +24 -0
- package/plugins/codex/skills/funpixel-gdd/references/design-note.md +88 -0
- package/plugins/codex/skills/funpixel-gdd/references/experience.md +92 -0
- package/plugins/codex/skills/funpixel-gdd/references/first-look.md +226 -0
- package/plugins/codex/skills/funpixel-gdd/references/floors.md +62 -0
- package/plugins/codex/skills/funpixel-gdd/references/frame.md +75 -0
- package/plugins/codex/skills/funpixel-gdd/references/gameplay-contract.md +81 -0
- package/plugins/codex/skills/funpixel-gdd/references/gdd-template.md +417 -0
- package/plugins/codex/skills/funpixel-gdd/references/genre-card.md +109 -0
- package/plugins/codex/skills/funpixel-gdd/references/genre-platformer.md +159 -0
- package/plugins/codex/skills/funpixel-gdd/references/genre-puzzle.md +145 -0
- package/plugins/codex/skills/funpixel-gdd/references/genre-racing.md +137 -0
- package/plugins/codex/skills/funpixel-gdd/references/genre-rpg.md +125 -0
- package/plugins/codex/skills/funpixel-gdd/references/genre-shooter.md +128 -0
- package/plugins/codex/skills/funpixel-gdd/references/genre-simulation.md +112 -0
- package/plugins/codex/skills/funpixel-gdd/references/genre-strategy.md +116 -0
- package/plugins/codex/skills/funpixel-gdd/references/genre-survival.md +122 -0
- package/plugins/codex/skills/funpixel-gdd/references/in-the-loop.md +106 -0
- package/plugins/codex/skills/funpixel-gdd/references/invent-first.md +131 -0
- package/plugins/codex/skills/funpixel-gdd/references/level-and-fun.md +112 -0
- package/plugins/codex/skills/funpixel-gdd/references/pages.md +47 -0
- package/plugins/codex/skills/funpixel-gdd/references/plan-at-size.md +140 -0
- package/plugins/codex/skills/funpixel-gdd/references/production-tiers.md +117 -0
- package/plugins/codex/skills/funpixel-gdd/references/sections.md +148 -0
- package/plugins/codex/skills/funpixel-gdd/references/spec-folder.md +131 -0
- package/plugins/codex/skills/funpixel-gdd/references/start.md +110 -0
- package/plugins/codex/skills/funpixel-gdd/references/starters.md +175 -0
- package/plugins/codex/skills/funpixel-gdd/references/the-path.md +133 -0
- package/plugins/codex/skills/funpixel-gdd/references/track.md +29 -0
- package/plugins/codex/skills/funpixel-gdd/references/world-and-identity.md +165 -0
- package/plugins/codex/skills/funpixel-gdd/references/worth.md +74 -0
- package/plugins/codex/skills/funpixel-mobile-ui/SKILL.md +107 -0
- package/plugins/codex/skills/funpixel-mobile-ui/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-mobile-ui/references/contrast.md +123 -0
- package/plugins/codex/skills/funpixel-mobile-ui/references/hud-and-title.md +108 -0
- package/plugins/codex/skills/funpixel-mobile-ui/references/hud-genres.md +124 -0
- package/plugins/codex/skills/funpixel-mobile-ui/references/phone-check.md +156 -0
- package/plugins/codex/skills/funpixel-mobile-ui/references/recipes.md +279 -0
- package/plugins/codex/skills/funpixel-mobile-ui/references/restyle-ui.md +229 -0
- package/plugins/codex/skills/funpixel-mobile-ui/references/unity.md +61 -0
- package/plugins/codex/skills/funpixel-publish/SKILL.md +109 -0
- package/plugins/codex/skills/funpixel-publish/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-publish/references/compose.md +113 -0
- package/plugins/codex/skills/funpixel-publish/references/motion.md +120 -0
- package/plugins/codex/skills/funpixel-publish/references/networks.md +75 -0
- package/plugins/codex/skills/funpixel-publish/references/other-hosts.md +65 -0
- package/plugins/codex/skills/funpixel-publish/references/playable-ad.md +90 -0
- package/plugins/codex/skills/funpixel-publish/references/server-build.md +85 -0
- package/plugins/codex/skills/funpixel-publish/references/store-shots.md +85 -0
- package/plugins/codex/skills/funpixel-publish/references/trailer.md +55 -0
- package/plugins/codex/skills/funpixel-publish/references/what-ships.md +30 -0
- package/plugins/codex/skills/funpixel-store/SKILL.md +81 -0
- package/plugins/codex/skills/funpixel-store/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-store/references/app-store.md +73 -0
- package/plugins/codex/skills/funpixel-store/references/google-play.md +141 -0
- package/plugins/codex/skills/funpixel-store/references/ios-release.md +63 -0
- package/plugins/codex/skills/funpixel-store/references/money.md +66 -0
- package/plugins/codex/skills/funpixel-store/references/purchases-and-review.md +74 -0
- package/plugins/codex/skills/funpixel-store/references/readiness-page.md +24 -0
- package/plugins/codex/skills/funpixel-store/references/readiness.md +107 -0
- package/plugins/codex/skills/funpixel-store/references/steam.md +38 -0
- package/plugins/codex/skills/funpixel-store/references/unity-store.md +55 -0
- package/plugins/codex/skills/funpixel-store/references/web-portals.md +43 -0
- package/plugins/codex/skills/funpixel-unity-game/SKILL.md +103 -0
- package/plugins/codex/skills/funpixel-unity-game/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-unity-game/references/agent-ops.md +54 -0
- package/plugins/codex/skills/funpixel-unity-game/references/fixes.md +40 -0
- package/plugins/codex/skills/funpixel-unity-game/references/from-a-web-game.md +108 -0
- package/plugins/codex/skills/funpixel-unity-game/references/handing-off.md +42 -0
- package/plugins/codex/skills/funpixel-unity-game/references/performance.md +59 -0
- package/plugins/codex/skills/funpixel-unity-game/references/probe.md +80 -0
- package/plugins/codex/skills/funpixel-unity-game/references/shared-mac.md +121 -0
- package/plugins/codex/skills/funpixel-unity-game/references/traps.md +108 -0
- package/plugins/codex/skills/funpixel-verify/SKILL.md +109 -0
- package/plugins/codex/skills/funpixel-verify/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-verify/references/actors.md +94 -0
- package/plugins/codex/skills/funpixel-verify/references/bar.md +62 -0
- package/plugins/codex/skills/funpixel-verify/references/checks.md +69 -0
- package/plugins/codex/skills/funpixel-verify/references/experience.md +67 -0
- package/plugins/codex/skills/funpixel-verify/references/eyes.md +54 -0
- package/plugins/codex/skills/funpixel-verify/references/fidelity.md +126 -0
- package/plugins/codex/skills/funpixel-verify/references/hit-bar.md +31 -0
- package/plugins/codex/skills/funpixel-verify/references/journeys.md +77 -0
- package/plugins/codex/skills/funpixel-verify/references/mobile-qa.md +123 -0
- package/plugins/codex/skills/funpixel-verify/references/playtest.md +161 -0
- package/plugins/codex/skills/funpixel-verify/references/review.md +105 -0
- package/plugins/codex/skills/funpixel-verify/references/rubric.md +67 -0
- package/plugins/codex/skills/funpixel-verify/references/scenes.md +49 -0
- package/plugins/codex/skills/funpixel-verify/references/unity.md +60 -0
- package/plugins/codex/skills/funpixel-world-and-story/SKILL.md +99 -0
- package/plugins/codex/skills/funpixel-world-and-story/agents/openai.yaml +12 -0
- package/plugins/codex/skills/funpixel-world-and-story/references/atmosphere.md +208 -0
- package/plugins/codex/skills/funpixel-world-and-story/references/forged-world.md +79 -0
- package/plugins/codex/skills/funpixel-world-and-story/references/living-world.md +237 -0
- package/plugins/codex/skills/funpixel-world-and-story/references/opening-and-chapters.md +215 -0
- package/plugins/codex/skills/funpixel-world-and-story/references/shelf.md +80 -0
- package/plugins/codex/skills/funpixel-world-and-story/references/story-at-size.md +159 -0
- package/plugins/codex/skills/funpixel-world-and-story/references/voice.md +175 -0
- package/plugins/codex/skills/funpixel-world-and-story/references/world-kit.md +154 -0
- package/plugins/cursor/.cursor-plugin/plugin.json +26 -0
- package/plugins/cursor/LICENSE +115 -0
- package/plugins/cursor/README.md +13 -0
- package/plugins/cursor/THIRD_PARTY_NOTICES.md +75 -0
- package/plugins/cursor/agents/art-director.md +54 -0
- package/plugins/cursor/agents/audio-director.md +51 -0
- package/plugins/cursor/agents/critic.md +113 -0
- package/plugins/cursor/agents/lane.md +37 -0
- package/plugins/cursor/agents/level-designer.md +45 -0
- package/plugins/cursor/agents/mobile-qa.md +70 -0
- package/plugins/cursor/agents/player.md +143 -0
- package/plugins/cursor/agents/qa-lead.md +52 -0
- package/plugins/cursor/commands/first-look.md +59 -0
- package/plugins/cursor/commands/flow.md +50 -0
- package/plugins/cursor/commands/lanes.md +38 -0
- package/plugins/cursor/commands/mobile-qa.md +28 -0
- package/plugins/cursor/commands/new.md +94 -0
- package/plugins/cursor/commands/playtest.md +66 -0
- package/plugins/cursor/commands/publish.md +23 -0
- package/plugins/cursor/commands/smoke-build.md +25 -0
- package/plugins/cursor/commands/verify.md +20 -0
- package/plugins/cursor/hooks/brief.md +135 -0
- package/plugins/cursor/hooks/critic-receipts.mjs +86 -0
- package/plugins/cursor/hooks/durable.mjs +56 -0
- package/plugins/cursor/hooks/fence.mjs +30 -0
- package/plugins/cursor/hooks/floors.mjs +181 -0
- package/plugins/cursor/hooks/flow.mjs +154 -0
- package/plugins/cursor/hooks/front-door.mjs +68 -0
- package/plugins/cursor/hooks/guidance.json +3 -0
- package/plugins/cursor/hooks/hints.mjs +183 -0
- package/plugins/cursor/hooks/hooks.json +26 -0
- package/plugins/cursor/hooks/lib.mjs +362 -0
- package/plugins/cursor/hooks/memory.mjs +92 -0
- package/plugins/cursor/hooks/mobile-qa.mjs +43 -0
- package/plugins/cursor/hooks/note.mjs +63 -0
- package/plugins/cursor/hooks/nudge.mjs +98 -0
- package/plugins/cursor/hooks/pipeline.mjs +207 -0
- package/plugins/cursor/hooks/prompt.mjs +51 -0
- package/plugins/cursor/hooks/quality.mjs +310 -0
- package/plugins/cursor/hooks/reach.mjs +93 -0
- package/plugins/cursor/hooks/scope.mjs +44 -0
- package/plugins/cursor/hooks/session-log.mjs +101 -0
- package/plugins/cursor/hooks/session-start.mjs +194 -0
- package/plugins/cursor/hooks/stop-gate.mjs +303 -0
- package/plugins/cursor/hooks/vendor/direct/round.mjs +81 -0
- package/plugins/cursor/hooks/vendor/find/names.mjs +46 -0
- package/plugins/cursor/hooks/vendor/firstlook/set.mjs +219 -0
- package/plugins/cursor/hooks/vendor/flow/flow.mjs +456 -0
- package/plugins/cursor/hooks/vendor/flow/look.mjs +140 -0
- package/plugins/cursor/hooks/vendor/gdd/book.mjs +484 -0
- package/plugins/cursor/hooks/vendor/gdd/chapters.mjs +72 -0
- package/plugins/cursor/hooks/vendor/gdd/doc.mjs +33 -0
- package/plugins/cursor/hooks/vendor/gdd/levelmap.mjs +429 -0
- package/plugins/cursor/hooks/vendor/gdd/rubric.mjs +251 -0
- package/plugins/cursor/hooks/vendor/gdd/worth.mjs +508 -0
- package/plugins/cursor/hooks/vendor/lanes/fence.mjs +109 -0
- package/plugins/cursor/hooks/vendor/lanes/lanes.mjs +356 -0
- package/plugins/cursor/hooks/vendor/lanes/union.mjs +63 -0
- package/plugins/cursor/hooks/vendor/lessons/motifs.mjs +98 -0
- package/plugins/cursor/hooks/vendor/lessons/store.mjs +57 -0
- package/plugins/cursor/hooks/vendor/look/made-of.mjs +243 -0
- package/plugins/cursor/hooks/vendor/look/roles.mjs +110 -0
- package/plugins/cursor/hooks/vendor/memory/decisions.mjs +139 -0
- package/plugins/cursor/hooks/vendor/memory/journal.mjs +109 -0
- package/plugins/cursor/hooks/vendor/owner/bar.mjs +286 -0
- package/plugins/cursor/hooks/vendor/pipeline/pipeline.mjs +930 -0
- package/plugins/cursor/hooks/vendor/playtest/keep.mjs +111 -0
- package/plugins/cursor/hooks/vendor/playtest/stuck.mjs +48 -0
- package/plugins/cursor/hooks/vendor/progress/holds.mjs +107 -0
- package/plugins/cursor/hooks/vendor/progress/progress.mjs +301 -0
- package/plugins/cursor/hooks/vendor/sim/judge.mjs +241 -0
- package/plugins/cursor/hooks/vendor/spec/rooms.mjs +189 -0
- package/plugins/cursor/hooks/vendor/spec/tunables.mjs +75 -0
- package/plugins/cursor/hooks/vendor/stage/harnessignore.mjs +91 -0
- package/plugins/cursor/hooks/vendor/stage/stage.mjs +58 -0
- package/plugins/cursor/hooks/vendor/status/board.mjs +173 -0
- package/plugins/cursor/hooks/vendor/status/file.mjs +113 -0
- package/plugins/cursor/hooks/vendor/studio/forks.mjs +94 -0
- package/plugins/cursor/hooks/vendor/studio/pitch.mjs +295 -0
- package/plugins/cursor/hooks/vendor/verify/fingerprint.mjs +73 -0
- package/plugins/cursor/hooks/vendor/verify/reads.mjs +33 -0
- package/plugins/cursor/hooks/vendor/wow/picks.mjs +75 -0
- package/plugins/cursor/mcp.json +10 -0
- package/plugins/cursor/rules/funpixel-brief.mdc +141 -0
- package/plugins/cursor/skills/funpixel-3d/SKILL.md +89 -0
- package/plugins/cursor/skills/funpixel-3d/references/bake-off.md +48 -0
- package/plugins/cursor/skills/funpixel-3d/references/bench.md +103 -0
- package/plugins/cursor/skills/funpixel-3d/references/budgets.md +48 -0
- package/plugins/cursor/skills/funpixel-3d/references/characters.md +67 -0
- package/plugins/cursor/skills/funpixel-3d/references/concept-image.md +47 -0
- package/plugins/cursor/skills/funpixel-3d/references/engine-targets.md +31 -0
- package/plugins/cursor/skills/funpixel-3d/references/hero-route.md +104 -0
- package/plugins/cursor/skills/funpixel-3d/references/level-spec.md +109 -0
- package/plugins/cursor/skills/funpixel-3d/references/levels.md +84 -0
- package/plugins/cursor/skills/funpixel-3d/references/light-and-places.md +141 -0
- package/plugins/cursor/skills/funpixel-3d/references/models.md +111 -0
- package/plugins/cursor/skills/funpixel-3d/references/painted-target.md +184 -0
- package/plugins/cursor/skills/funpixel-3d/references/reading.md +41 -0
- package/plugins/cursor/skills/funpixel-3d/references/skin.md +85 -0
- package/plugins/cursor/skills/funpixel-3d/references/skyboxes.md +65 -0
- package/plugins/cursor/skills/funpixel-3d/references/textures.md +71 -0
- package/plugins/cursor/skills/funpixel-3d/references/three-loading.md +199 -0
- package/plugins/cursor/skills/funpixel-3d/references/unity.md +78 -0
- package/plugins/cursor/skills/funpixel-art/SKILL.md +104 -0
- package/plugins/cursor/skills/funpixel-art/references/2d-assets.md +108 -0
- package/plugins/cursor/skills/funpixel-art/references/animation.md +126 -0
- package/plugins/cursor/skills/funpixel-art/references/cast.md +73 -0
- package/plugins/cursor/skills/funpixel-art/references/characters.md +49 -0
- package/plugins/cursor/skills/funpixel-art/references/cost.md +107 -0
- package/plugins/cursor/skills/funpixel-art/references/effects.md +85 -0
- package/plugins/cursor/skills/funpixel-art/references/frames.md +87 -0
- package/plugins/cursor/skills/funpixel-art/references/judging-frames.md +64 -0
- package/plugins/cursor/skills/funpixel-art/references/look.md +102 -0
- package/plugins/cursor/skills/funpixel-art/references/measure.md +119 -0
- package/plugins/cursor/skills/funpixel-art/references/pipeline.md +185 -0
- package/plugins/cursor/skills/funpixel-art/references/pixi.md +277 -0
- package/plugins/cursor/skills/funpixel-art/references/planes.md +27 -0
- package/plugins/cursor/skills/funpixel-art/references/prompts.md +171 -0
- package/plugins/cursor/skills/funpixel-art/references/sheets.md +141 -0
- package/plugins/cursor/skills/funpixel-art/references/style-file.md +39 -0
- package/plugins/cursor/skills/funpixel-art/references/three.md +232 -0
- package/plugins/cursor/skills/funpixel-art/references/ui.md +163 -0
- package/plugins/cursor/skills/funpixel-art/references/unity.md +78 -0
- package/plugins/cursor/skills/funpixel-art/references/wiring.md +41 -0
- package/plugins/cursor/skills/funpixel-audio/SKILL.md +92 -0
- package/plugins/cursor/skills/funpixel-audio/references/adaptive-music.md +204 -0
- package/plugins/cursor/skills/funpixel-audio/references/engine.md +78 -0
- package/plugins/cursor/skills/funpixel-audio/references/measure.md +101 -0
- package/plugins/cursor/skills/funpixel-audio/references/unity.md +74 -0
- package/plugins/cursor/skills/funpixel-feedback/SKILL.md +120 -0
- package/plugins/cursor/skills/funpixel-feedback/references/memory.md +99 -0
- package/plugins/cursor/skills/funpixel-game-feel/SKILL.md +104 -0
- package/plugins/cursor/skills/funpixel-game-feel/references/contact.md +110 -0
- package/plugins/cursor/skills/funpixel-game-feel/references/measure.md +125 -0
- package/plugins/cursor/skills/funpixel-game-feel/references/motion.md +134 -0
- package/plugins/cursor/skills/funpixel-game-feel/references/payoffs.md +35 -0
- package/plugins/cursor/skills/funpixel-game-feel/references/recipes.md +107 -0
- package/plugins/cursor/skills/funpixel-game-feel/references/unity.md +73 -0
- package/plugins/cursor/skills/funpixel-game-logic/SKILL.md +113 -0
- package/plugins/cursor/skills/funpixel-game-logic/references/balance.md +88 -0
- package/plugins/cursor/skills/funpixel-game-logic/references/content-at-scale.md +147 -0
- package/plugins/cursor/skills/funpixel-game-logic/references/depth.md +89 -0
- package/plugins/cursor/skills/funpixel-game-logic/references/escalation.md +41 -0
- package/plugins/cursor/skills/funpixel-game-logic/references/levels.md +61 -0
- package/plugins/cursor/skills/funpixel-game-logic/references/probes.md +122 -0
- package/plugins/cursor/skills/funpixel-game-logic/references/unity.md +108 -0
- package/plugins/cursor/skills/funpixel-game-spine/SKILL.md +118 -0
- package/plugins/cursor/skills/funpixel-game-spine/references/camera.md +94 -0
- package/plugins/cursor/skills/funpixel-game-spine/references/multiplayer.md +101 -0
- package/plugins/cursor/skills/funpixel-game-spine/references/patterns.md +103 -0
- package/plugins/cursor/skills/funpixel-game-spine/references/performance.md +96 -0
- package/plugins/cursor/skills/funpixel-game-spine/references/pixi.md +26 -0
- package/plugins/cursor/skills/funpixel-game-spine/references/replay.md +102 -0
- package/plugins/cursor/skills/funpixel-game-spine/references/room-api.md +63 -0
- package/plugins/cursor/skills/funpixel-game-spine/references/room-modes.md +40 -0
- package/plugins/cursor/skills/funpixel-game-spine/references/sdk.md +114 -0
- package/plugins/cursor/skills/funpixel-game-spine/references/three.md +62 -0
- package/plugins/cursor/skills/funpixel-gdd/SKILL.md +116 -0
- package/plugins/cursor/skills/funpixel-gdd/references/as-built.md +40 -0
- package/plugins/cursor/skills/funpixel-gdd/references/design-measures.md +24 -0
- package/plugins/cursor/skills/funpixel-gdd/references/design-note.md +88 -0
- package/plugins/cursor/skills/funpixel-gdd/references/experience.md +92 -0
- package/plugins/cursor/skills/funpixel-gdd/references/first-look.md +226 -0
- package/plugins/cursor/skills/funpixel-gdd/references/floors.md +62 -0
- package/plugins/cursor/skills/funpixel-gdd/references/frame.md +75 -0
- package/plugins/cursor/skills/funpixel-gdd/references/gameplay-contract.md +81 -0
- package/plugins/cursor/skills/funpixel-gdd/references/gdd-template.md +417 -0
- package/plugins/cursor/skills/funpixel-gdd/references/genre-card.md +109 -0
- package/plugins/cursor/skills/funpixel-gdd/references/genre-platformer.md +159 -0
- package/plugins/cursor/skills/funpixel-gdd/references/genre-puzzle.md +145 -0
- package/plugins/cursor/skills/funpixel-gdd/references/genre-racing.md +137 -0
- package/plugins/cursor/skills/funpixel-gdd/references/genre-rpg.md +125 -0
- package/plugins/cursor/skills/funpixel-gdd/references/genre-shooter.md +128 -0
- package/plugins/cursor/skills/funpixel-gdd/references/genre-simulation.md +112 -0
- package/plugins/cursor/skills/funpixel-gdd/references/genre-strategy.md +116 -0
- package/plugins/cursor/skills/funpixel-gdd/references/genre-survival.md +122 -0
- package/plugins/cursor/skills/funpixel-gdd/references/in-the-loop.md +106 -0
- package/plugins/cursor/skills/funpixel-gdd/references/invent-first.md +131 -0
- package/plugins/cursor/skills/funpixel-gdd/references/level-and-fun.md +112 -0
- package/plugins/cursor/skills/funpixel-gdd/references/pages.md +47 -0
- package/plugins/cursor/skills/funpixel-gdd/references/plan-at-size.md +140 -0
- package/plugins/cursor/skills/funpixel-gdd/references/production-tiers.md +117 -0
- package/plugins/cursor/skills/funpixel-gdd/references/sections.md +148 -0
- package/plugins/cursor/skills/funpixel-gdd/references/spec-folder.md +131 -0
- package/plugins/cursor/skills/funpixel-gdd/references/start.md +110 -0
- package/plugins/cursor/skills/funpixel-gdd/references/starters.md +175 -0
- package/plugins/cursor/skills/funpixel-gdd/references/the-path.md +133 -0
- package/plugins/cursor/skills/funpixel-gdd/references/track.md +29 -0
- package/plugins/cursor/skills/funpixel-gdd/references/world-and-identity.md +165 -0
- package/plugins/cursor/skills/funpixel-gdd/references/worth.md +74 -0
- package/plugins/cursor/skills/funpixel-mobile-ui/SKILL.md +107 -0
- package/plugins/cursor/skills/funpixel-mobile-ui/references/contrast.md +123 -0
- package/plugins/cursor/skills/funpixel-mobile-ui/references/hud-and-title.md +108 -0
- package/plugins/cursor/skills/funpixel-mobile-ui/references/hud-genres.md +124 -0
- package/plugins/cursor/skills/funpixel-mobile-ui/references/phone-check.md +156 -0
- package/plugins/cursor/skills/funpixel-mobile-ui/references/recipes.md +279 -0
- package/plugins/cursor/skills/funpixel-mobile-ui/references/restyle-ui.md +229 -0
- package/plugins/cursor/skills/funpixel-mobile-ui/references/unity.md +61 -0
- package/plugins/cursor/skills/funpixel-publish/SKILL.md +109 -0
- package/plugins/cursor/skills/funpixel-publish/references/compose.md +113 -0
- package/plugins/cursor/skills/funpixel-publish/references/motion.md +120 -0
- package/plugins/cursor/skills/funpixel-publish/references/networks.md +75 -0
- package/plugins/cursor/skills/funpixel-publish/references/other-hosts.md +65 -0
- package/plugins/cursor/skills/funpixel-publish/references/playable-ad.md +90 -0
- package/plugins/cursor/skills/funpixel-publish/references/server-build.md +85 -0
- package/plugins/cursor/skills/funpixel-publish/references/store-shots.md +85 -0
- package/plugins/cursor/skills/funpixel-publish/references/trailer.md +55 -0
- package/plugins/cursor/skills/funpixel-publish/references/what-ships.md +30 -0
- package/plugins/cursor/skills/funpixel-store/SKILL.md +81 -0
- package/plugins/cursor/skills/funpixel-store/references/app-store.md +73 -0
- package/plugins/cursor/skills/funpixel-store/references/google-play.md +141 -0
- package/plugins/cursor/skills/funpixel-store/references/ios-release.md +63 -0
- package/plugins/cursor/skills/funpixel-store/references/money.md +66 -0
- package/plugins/cursor/skills/funpixel-store/references/purchases-and-review.md +74 -0
- package/plugins/cursor/skills/funpixel-store/references/readiness-page.md +24 -0
- package/plugins/cursor/skills/funpixel-store/references/readiness.md +107 -0
- package/plugins/cursor/skills/funpixel-store/references/steam.md +38 -0
- package/plugins/cursor/skills/funpixel-store/references/unity-store.md +55 -0
- package/plugins/cursor/skills/funpixel-store/references/web-portals.md +43 -0
- package/plugins/cursor/skills/funpixel-unity-game/SKILL.md +103 -0
- package/plugins/cursor/skills/funpixel-unity-game/references/agent-ops.md +54 -0
- package/plugins/cursor/skills/funpixel-unity-game/references/fixes.md +40 -0
- package/plugins/cursor/skills/funpixel-unity-game/references/from-a-web-game.md +108 -0
- package/plugins/cursor/skills/funpixel-unity-game/references/handing-off.md +42 -0
- package/plugins/cursor/skills/funpixel-unity-game/references/performance.md +59 -0
- package/plugins/cursor/skills/funpixel-unity-game/references/probe.md +80 -0
- package/plugins/cursor/skills/funpixel-unity-game/references/shared-mac.md +121 -0
- package/plugins/cursor/skills/funpixel-unity-game/references/traps.md +108 -0
- package/plugins/cursor/skills/funpixel-verify/SKILL.md +109 -0
- package/plugins/cursor/skills/funpixel-verify/references/actors.md +94 -0
- package/plugins/cursor/skills/funpixel-verify/references/bar.md +62 -0
- package/plugins/cursor/skills/funpixel-verify/references/checks.md +69 -0
- package/plugins/cursor/skills/funpixel-verify/references/experience.md +67 -0
- package/plugins/cursor/skills/funpixel-verify/references/eyes.md +54 -0
- package/plugins/cursor/skills/funpixel-verify/references/fidelity.md +126 -0
- package/plugins/cursor/skills/funpixel-verify/references/hit-bar.md +31 -0
- package/plugins/cursor/skills/funpixel-verify/references/journeys.md +77 -0
- package/plugins/cursor/skills/funpixel-verify/references/mobile-qa.md +123 -0
- package/plugins/cursor/skills/funpixel-verify/references/playtest.md +161 -0
- package/plugins/cursor/skills/funpixel-verify/references/review.md +105 -0
- package/plugins/cursor/skills/funpixel-verify/references/rubric.md +67 -0
- package/plugins/cursor/skills/funpixel-verify/references/scenes.md +49 -0
- package/plugins/cursor/skills/funpixel-verify/references/unity.md +60 -0
- package/plugins/cursor/skills/funpixel-world-and-story/SKILL.md +99 -0
- package/plugins/cursor/skills/funpixel-world-and-story/references/atmosphere.md +208 -0
- package/plugins/cursor/skills/funpixel-world-and-story/references/forged-world.md +79 -0
- package/plugins/cursor/skills/funpixel-world-and-story/references/living-world.md +237 -0
- package/plugins/cursor/skills/funpixel-world-and-story/references/opening-and-chapters.md +215 -0
- package/plugins/cursor/skills/funpixel-world-and-story/references/shelf.md +80 -0
- package/plugins/cursor/skills/funpixel-world-and-story/references/story-at-size.md +159 -0
- package/plugins/cursor/skills/funpixel-world-and-story/references/voice.md +175 -0
- package/plugins/cursor/skills/funpixel-world-and-story/references/world-kit.md +154 -0
- package/plugins/kiro/AGENTS.md +135 -0
- package/plugins/kiro/LICENSE +115 -0
- package/plugins/kiro/README.md +17 -0
- package/plugins/kiro/THIRD_PARTY_NOTICES.md +75 -0
- package/plugins/kiro/agent.template.json +45 -0
- package/plugins/kiro/hooks/brief.md +135 -0
- package/plugins/kiro/hooks/critic-receipts.mjs +86 -0
- package/plugins/kiro/hooks/durable.mjs +56 -0
- package/plugins/kiro/hooks/fence.mjs +30 -0
- package/plugins/kiro/hooks/floors.mjs +181 -0
- package/plugins/kiro/hooks/flow.mjs +154 -0
- package/plugins/kiro/hooks/front-door.mjs +68 -0
- package/plugins/kiro/hooks/guidance.json +3 -0
- package/plugins/kiro/hooks/hints.mjs +183 -0
- package/plugins/kiro/hooks/host.md +43 -0
- package/plugins/kiro/hooks/kiro-prompt.mjs +26 -0
- package/plugins/kiro/hooks/lib.mjs +362 -0
- package/plugins/kiro/hooks/memory.mjs +92 -0
- package/plugins/kiro/hooks/mobile-qa.mjs +43 -0
- package/plugins/kiro/hooks/note.mjs +63 -0
- package/plugins/kiro/hooks/nudge.mjs +98 -0
- package/plugins/kiro/hooks/pipeline.mjs +207 -0
- package/plugins/kiro/hooks/prompt.mjs +51 -0
- package/plugins/kiro/hooks/quality.mjs +310 -0
- package/plugins/kiro/hooks/reach.mjs +93 -0
- package/plugins/kiro/hooks/scope.mjs +44 -0
- package/plugins/kiro/hooks/session-log.mjs +101 -0
- package/plugins/kiro/hooks/session-start.mjs +194 -0
- package/plugins/kiro/hooks/stop-gate.mjs +303 -0
- package/plugins/kiro/hooks/vendor/direct/round.mjs +81 -0
- package/plugins/kiro/hooks/vendor/find/names.mjs +46 -0
- package/plugins/kiro/hooks/vendor/firstlook/set.mjs +219 -0
- package/plugins/kiro/hooks/vendor/flow/flow.mjs +456 -0
- package/plugins/kiro/hooks/vendor/flow/look.mjs +140 -0
- package/plugins/kiro/hooks/vendor/gdd/book.mjs +484 -0
- package/plugins/kiro/hooks/vendor/gdd/chapters.mjs +72 -0
- package/plugins/kiro/hooks/vendor/gdd/doc.mjs +33 -0
- package/plugins/kiro/hooks/vendor/gdd/levelmap.mjs +429 -0
- package/plugins/kiro/hooks/vendor/gdd/rubric.mjs +251 -0
- package/plugins/kiro/hooks/vendor/gdd/worth.mjs +508 -0
- package/plugins/kiro/hooks/vendor/lanes/fence.mjs +109 -0
- package/plugins/kiro/hooks/vendor/lanes/lanes.mjs +356 -0
- package/plugins/kiro/hooks/vendor/lanes/union.mjs +63 -0
- package/plugins/kiro/hooks/vendor/lessons/motifs.mjs +98 -0
- package/plugins/kiro/hooks/vendor/lessons/store.mjs +57 -0
- package/plugins/kiro/hooks/vendor/look/made-of.mjs +243 -0
- package/plugins/kiro/hooks/vendor/look/roles.mjs +110 -0
- package/plugins/kiro/hooks/vendor/memory/decisions.mjs +139 -0
- package/plugins/kiro/hooks/vendor/memory/journal.mjs +109 -0
- package/plugins/kiro/hooks/vendor/owner/bar.mjs +286 -0
- package/plugins/kiro/hooks/vendor/pipeline/pipeline.mjs +930 -0
- package/plugins/kiro/hooks/vendor/playtest/keep.mjs +111 -0
- package/plugins/kiro/hooks/vendor/playtest/stuck.mjs +48 -0
- package/plugins/kiro/hooks/vendor/progress/holds.mjs +107 -0
- package/plugins/kiro/hooks/vendor/progress/progress.mjs +301 -0
- package/plugins/kiro/hooks/vendor/sim/judge.mjs +241 -0
- package/plugins/kiro/hooks/vendor/spec/rooms.mjs +189 -0
- package/plugins/kiro/hooks/vendor/spec/tunables.mjs +75 -0
- package/plugins/kiro/hooks/vendor/stage/harnessignore.mjs +91 -0
- package/plugins/kiro/hooks/vendor/stage/stage.mjs +58 -0
- package/plugins/kiro/hooks/vendor/status/board.mjs +173 -0
- package/plugins/kiro/hooks/vendor/status/file.mjs +113 -0
- package/plugins/kiro/hooks/vendor/studio/forks.mjs +94 -0
- package/plugins/kiro/hooks/vendor/studio/pitch.mjs +295 -0
- package/plugins/kiro/hooks/vendor/verify/fingerprint.mjs +73 -0
- package/plugins/kiro/hooks/vendor/verify/reads.mjs +33 -0
- package/plugins/kiro/hooks/vendor/wow/picks.mjs +75 -0
- package/plugins/kiro/install.mjs +37 -0
- package/plugins/kiro/skills/fp-art-director/SKILL.md +58 -0
- package/plugins/kiro/skills/fp-art-director/references/kiro.md +43 -0
- package/plugins/kiro/skills/fp-audio-director/SKILL.md +55 -0
- package/plugins/kiro/skills/fp-audio-director/references/kiro.md +43 -0
- package/plugins/kiro/skills/fp-critic/SKILL.md +117 -0
- package/plugins/kiro/skills/fp-critic/references/kiro.md +43 -0
- package/plugins/kiro/skills/fp-first-look/SKILL.md +61 -0
- package/plugins/kiro/skills/fp-flow/SKILL.md +52 -0
- package/plugins/kiro/skills/fp-lane/SKILL.md +41 -0
- package/plugins/kiro/skills/fp-lane/references/kiro.md +43 -0
- package/plugins/kiro/skills/fp-lanes/SKILL.md +40 -0
- package/plugins/kiro/skills/fp-level-designer/SKILL.md +49 -0
- package/plugins/kiro/skills/fp-level-designer/references/kiro.md +43 -0
- package/plugins/kiro/skills/fp-mobile-qa/SKILL.md +30 -0
- package/plugins/kiro/skills/fp-mobile-qa-seat/SKILL.md +74 -0
- package/plugins/kiro/skills/fp-mobile-qa-seat/references/kiro.md +43 -0
- package/plugins/kiro/skills/fp-new/SKILL.md +96 -0
- package/plugins/kiro/skills/fp-player/SKILL.md +147 -0
- package/plugins/kiro/skills/fp-player/references/kiro.md +43 -0
- package/plugins/kiro/skills/fp-playtest/SKILL.md +68 -0
- package/plugins/kiro/skills/fp-publish/SKILL.md +25 -0
- package/plugins/kiro/skills/fp-qa-lead/SKILL.md +56 -0
- package/plugins/kiro/skills/fp-qa-lead/references/kiro.md +43 -0
- package/plugins/kiro/skills/fp-smoke-build/SKILL.md +27 -0
- package/plugins/kiro/skills/fp-studio/SKILL.md +48 -0
- package/plugins/kiro/skills/fp-verify/SKILL.md +22 -0
- package/plugins/kiro/skills/funpixel-3d/SKILL.md +89 -0
- package/plugins/kiro/skills/funpixel-3d/references/bake-off.md +48 -0
- package/plugins/kiro/skills/funpixel-3d/references/bench.md +103 -0
- package/plugins/kiro/skills/funpixel-3d/references/budgets.md +48 -0
- package/plugins/kiro/skills/funpixel-3d/references/characters.md +67 -0
- package/plugins/kiro/skills/funpixel-3d/references/concept-image.md +47 -0
- package/plugins/kiro/skills/funpixel-3d/references/engine-targets.md +31 -0
- package/plugins/kiro/skills/funpixel-3d/references/hero-route.md +104 -0
- package/plugins/kiro/skills/funpixel-3d/references/level-spec.md +109 -0
- package/plugins/kiro/skills/funpixel-3d/references/levels.md +84 -0
- package/plugins/kiro/skills/funpixel-3d/references/light-and-places.md +141 -0
- package/plugins/kiro/skills/funpixel-3d/references/models.md +111 -0
- package/plugins/kiro/skills/funpixel-3d/references/painted-target.md +184 -0
- package/plugins/kiro/skills/funpixel-3d/references/reading.md +41 -0
- package/plugins/kiro/skills/funpixel-3d/references/skin.md +85 -0
- package/plugins/kiro/skills/funpixel-3d/references/skyboxes.md +65 -0
- package/plugins/kiro/skills/funpixel-3d/references/textures.md +71 -0
- package/plugins/kiro/skills/funpixel-3d/references/three-loading.md +199 -0
- package/plugins/kiro/skills/funpixel-3d/references/unity.md +78 -0
- package/plugins/kiro/skills/funpixel-art/SKILL.md +104 -0
- package/plugins/kiro/skills/funpixel-art/references/2d-assets.md +108 -0
- package/plugins/kiro/skills/funpixel-art/references/animation.md +126 -0
- package/plugins/kiro/skills/funpixel-art/references/cast.md +73 -0
- package/plugins/kiro/skills/funpixel-art/references/characters.md +49 -0
- package/plugins/kiro/skills/funpixel-art/references/cost.md +107 -0
- package/plugins/kiro/skills/funpixel-art/references/effects.md +85 -0
- package/plugins/kiro/skills/funpixel-art/references/frames.md +87 -0
- package/plugins/kiro/skills/funpixel-art/references/judging-frames.md +64 -0
- package/plugins/kiro/skills/funpixel-art/references/look.md +102 -0
- package/plugins/kiro/skills/funpixel-art/references/measure.md +119 -0
- package/plugins/kiro/skills/funpixel-art/references/pipeline.md +185 -0
- package/plugins/kiro/skills/funpixel-art/references/pixi.md +277 -0
- package/plugins/kiro/skills/funpixel-art/references/planes.md +27 -0
- package/plugins/kiro/skills/funpixel-art/references/prompts.md +171 -0
- package/plugins/kiro/skills/funpixel-art/references/sheets.md +141 -0
- package/plugins/kiro/skills/funpixel-art/references/style-file.md +39 -0
- package/plugins/kiro/skills/funpixel-art/references/three.md +232 -0
- package/plugins/kiro/skills/funpixel-art/references/ui.md +163 -0
- package/plugins/kiro/skills/funpixel-art/references/unity.md +78 -0
- package/plugins/kiro/skills/funpixel-art/references/wiring.md +41 -0
- package/plugins/kiro/skills/funpixel-audio/SKILL.md +92 -0
- package/plugins/kiro/skills/funpixel-audio/references/adaptive-music.md +204 -0
- package/plugins/kiro/skills/funpixel-audio/references/engine.md +78 -0
- package/plugins/kiro/skills/funpixel-audio/references/measure.md +101 -0
- package/plugins/kiro/skills/funpixel-audio/references/unity.md +74 -0
- package/plugins/kiro/skills/funpixel-feedback/SKILL.md +120 -0
- package/plugins/kiro/skills/funpixel-feedback/references/memory.md +99 -0
- package/plugins/kiro/skills/funpixel-game-feel/SKILL.md +104 -0
- package/plugins/kiro/skills/funpixel-game-feel/references/contact.md +110 -0
- package/plugins/kiro/skills/funpixel-game-feel/references/measure.md +125 -0
- package/plugins/kiro/skills/funpixel-game-feel/references/motion.md +134 -0
- package/plugins/kiro/skills/funpixel-game-feel/references/payoffs.md +35 -0
- package/plugins/kiro/skills/funpixel-game-feel/references/recipes.md +107 -0
- package/plugins/kiro/skills/funpixel-game-feel/references/unity.md +73 -0
- package/plugins/kiro/skills/funpixel-game-logic/SKILL.md +113 -0
- package/plugins/kiro/skills/funpixel-game-logic/references/balance.md +88 -0
- package/plugins/kiro/skills/funpixel-game-logic/references/content-at-scale.md +147 -0
- package/plugins/kiro/skills/funpixel-game-logic/references/depth.md +89 -0
- package/plugins/kiro/skills/funpixel-game-logic/references/escalation.md +41 -0
- package/plugins/kiro/skills/funpixel-game-logic/references/levels.md +61 -0
- package/plugins/kiro/skills/funpixel-game-logic/references/probes.md +122 -0
- package/plugins/kiro/skills/funpixel-game-logic/references/unity.md +108 -0
- package/plugins/kiro/skills/funpixel-game-spine/SKILL.md +118 -0
- package/plugins/kiro/skills/funpixel-game-spine/references/camera.md +94 -0
- package/plugins/kiro/skills/funpixel-game-spine/references/multiplayer.md +101 -0
- package/plugins/kiro/skills/funpixel-game-spine/references/patterns.md +103 -0
- package/plugins/kiro/skills/funpixel-game-spine/references/performance.md +96 -0
- package/plugins/kiro/skills/funpixel-game-spine/references/pixi.md +26 -0
- package/plugins/kiro/skills/funpixel-game-spine/references/replay.md +102 -0
- package/plugins/kiro/skills/funpixel-game-spine/references/room-api.md +63 -0
- package/plugins/kiro/skills/funpixel-game-spine/references/room-modes.md +40 -0
- package/plugins/kiro/skills/funpixel-game-spine/references/sdk.md +114 -0
- package/plugins/kiro/skills/funpixel-game-spine/references/three.md +62 -0
- package/plugins/kiro/skills/funpixel-gdd/SKILL.md +116 -0
- package/plugins/kiro/skills/funpixel-gdd/references/as-built.md +40 -0
- package/plugins/kiro/skills/funpixel-gdd/references/design-measures.md +24 -0
- package/plugins/kiro/skills/funpixel-gdd/references/design-note.md +88 -0
- package/plugins/kiro/skills/funpixel-gdd/references/experience.md +92 -0
- package/plugins/kiro/skills/funpixel-gdd/references/first-look.md +226 -0
- package/plugins/kiro/skills/funpixel-gdd/references/floors.md +62 -0
- package/plugins/kiro/skills/funpixel-gdd/references/frame.md +75 -0
- package/plugins/kiro/skills/funpixel-gdd/references/gameplay-contract.md +81 -0
- package/plugins/kiro/skills/funpixel-gdd/references/gdd-template.md +417 -0
- package/plugins/kiro/skills/funpixel-gdd/references/genre-card.md +109 -0
- package/plugins/kiro/skills/funpixel-gdd/references/genre-platformer.md +159 -0
- package/plugins/kiro/skills/funpixel-gdd/references/genre-puzzle.md +145 -0
- package/plugins/kiro/skills/funpixel-gdd/references/genre-racing.md +137 -0
- package/plugins/kiro/skills/funpixel-gdd/references/genre-rpg.md +125 -0
- package/plugins/kiro/skills/funpixel-gdd/references/genre-shooter.md +128 -0
- package/plugins/kiro/skills/funpixel-gdd/references/genre-simulation.md +112 -0
- package/plugins/kiro/skills/funpixel-gdd/references/genre-strategy.md +116 -0
- package/plugins/kiro/skills/funpixel-gdd/references/genre-survival.md +122 -0
- package/plugins/kiro/skills/funpixel-gdd/references/in-the-loop.md +106 -0
- package/plugins/kiro/skills/funpixel-gdd/references/invent-first.md +131 -0
- package/plugins/kiro/skills/funpixel-gdd/references/level-and-fun.md +112 -0
- package/plugins/kiro/skills/funpixel-gdd/references/pages.md +47 -0
- package/plugins/kiro/skills/funpixel-gdd/references/plan-at-size.md +140 -0
- package/plugins/kiro/skills/funpixel-gdd/references/production-tiers.md +117 -0
- package/plugins/kiro/skills/funpixel-gdd/references/sections.md +148 -0
- package/plugins/kiro/skills/funpixel-gdd/references/spec-folder.md +131 -0
- package/plugins/kiro/skills/funpixel-gdd/references/start.md +110 -0
- package/plugins/kiro/skills/funpixel-gdd/references/starters.md +175 -0
- package/plugins/kiro/skills/funpixel-gdd/references/the-path.md +133 -0
- package/plugins/kiro/skills/funpixel-gdd/references/track.md +29 -0
- package/plugins/kiro/skills/funpixel-gdd/references/world-and-identity.md +165 -0
- package/plugins/kiro/skills/funpixel-gdd/references/worth.md +74 -0
- package/plugins/kiro/skills/funpixel-mobile-ui/SKILL.md +107 -0
- package/plugins/kiro/skills/funpixel-mobile-ui/references/contrast.md +123 -0
- package/plugins/kiro/skills/funpixel-mobile-ui/references/hud-and-title.md +108 -0
- package/plugins/kiro/skills/funpixel-mobile-ui/references/hud-genres.md +124 -0
- package/plugins/kiro/skills/funpixel-mobile-ui/references/phone-check.md +156 -0
- package/plugins/kiro/skills/funpixel-mobile-ui/references/recipes.md +279 -0
- package/plugins/kiro/skills/funpixel-mobile-ui/references/restyle-ui.md +229 -0
- package/plugins/kiro/skills/funpixel-mobile-ui/references/unity.md +61 -0
- package/plugins/kiro/skills/funpixel-publish/SKILL.md +109 -0
- package/plugins/kiro/skills/funpixel-publish/references/compose.md +113 -0
- package/plugins/kiro/skills/funpixel-publish/references/motion.md +120 -0
- package/plugins/kiro/skills/funpixel-publish/references/networks.md +75 -0
- package/plugins/kiro/skills/funpixel-publish/references/other-hosts.md +65 -0
- package/plugins/kiro/skills/funpixel-publish/references/playable-ad.md +90 -0
- package/plugins/kiro/skills/funpixel-publish/references/server-build.md +85 -0
- package/plugins/kiro/skills/funpixel-publish/references/store-shots.md +85 -0
- package/plugins/kiro/skills/funpixel-publish/references/trailer.md +55 -0
- package/plugins/kiro/skills/funpixel-publish/references/what-ships.md +30 -0
- package/plugins/kiro/skills/funpixel-store/SKILL.md +81 -0
- package/plugins/kiro/skills/funpixel-store/references/app-store.md +73 -0
- package/plugins/kiro/skills/funpixel-store/references/google-play.md +141 -0
- package/plugins/kiro/skills/funpixel-store/references/ios-release.md +63 -0
- package/plugins/kiro/skills/funpixel-store/references/money.md +66 -0
- package/plugins/kiro/skills/funpixel-store/references/purchases-and-review.md +74 -0
- package/plugins/kiro/skills/funpixel-store/references/readiness-page.md +24 -0
- package/plugins/kiro/skills/funpixel-store/references/readiness.md +107 -0
- package/plugins/kiro/skills/funpixel-store/references/steam.md +38 -0
- package/plugins/kiro/skills/funpixel-store/references/unity-store.md +55 -0
- package/plugins/kiro/skills/funpixel-store/references/web-portals.md +43 -0
- package/plugins/kiro/skills/funpixel-unity-game/SKILL.md +103 -0
- package/plugins/kiro/skills/funpixel-unity-game/references/agent-ops.md +54 -0
- package/plugins/kiro/skills/funpixel-unity-game/references/fixes.md +40 -0
- package/plugins/kiro/skills/funpixel-unity-game/references/from-a-web-game.md +108 -0
- package/plugins/kiro/skills/funpixel-unity-game/references/handing-off.md +42 -0
- package/plugins/kiro/skills/funpixel-unity-game/references/performance.md +59 -0
- package/plugins/kiro/skills/funpixel-unity-game/references/probe.md +80 -0
- package/plugins/kiro/skills/funpixel-unity-game/references/shared-mac.md +121 -0
- package/plugins/kiro/skills/funpixel-unity-game/references/traps.md +108 -0
- package/plugins/kiro/skills/funpixel-verify/SKILL.md +109 -0
- package/plugins/kiro/skills/funpixel-verify/references/actors.md +94 -0
- package/plugins/kiro/skills/funpixel-verify/references/bar.md +62 -0
- package/plugins/kiro/skills/funpixel-verify/references/checks.md +69 -0
- package/plugins/kiro/skills/funpixel-verify/references/experience.md +67 -0
- package/plugins/kiro/skills/funpixel-verify/references/eyes.md +54 -0
- package/plugins/kiro/skills/funpixel-verify/references/fidelity.md +126 -0
- package/plugins/kiro/skills/funpixel-verify/references/hit-bar.md +31 -0
- package/plugins/kiro/skills/funpixel-verify/references/journeys.md +77 -0
- package/plugins/kiro/skills/funpixel-verify/references/mobile-qa.md +123 -0
- package/plugins/kiro/skills/funpixel-verify/references/playtest.md +161 -0
- package/plugins/kiro/skills/funpixel-verify/references/review.md +105 -0
- package/plugins/kiro/skills/funpixel-verify/references/rubric.md +67 -0
- package/plugins/kiro/skills/funpixel-verify/references/scenes.md +49 -0
- package/plugins/kiro/skills/funpixel-verify/references/unity.md +60 -0
- package/plugins/kiro/skills/funpixel-world-and-story/SKILL.md +99 -0
- package/plugins/kiro/skills/funpixel-world-and-story/references/atmosphere.md +208 -0
- package/plugins/kiro/skills/funpixel-world-and-story/references/forged-world.md +79 -0
- package/plugins/kiro/skills/funpixel-world-and-story/references/living-world.md +237 -0
- package/plugins/kiro/skills/funpixel-world-and-story/references/opening-and-chapters.md +215 -0
- package/plugins/kiro/skills/funpixel-world-and-story/references/shelf.md +80 -0
- package/plugins/kiro/skills/funpixel-world-and-story/references/story-at-size.md +159 -0
- package/plugins/kiro/skills/funpixel-world-and-story/references/voice.md +175 -0
- package/plugins/kiro/skills/funpixel-world-and-story/references/world-kit.md +154 -0
- package/plugins/robin/LICENSE +115 -0
- package/plugins/robin/README.md +27 -0
- package/plugins/robin/THIRD_PARTY_NOTICES.md +75 -0
- package/plugins/robin/claude/.claude-plugin/plugin.json +19 -0
- package/plugins/robin/claude/.mcp.json +10 -0
- package/plugins/robin/claude/LICENSE +115 -0
- package/plugins/robin/claude/README.md +14 -0
- package/plugins/robin/claude/THIRD_PARTY_NOTICES.md +75 -0
- package/plugins/robin/claude/agents/art-director.md +54 -0
- package/plugins/robin/claude/agents/audio-director.md +51 -0
- package/plugins/robin/claude/agents/critic.md +113 -0
- package/plugins/robin/claude/agents/lane.md +38 -0
- package/plugins/robin/claude/agents/level-designer.md +45 -0
- package/plugins/robin/claude/agents/mobile-qa.md +71 -0
- package/plugins/robin/claude/agents/player.md +144 -0
- package/plugins/robin/claude/agents/qa-lead.md +52 -0
- package/plugins/robin/claude/commands/first-look.md +59 -0
- package/plugins/robin/claude/commands/flow.md +50 -0
- package/plugins/robin/claude/commands/lanes.md +38 -0
- package/plugins/robin/claude/commands/mobile-qa.md +28 -0
- package/plugins/robin/claude/commands/new.md +94 -0
- package/plugins/robin/claude/commands/playtest.md +66 -0
- package/plugins/robin/claude/commands/publish.md +23 -0
- package/plugins/robin/claude/commands/smoke-build.md +25 -0
- package/plugins/robin/claude/commands/verify.md +20 -0
- package/plugins/robin/claude/hooks/brief.md +135 -0
- package/plugins/robin/claude/hooks/critic-receipts.mjs +86 -0
- package/plugins/robin/claude/hooks/durable.mjs +56 -0
- package/plugins/robin/claude/hooks/fence.mjs +30 -0
- package/plugins/robin/claude/hooks/floors.mjs +181 -0
- package/plugins/robin/claude/hooks/flow.mjs +154 -0
- package/plugins/robin/claude/hooks/front-door.mjs +68 -0
- package/plugins/robin/claude/hooks/guidance.json +3 -0
- package/plugins/robin/claude/hooks/hints.mjs +183 -0
- package/plugins/robin/claude/hooks/hooks.json +62 -0
- package/plugins/robin/claude/hooks/lib.mjs +362 -0
- package/plugins/robin/claude/hooks/memory.mjs +92 -0
- package/plugins/robin/claude/hooks/mobile-qa.mjs +43 -0
- package/plugins/robin/claude/hooks/note.mjs +63 -0
- package/plugins/robin/claude/hooks/nudge.mjs +98 -0
- package/plugins/robin/claude/hooks/pipeline.mjs +207 -0
- package/plugins/robin/claude/hooks/prompt.mjs +51 -0
- package/plugins/robin/claude/hooks/quality.mjs +310 -0
- package/plugins/robin/claude/hooks/reach.mjs +93 -0
- package/plugins/robin/claude/hooks/scope.mjs +44 -0
- package/plugins/robin/claude/hooks/session-log.mjs +101 -0
- package/plugins/robin/claude/hooks/session-start.mjs +194 -0
- package/plugins/robin/claude/hooks/skill-names.json +19 -0
- package/plugins/robin/claude/hooks/stop-gate.mjs +303 -0
- package/plugins/robin/claude/hooks/vendor/direct/round.mjs +81 -0
- package/plugins/robin/claude/hooks/vendor/find/names.mjs +46 -0
- package/plugins/robin/claude/hooks/vendor/firstlook/set.mjs +219 -0
- package/plugins/robin/claude/hooks/vendor/flow/flow.mjs +456 -0
- package/plugins/robin/claude/hooks/vendor/flow/look.mjs +140 -0
- package/plugins/robin/claude/hooks/vendor/gdd/book.mjs +484 -0
- package/plugins/robin/claude/hooks/vendor/gdd/chapters.mjs +72 -0
- package/plugins/robin/claude/hooks/vendor/gdd/doc.mjs +33 -0
- package/plugins/robin/claude/hooks/vendor/gdd/levelmap.mjs +429 -0
- package/plugins/robin/claude/hooks/vendor/gdd/rubric.mjs +251 -0
- package/plugins/robin/claude/hooks/vendor/gdd/worth.mjs +508 -0
- package/plugins/robin/claude/hooks/vendor/lanes/fence.mjs +109 -0
- package/plugins/robin/claude/hooks/vendor/lanes/lanes.mjs +356 -0
- package/plugins/robin/claude/hooks/vendor/lanes/union.mjs +63 -0
- package/plugins/robin/claude/hooks/vendor/lessons/motifs.mjs +98 -0
- package/plugins/robin/claude/hooks/vendor/lessons/store.mjs +57 -0
- package/plugins/robin/claude/hooks/vendor/look/made-of.mjs +243 -0
- package/plugins/robin/claude/hooks/vendor/look/roles.mjs +110 -0
- package/plugins/robin/claude/hooks/vendor/memory/decisions.mjs +139 -0
- package/plugins/robin/claude/hooks/vendor/memory/journal.mjs +109 -0
- package/plugins/robin/claude/hooks/vendor/owner/bar.mjs +286 -0
- package/plugins/robin/claude/hooks/vendor/pipeline/pipeline.mjs +930 -0
- package/plugins/robin/claude/hooks/vendor/playtest/keep.mjs +111 -0
- package/plugins/robin/claude/hooks/vendor/playtest/stuck.mjs +48 -0
- package/plugins/robin/claude/hooks/vendor/progress/holds.mjs +107 -0
- package/plugins/robin/claude/hooks/vendor/progress/progress.mjs +301 -0
- package/plugins/robin/claude/hooks/vendor/sim/judge.mjs +241 -0
- package/plugins/robin/claude/hooks/vendor/spec/rooms.mjs +189 -0
- package/plugins/robin/claude/hooks/vendor/spec/tunables.mjs +75 -0
- package/plugins/robin/claude/hooks/vendor/stage/harnessignore.mjs +91 -0
- package/plugins/robin/claude/hooks/vendor/stage/stage.mjs +58 -0
- package/plugins/robin/claude/hooks/vendor/status/board.mjs +173 -0
- package/plugins/robin/claude/hooks/vendor/status/file.mjs +113 -0
- package/plugins/robin/claude/hooks/vendor/studio/forks.mjs +94 -0
- package/plugins/robin/claude/hooks/vendor/studio/pitch.mjs +295 -0
- package/plugins/robin/claude/hooks/vendor/verify/fingerprint.mjs +73 -0
- package/plugins/robin/claude/hooks/vendor/verify/reads.mjs +33 -0
- package/plugins/robin/claude/hooks/vendor/wow/picks.mjs +75 -0
- package/plugins/robin/claude/skills/3d/SKILL.md +89 -0
- package/plugins/robin/claude/skills/3d/references/bake-off.md +48 -0
- package/plugins/robin/claude/skills/3d/references/bench.md +103 -0
- package/plugins/robin/claude/skills/3d/references/budgets.md +48 -0
- package/plugins/robin/claude/skills/3d/references/characters.md +67 -0
- package/plugins/robin/claude/skills/3d/references/concept-image.md +47 -0
- package/plugins/robin/claude/skills/3d/references/engine-targets.md +31 -0
- package/plugins/robin/claude/skills/3d/references/hero-route.md +104 -0
- package/plugins/robin/claude/skills/3d/references/level-spec.md +109 -0
- package/plugins/robin/claude/skills/3d/references/levels.md +84 -0
- package/plugins/robin/claude/skills/3d/references/light-and-places.md +141 -0
- package/plugins/robin/claude/skills/3d/references/models.md +111 -0
- package/plugins/robin/claude/skills/3d/references/painted-target.md +184 -0
- package/plugins/robin/claude/skills/3d/references/reading.md +41 -0
- package/plugins/robin/claude/skills/3d/references/skin.md +85 -0
- package/plugins/robin/claude/skills/3d/references/skyboxes.md +65 -0
- package/plugins/robin/claude/skills/3d/references/textures.md +71 -0
- package/plugins/robin/claude/skills/3d/references/three-loading.md +199 -0
- package/plugins/robin/claude/skills/3d/references/unity.md +78 -0
- package/plugins/robin/claude/skills/art/SKILL.md +104 -0
- package/plugins/robin/claude/skills/art/references/2d-assets.md +108 -0
- package/plugins/robin/claude/skills/art/references/animation.md +126 -0
- package/plugins/robin/claude/skills/art/references/cast.md +73 -0
- package/plugins/robin/claude/skills/art/references/characters.md +49 -0
- package/plugins/robin/claude/skills/art/references/cost.md +107 -0
- package/plugins/robin/claude/skills/art/references/effects.md +85 -0
- package/plugins/robin/claude/skills/art/references/frames.md +87 -0
- package/plugins/robin/claude/skills/art/references/judging-frames.md +64 -0
- package/plugins/robin/claude/skills/art/references/look.md +102 -0
- package/plugins/robin/claude/skills/art/references/measure.md +119 -0
- package/plugins/robin/claude/skills/art/references/pipeline.md +185 -0
- package/plugins/robin/claude/skills/art/references/pixi.md +277 -0
- package/plugins/robin/claude/skills/art/references/planes.md +27 -0
- package/plugins/robin/claude/skills/art/references/prompts.md +171 -0
- package/plugins/robin/claude/skills/art/references/sheets.md +141 -0
- package/plugins/robin/claude/skills/art/references/style-file.md +39 -0
- package/plugins/robin/claude/skills/art/references/three.md +232 -0
- package/plugins/robin/claude/skills/art/references/ui.md +163 -0
- package/plugins/robin/claude/skills/art/references/unity.md +78 -0
- package/plugins/robin/claude/skills/art/references/wiring.md +41 -0
- package/plugins/robin/claude/skills/audio/SKILL.md +92 -0
- package/plugins/robin/claude/skills/audio/references/adaptive-music.md +204 -0
- package/plugins/robin/claude/skills/audio/references/engine.md +78 -0
- package/plugins/robin/claude/skills/audio/references/measure.md +101 -0
- package/plugins/robin/claude/skills/audio/references/unity.md +74 -0
- package/plugins/robin/claude/skills/feedback/SKILL.md +120 -0
- package/plugins/robin/claude/skills/feedback/references/memory.md +99 -0
- package/plugins/robin/claude/skills/game-feel/SKILL.md +104 -0
- package/plugins/robin/claude/skills/game-feel/references/contact.md +110 -0
- package/plugins/robin/claude/skills/game-feel/references/measure.md +125 -0
- package/plugins/robin/claude/skills/game-feel/references/motion.md +134 -0
- package/plugins/robin/claude/skills/game-feel/references/payoffs.md +35 -0
- package/plugins/robin/claude/skills/game-feel/references/recipes.md +107 -0
- package/plugins/robin/claude/skills/game-feel/references/unity.md +73 -0
- package/plugins/robin/claude/skills/game-logic/SKILL.md +113 -0
- package/plugins/robin/claude/skills/game-logic/references/balance.md +88 -0
- package/plugins/robin/claude/skills/game-logic/references/content-at-scale.md +147 -0
- package/plugins/robin/claude/skills/game-logic/references/depth.md +89 -0
- package/plugins/robin/claude/skills/game-logic/references/escalation.md +41 -0
- package/plugins/robin/claude/skills/game-logic/references/levels.md +61 -0
- package/plugins/robin/claude/skills/game-logic/references/probes.md +122 -0
- package/plugins/robin/claude/skills/game-logic/references/unity.md +108 -0
- package/plugins/robin/claude/skills/game-spine/SKILL.md +118 -0
- package/plugins/robin/claude/skills/game-spine/references/camera.md +94 -0
- package/plugins/robin/claude/skills/game-spine/references/multiplayer.md +101 -0
- package/plugins/robin/claude/skills/game-spine/references/patterns.md +103 -0
- package/plugins/robin/claude/skills/game-spine/references/performance.md +96 -0
- package/plugins/robin/claude/skills/game-spine/references/pixi.md +26 -0
- package/plugins/robin/claude/skills/game-spine/references/replay.md +102 -0
- package/plugins/robin/claude/skills/game-spine/references/room-api.md +63 -0
- package/plugins/robin/claude/skills/game-spine/references/room-modes.md +40 -0
- package/plugins/robin/claude/skills/game-spine/references/sdk.md +114 -0
- package/plugins/robin/claude/skills/game-spine/references/three.md +62 -0
- package/plugins/robin/claude/skills/gdd/SKILL.md +116 -0
- package/plugins/robin/claude/skills/gdd/references/as-built.md +40 -0
- package/plugins/robin/claude/skills/gdd/references/design-measures.md +24 -0
- package/plugins/robin/claude/skills/gdd/references/design-note.md +88 -0
- package/plugins/robin/claude/skills/gdd/references/experience.md +92 -0
- package/plugins/robin/claude/skills/gdd/references/first-look.md +226 -0
- package/plugins/robin/claude/skills/gdd/references/floors.md +62 -0
- package/plugins/robin/claude/skills/gdd/references/frame.md +75 -0
- package/plugins/robin/claude/skills/gdd/references/gameplay-contract.md +81 -0
- package/plugins/robin/claude/skills/gdd/references/gdd-template.md +417 -0
- package/plugins/robin/claude/skills/gdd/references/genre-card.md +109 -0
- package/plugins/robin/claude/skills/gdd/references/genre-platformer.md +159 -0
- package/plugins/robin/claude/skills/gdd/references/genre-puzzle.md +145 -0
- package/plugins/robin/claude/skills/gdd/references/genre-racing.md +137 -0
- package/plugins/robin/claude/skills/gdd/references/genre-rpg.md +125 -0
- package/plugins/robin/claude/skills/gdd/references/genre-shooter.md +128 -0
- package/plugins/robin/claude/skills/gdd/references/genre-simulation.md +112 -0
- package/plugins/robin/claude/skills/gdd/references/genre-strategy.md +116 -0
- package/plugins/robin/claude/skills/gdd/references/genre-survival.md +122 -0
- package/plugins/robin/claude/skills/gdd/references/in-the-loop.md +106 -0
- package/plugins/robin/claude/skills/gdd/references/invent-first.md +131 -0
- package/plugins/robin/claude/skills/gdd/references/level-and-fun.md +112 -0
- package/plugins/robin/claude/skills/gdd/references/pages.md +47 -0
- package/plugins/robin/claude/skills/gdd/references/plan-at-size.md +140 -0
- package/plugins/robin/claude/skills/gdd/references/production-tiers.md +117 -0
- package/plugins/robin/claude/skills/gdd/references/sections.md +148 -0
- package/plugins/robin/claude/skills/gdd/references/spec-folder.md +131 -0
- package/plugins/robin/claude/skills/gdd/references/start.md +110 -0
- package/plugins/robin/claude/skills/gdd/references/starters.md +175 -0
- package/plugins/robin/claude/skills/gdd/references/the-path.md +133 -0
- package/plugins/robin/claude/skills/gdd/references/track.md +29 -0
- package/plugins/robin/claude/skills/gdd/references/world-and-identity.md +165 -0
- package/plugins/robin/claude/skills/gdd/references/worth.md +74 -0
- package/plugins/robin/claude/skills/mobile-ui/SKILL.md +107 -0
- package/plugins/robin/claude/skills/mobile-ui/references/contrast.md +123 -0
- package/plugins/robin/claude/skills/mobile-ui/references/hud-and-title.md +108 -0
- package/plugins/robin/claude/skills/mobile-ui/references/hud-genres.md +124 -0
- package/plugins/robin/claude/skills/mobile-ui/references/phone-check.md +156 -0
- package/plugins/robin/claude/skills/mobile-ui/references/recipes.md +279 -0
- package/plugins/robin/claude/skills/mobile-ui/references/restyle-ui.md +229 -0
- package/plugins/robin/claude/skills/mobile-ui/references/unity.md +61 -0
- package/plugins/robin/claude/skills/publishing/SKILL.md +109 -0
- package/plugins/robin/claude/skills/publishing/references/compose.md +113 -0
- package/plugins/robin/claude/skills/publishing/references/motion.md +120 -0
- package/plugins/robin/claude/skills/publishing/references/networks.md +75 -0
- package/plugins/robin/claude/skills/publishing/references/other-hosts.md +65 -0
- package/plugins/robin/claude/skills/publishing/references/playable-ad.md +90 -0
- package/plugins/robin/claude/skills/publishing/references/server-build.md +85 -0
- package/plugins/robin/claude/skills/publishing/references/store-shots.md +85 -0
- package/plugins/robin/claude/skills/publishing/references/trailer.md +55 -0
- package/plugins/robin/claude/skills/publishing/references/what-ships.md +30 -0
- package/plugins/robin/claude/skills/store/SKILL.md +81 -0
- package/plugins/robin/claude/skills/store/references/app-store.md +73 -0
- package/plugins/robin/claude/skills/store/references/google-play.md +141 -0
- package/plugins/robin/claude/skills/store/references/ios-release.md +63 -0
- package/plugins/robin/claude/skills/store/references/money.md +66 -0
- package/plugins/robin/claude/skills/store/references/purchases-and-review.md +74 -0
- package/plugins/robin/claude/skills/store/references/readiness-page.md +24 -0
- package/plugins/robin/claude/skills/store/references/readiness.md +107 -0
- package/plugins/robin/claude/skills/store/references/steam.md +38 -0
- package/plugins/robin/claude/skills/store/references/unity-store.md +55 -0
- package/plugins/robin/claude/skills/store/references/web-portals.md +43 -0
- package/plugins/robin/claude/skills/unity-game/SKILL.md +103 -0
- package/plugins/robin/claude/skills/unity-game/references/agent-ops.md +54 -0
- package/plugins/robin/claude/skills/unity-game/references/fixes.md +40 -0
- package/plugins/robin/claude/skills/unity-game/references/from-a-web-game.md +108 -0
- package/plugins/robin/claude/skills/unity-game/references/handing-off.md +42 -0
- package/plugins/robin/claude/skills/unity-game/references/performance.md +59 -0
- package/plugins/robin/claude/skills/unity-game/references/probe.md +80 -0
- package/plugins/robin/claude/skills/unity-game/references/shared-mac.md +121 -0
- package/plugins/robin/claude/skills/unity-game/references/traps.md +108 -0
- package/plugins/robin/claude/skills/verifying/SKILL.md +109 -0
- package/plugins/robin/claude/skills/verifying/references/actors.md +94 -0
- package/plugins/robin/claude/skills/verifying/references/bar.md +62 -0
- package/plugins/robin/claude/skills/verifying/references/checks.md +69 -0
- package/plugins/robin/claude/skills/verifying/references/experience.md +67 -0
- package/plugins/robin/claude/skills/verifying/references/eyes.md +54 -0
- package/plugins/robin/claude/skills/verifying/references/fidelity.md +126 -0
- package/plugins/robin/claude/skills/verifying/references/hit-bar.md +31 -0
- package/plugins/robin/claude/skills/verifying/references/journeys.md +77 -0
- package/plugins/robin/claude/skills/verifying/references/mobile-qa.md +123 -0
- package/plugins/robin/claude/skills/verifying/references/playtest.md +161 -0
- package/plugins/robin/claude/skills/verifying/references/review.md +105 -0
- package/plugins/robin/claude/skills/verifying/references/rubric.md +67 -0
- package/plugins/robin/claude/skills/verifying/references/scenes.md +49 -0
- package/plugins/robin/claude/skills/verifying/references/unity.md +60 -0
- package/plugins/robin/claude/skills/world-and-story/SKILL.md +99 -0
- package/plugins/robin/claude/skills/world-and-story/references/atmosphere.md +208 -0
- package/plugins/robin/claude/skills/world-and-story/references/forged-world.md +79 -0
- package/plugins/robin/claude/skills/world-and-story/references/living-world.md +237 -0
- package/plugins/robin/claude/skills/world-and-story/references/opening-and-chapters.md +215 -0
- package/plugins/robin/claude/skills/world-and-story/references/shelf.md +80 -0
- package/plugins/robin/claude/skills/world-and-story/references/story-at-size.md +159 -0
- package/plugins/robin/claude/skills/world-and-story/references/voice.md +175 -0
- package/plugins/robin/claude/skills/world-and-story/references/world-kit.md +154 -0
- package/plugins/robin/mcp-servers.json +25 -0
- package/plugins/robin/plugin.json +20 -0
- package/plugins/robin/skills/fp-first-look/SKILL.md +59 -0
- package/plugins/robin/skills/fp-flow/SKILL.md +50 -0
- package/plugins/robin/skills/fp-lanes/SKILL.md +38 -0
- package/plugins/robin/skills/fp-mobile-qa/SKILL.md +28 -0
- package/plugins/robin/skills/fp-new/SKILL.md +94 -0
- package/plugins/robin/skills/fp-playtest/SKILL.md +66 -0
- package/plugins/robin/skills/fp-publish/SKILL.md +23 -0
- package/plugins/robin/skills/fp-smoke-build/SKILL.md +25 -0
- package/plugins/robin/skills/fp-verify/SKILL.md +20 -0
- package/plugins/robin/skills/funpixel-3d/SKILL.md +89 -0
- package/plugins/robin/skills/funpixel-3d/references/bake-off.md +48 -0
- package/plugins/robin/skills/funpixel-3d/references/bench.md +103 -0
- package/plugins/robin/skills/funpixel-3d/references/budgets.md +48 -0
- package/plugins/robin/skills/funpixel-3d/references/characters.md +67 -0
- package/plugins/robin/skills/funpixel-3d/references/concept-image.md +47 -0
- package/plugins/robin/skills/funpixel-3d/references/engine-targets.md +31 -0
- package/plugins/robin/skills/funpixel-3d/references/hero-route.md +104 -0
- package/plugins/robin/skills/funpixel-3d/references/level-spec.md +109 -0
- package/plugins/robin/skills/funpixel-3d/references/levels.md +84 -0
- package/plugins/robin/skills/funpixel-3d/references/light-and-places.md +141 -0
- package/plugins/robin/skills/funpixel-3d/references/models.md +111 -0
- package/plugins/robin/skills/funpixel-3d/references/painted-target.md +184 -0
- package/plugins/robin/skills/funpixel-3d/references/reading.md +41 -0
- package/plugins/robin/skills/funpixel-3d/references/skin.md +85 -0
- package/plugins/robin/skills/funpixel-3d/references/skyboxes.md +65 -0
- package/plugins/robin/skills/funpixel-3d/references/textures.md +71 -0
- package/plugins/robin/skills/funpixel-3d/references/three-loading.md +199 -0
- package/plugins/robin/skills/funpixel-3d/references/unity.md +78 -0
- package/plugins/robin/skills/funpixel-art/SKILL.md +104 -0
- package/plugins/robin/skills/funpixel-art/references/2d-assets.md +108 -0
- package/plugins/robin/skills/funpixel-art/references/animation.md +126 -0
- package/plugins/robin/skills/funpixel-art/references/cast.md +73 -0
- package/plugins/robin/skills/funpixel-art/references/characters.md +49 -0
- package/plugins/robin/skills/funpixel-art/references/cost.md +107 -0
- package/plugins/robin/skills/funpixel-art/references/effects.md +85 -0
- package/plugins/robin/skills/funpixel-art/references/frames.md +87 -0
- package/plugins/robin/skills/funpixel-art/references/judging-frames.md +64 -0
- package/plugins/robin/skills/funpixel-art/references/look.md +102 -0
- package/plugins/robin/skills/funpixel-art/references/measure.md +119 -0
- package/plugins/robin/skills/funpixel-art/references/pipeline.md +185 -0
- package/plugins/robin/skills/funpixel-art/references/pixi.md +277 -0
- package/plugins/robin/skills/funpixel-art/references/planes.md +27 -0
- package/plugins/robin/skills/funpixel-art/references/prompts.md +171 -0
- package/plugins/robin/skills/funpixel-art/references/sheets.md +141 -0
- package/plugins/robin/skills/funpixel-art/references/style-file.md +39 -0
- package/plugins/robin/skills/funpixel-art/references/three.md +232 -0
- package/plugins/robin/skills/funpixel-art/references/ui.md +163 -0
- package/plugins/robin/skills/funpixel-art/references/unity.md +78 -0
- package/plugins/robin/skills/funpixel-art/references/wiring.md +41 -0
- package/plugins/robin/skills/funpixel-audio/SKILL.md +92 -0
- package/plugins/robin/skills/funpixel-audio/references/adaptive-music.md +204 -0
- package/plugins/robin/skills/funpixel-audio/references/engine.md +78 -0
- package/plugins/robin/skills/funpixel-audio/references/measure.md +101 -0
- package/plugins/robin/skills/funpixel-audio/references/unity.md +74 -0
- package/plugins/robin/skills/funpixel-brief/SKILL.md +163 -0
- package/plugins/robin/skills/funpixel-feedback/SKILL.md +120 -0
- package/plugins/robin/skills/funpixel-feedback/references/memory.md +99 -0
- package/plugins/robin/skills/funpixel-game-feel/SKILL.md +104 -0
- package/plugins/robin/skills/funpixel-game-feel/references/contact.md +110 -0
- package/plugins/robin/skills/funpixel-game-feel/references/measure.md +125 -0
- package/plugins/robin/skills/funpixel-game-feel/references/motion.md +134 -0
- package/plugins/robin/skills/funpixel-game-feel/references/payoffs.md +35 -0
- package/plugins/robin/skills/funpixel-game-feel/references/recipes.md +107 -0
- package/plugins/robin/skills/funpixel-game-feel/references/unity.md +73 -0
- package/plugins/robin/skills/funpixel-game-logic/SKILL.md +113 -0
- package/plugins/robin/skills/funpixel-game-logic/references/balance.md +88 -0
- package/plugins/robin/skills/funpixel-game-logic/references/content-at-scale.md +147 -0
- package/plugins/robin/skills/funpixel-game-logic/references/depth.md +89 -0
- package/plugins/robin/skills/funpixel-game-logic/references/escalation.md +41 -0
- package/plugins/robin/skills/funpixel-game-logic/references/levels.md +61 -0
- package/plugins/robin/skills/funpixel-game-logic/references/probes.md +122 -0
- package/plugins/robin/skills/funpixel-game-logic/references/unity.md +108 -0
- package/plugins/robin/skills/funpixel-game-spine/SKILL.md +118 -0
- package/plugins/robin/skills/funpixel-game-spine/references/camera.md +94 -0
- package/plugins/robin/skills/funpixel-game-spine/references/multiplayer.md +101 -0
- package/plugins/robin/skills/funpixel-game-spine/references/patterns.md +103 -0
- package/plugins/robin/skills/funpixel-game-spine/references/performance.md +96 -0
- package/plugins/robin/skills/funpixel-game-spine/references/pixi.md +26 -0
- package/plugins/robin/skills/funpixel-game-spine/references/replay.md +102 -0
- package/plugins/robin/skills/funpixel-game-spine/references/room-api.md +63 -0
- package/plugins/robin/skills/funpixel-game-spine/references/room-modes.md +40 -0
- package/plugins/robin/skills/funpixel-game-spine/references/sdk.md +114 -0
- package/plugins/robin/skills/funpixel-game-spine/references/three.md +62 -0
- package/plugins/robin/skills/funpixel-gdd/SKILL.md +116 -0
- package/plugins/robin/skills/funpixel-gdd/references/as-built.md +40 -0
- package/plugins/robin/skills/funpixel-gdd/references/design-measures.md +24 -0
- package/plugins/robin/skills/funpixel-gdd/references/design-note.md +88 -0
- package/plugins/robin/skills/funpixel-gdd/references/experience.md +92 -0
- package/plugins/robin/skills/funpixel-gdd/references/first-look.md +226 -0
- package/plugins/robin/skills/funpixel-gdd/references/floors.md +62 -0
- package/plugins/robin/skills/funpixel-gdd/references/frame.md +75 -0
- package/plugins/robin/skills/funpixel-gdd/references/gameplay-contract.md +81 -0
- package/plugins/robin/skills/funpixel-gdd/references/gdd-template.md +417 -0
- package/plugins/robin/skills/funpixel-gdd/references/genre-card.md +109 -0
- package/plugins/robin/skills/funpixel-gdd/references/genre-platformer.md +159 -0
- package/plugins/robin/skills/funpixel-gdd/references/genre-puzzle.md +145 -0
- package/plugins/robin/skills/funpixel-gdd/references/genre-racing.md +137 -0
- package/plugins/robin/skills/funpixel-gdd/references/genre-rpg.md +125 -0
- package/plugins/robin/skills/funpixel-gdd/references/genre-shooter.md +128 -0
- package/plugins/robin/skills/funpixel-gdd/references/genre-simulation.md +112 -0
- package/plugins/robin/skills/funpixel-gdd/references/genre-strategy.md +116 -0
- package/plugins/robin/skills/funpixel-gdd/references/genre-survival.md +122 -0
- package/plugins/robin/skills/funpixel-gdd/references/in-the-loop.md +106 -0
- package/plugins/robin/skills/funpixel-gdd/references/invent-first.md +131 -0
- package/plugins/robin/skills/funpixel-gdd/references/level-and-fun.md +112 -0
- package/plugins/robin/skills/funpixel-gdd/references/pages.md +47 -0
- package/plugins/robin/skills/funpixel-gdd/references/plan-at-size.md +140 -0
- package/plugins/robin/skills/funpixel-gdd/references/production-tiers.md +117 -0
- package/plugins/robin/skills/funpixel-gdd/references/sections.md +148 -0
- package/plugins/robin/skills/funpixel-gdd/references/spec-folder.md +131 -0
- package/plugins/robin/skills/funpixel-gdd/references/start.md +110 -0
- package/plugins/robin/skills/funpixel-gdd/references/starters.md +175 -0
- package/plugins/robin/skills/funpixel-gdd/references/the-path.md +133 -0
- package/plugins/robin/skills/funpixel-gdd/references/track.md +29 -0
- package/plugins/robin/skills/funpixel-gdd/references/world-and-identity.md +165 -0
- package/plugins/robin/skills/funpixel-gdd/references/worth.md +74 -0
- package/plugins/robin/skills/funpixel-mobile-ui/SKILL.md +107 -0
- package/plugins/robin/skills/funpixel-mobile-ui/references/contrast.md +123 -0
- package/plugins/robin/skills/funpixel-mobile-ui/references/hud-and-title.md +108 -0
- package/plugins/robin/skills/funpixel-mobile-ui/references/hud-genres.md +124 -0
- package/plugins/robin/skills/funpixel-mobile-ui/references/phone-check.md +156 -0
- package/plugins/robin/skills/funpixel-mobile-ui/references/recipes.md +279 -0
- package/plugins/robin/skills/funpixel-mobile-ui/references/restyle-ui.md +229 -0
- package/plugins/robin/skills/funpixel-mobile-ui/references/unity.md +61 -0
- package/plugins/robin/skills/funpixel-publish/SKILL.md +109 -0
- package/plugins/robin/skills/funpixel-publish/references/compose.md +113 -0
- package/plugins/robin/skills/funpixel-publish/references/motion.md +120 -0
- package/plugins/robin/skills/funpixel-publish/references/networks.md +75 -0
- package/plugins/robin/skills/funpixel-publish/references/other-hosts.md +65 -0
- package/plugins/robin/skills/funpixel-publish/references/playable-ad.md +90 -0
- package/plugins/robin/skills/funpixel-publish/references/server-build.md +85 -0
- package/plugins/robin/skills/funpixel-publish/references/store-shots.md +85 -0
- package/plugins/robin/skills/funpixel-publish/references/trailer.md +55 -0
- package/plugins/robin/skills/funpixel-publish/references/what-ships.md +30 -0
- package/plugins/robin/skills/funpixel-store/SKILL.md +81 -0
- package/plugins/robin/skills/funpixel-store/references/app-store.md +73 -0
- package/plugins/robin/skills/funpixel-store/references/google-play.md +141 -0
- package/plugins/robin/skills/funpixel-store/references/ios-release.md +63 -0
- package/plugins/robin/skills/funpixel-store/references/money.md +66 -0
- package/plugins/robin/skills/funpixel-store/references/purchases-and-review.md +74 -0
- package/plugins/robin/skills/funpixel-store/references/readiness-page.md +24 -0
- package/plugins/robin/skills/funpixel-store/references/readiness.md +107 -0
- package/plugins/robin/skills/funpixel-store/references/steam.md +38 -0
- package/plugins/robin/skills/funpixel-store/references/unity-store.md +55 -0
- package/plugins/robin/skills/funpixel-store/references/web-portals.md +43 -0
- package/plugins/robin/skills/funpixel-unity-game/SKILL.md +103 -0
- package/plugins/robin/skills/funpixel-unity-game/references/agent-ops.md +54 -0
- package/plugins/robin/skills/funpixel-unity-game/references/fixes.md +40 -0
- package/plugins/robin/skills/funpixel-unity-game/references/from-a-web-game.md +108 -0
- package/plugins/robin/skills/funpixel-unity-game/references/handing-off.md +42 -0
- package/plugins/robin/skills/funpixel-unity-game/references/performance.md +59 -0
- package/plugins/robin/skills/funpixel-unity-game/references/probe.md +80 -0
- package/plugins/robin/skills/funpixel-unity-game/references/shared-mac.md +121 -0
- package/plugins/robin/skills/funpixel-unity-game/references/traps.md +108 -0
- package/plugins/robin/skills/funpixel-verify/SKILL.md +109 -0
- package/plugins/robin/skills/funpixel-verify/references/actors.md +94 -0
- package/plugins/robin/skills/funpixel-verify/references/bar.md +62 -0
- package/plugins/robin/skills/funpixel-verify/references/checks.md +69 -0
- package/plugins/robin/skills/funpixel-verify/references/experience.md +67 -0
- package/plugins/robin/skills/funpixel-verify/references/eyes.md +54 -0
- package/plugins/robin/skills/funpixel-verify/references/fidelity.md +126 -0
- package/plugins/robin/skills/funpixel-verify/references/hit-bar.md +31 -0
- package/plugins/robin/skills/funpixel-verify/references/journeys.md +77 -0
- package/plugins/robin/skills/funpixel-verify/references/mobile-qa.md +123 -0
- package/plugins/robin/skills/funpixel-verify/references/playtest.md +161 -0
- package/plugins/robin/skills/funpixel-verify/references/review.md +105 -0
- package/plugins/robin/skills/funpixel-verify/references/rubric.md +67 -0
- package/plugins/robin/skills/funpixel-verify/references/scenes.md +49 -0
- package/plugins/robin/skills/funpixel-verify/references/unity.md +60 -0
- package/plugins/robin/skills/funpixel-world-and-story/SKILL.md +99 -0
- package/plugins/robin/skills/funpixel-world-and-story/references/atmosphere.md +208 -0
- package/plugins/robin/skills/funpixel-world-and-story/references/forged-world.md +79 -0
- package/plugins/robin/skills/funpixel-world-and-story/references/living-world.md +237 -0
- package/plugins/robin/skills/funpixel-world-and-story/references/opening-and-chapters.md +215 -0
- package/plugins/robin/skills/funpixel-world-and-story/references/shelf.md +80 -0
- package/plugins/robin/skills/funpixel-world-and-story/references/story-at-size.md +159 -0
- package/plugins/robin/skills/funpixel-world-and-story/references/voice.md +175 -0
- package/plugins/robin/skills/funpixel-world-and-story/references/world-kit.md +154 -0
- package/templates/common/.agents/skills/funpixel-3d/SKILL.md +89 -0
- package/templates/common/.agents/skills/funpixel-3d/references/bake-off.md +48 -0
- package/templates/common/.agents/skills/funpixel-3d/references/bench.md +103 -0
- package/templates/common/.agents/skills/funpixel-3d/references/budgets.md +48 -0
- package/templates/common/.agents/skills/funpixel-3d/references/characters.md +67 -0
- package/templates/common/.agents/skills/funpixel-3d/references/concept-image.md +47 -0
- package/templates/common/.agents/skills/funpixel-3d/references/engine-targets.md +31 -0
- package/templates/common/.agents/skills/funpixel-3d/references/hero-route.md +104 -0
- package/templates/common/.agents/skills/funpixel-3d/references/level-spec.md +109 -0
- package/templates/common/.agents/skills/funpixel-3d/references/levels.md +84 -0
- package/templates/common/.agents/skills/funpixel-3d/references/light-and-places.md +141 -0
- package/templates/common/.agents/skills/funpixel-3d/references/models.md +111 -0
- package/templates/common/.agents/skills/funpixel-3d/references/painted-target.md +184 -0
- package/templates/common/.agents/skills/funpixel-3d/references/reading.md +41 -0
- package/templates/common/.agents/skills/funpixel-3d/references/skin.md +85 -0
- package/templates/common/.agents/skills/funpixel-3d/references/skyboxes.md +65 -0
- package/templates/common/.agents/skills/funpixel-3d/references/textures.md +71 -0
- package/templates/common/.agents/skills/funpixel-3d/references/three-loading.md +199 -0
- package/templates/common/.agents/skills/funpixel-3d/references/unity.md +78 -0
- package/templates/common/.agents/skills/funpixel-art/SKILL.md +104 -0
- package/templates/common/.agents/skills/funpixel-art/references/2d-assets.md +108 -0
- package/templates/common/.agents/skills/funpixel-art/references/animation.md +126 -0
- package/templates/common/.agents/skills/funpixel-art/references/cast.md +73 -0
- package/templates/common/.agents/skills/funpixel-art/references/characters.md +49 -0
- package/templates/common/.agents/skills/funpixel-art/references/cost.md +107 -0
- package/templates/common/.agents/skills/funpixel-art/references/effects.md +85 -0
- package/templates/common/.agents/skills/funpixel-art/references/frames.md +87 -0
- package/templates/common/.agents/skills/funpixel-art/references/judging-frames.md +64 -0
- package/templates/common/.agents/skills/funpixel-art/references/look.md +102 -0
- package/templates/common/.agents/skills/funpixel-art/references/measure.md +119 -0
- package/templates/common/.agents/skills/funpixel-art/references/pipeline.md +185 -0
- package/templates/common/.agents/skills/funpixel-art/references/pixi.md +277 -0
- package/templates/common/.agents/skills/funpixel-art/references/planes.md +27 -0
- package/templates/common/.agents/skills/funpixel-art/references/prompts.md +171 -0
- package/templates/common/.agents/skills/funpixel-art/references/sheets.md +141 -0
- package/templates/common/.agents/skills/funpixel-art/references/style-file.md +39 -0
- package/templates/common/.agents/skills/funpixel-art/references/three.md +232 -0
- package/templates/common/.agents/skills/funpixel-art/references/ui.md +163 -0
- package/templates/common/.agents/skills/funpixel-art/references/unity.md +78 -0
- package/templates/common/.agents/skills/funpixel-art/references/wiring.md +41 -0
- package/templates/common/.agents/skills/funpixel-audio/SKILL.md +92 -0
- package/templates/common/.agents/skills/funpixel-audio/references/adaptive-music.md +204 -0
- package/templates/common/.agents/skills/funpixel-audio/references/engine.md +78 -0
- package/templates/common/.agents/skills/funpixel-audio/references/measure.md +101 -0
- package/templates/common/.agents/skills/funpixel-audio/references/unity.md +74 -0
- package/templates/common/.agents/skills/funpixel-feedback/SKILL.md +120 -0
- package/templates/common/.agents/skills/funpixel-feedback/references/memory.md +99 -0
- package/templates/common/.agents/skills/funpixel-game-feel/SKILL.md +104 -0
- package/templates/common/.agents/skills/funpixel-game-feel/references/contact.md +110 -0
- package/templates/common/.agents/skills/funpixel-game-feel/references/measure.md +125 -0
- package/templates/common/.agents/skills/funpixel-game-feel/references/motion.md +134 -0
- package/templates/common/.agents/skills/funpixel-game-feel/references/payoffs.md +35 -0
- package/templates/common/.agents/skills/funpixel-game-feel/references/recipes.md +107 -0
- package/templates/common/.agents/skills/funpixel-game-feel/references/unity.md +73 -0
- package/templates/common/.agents/skills/funpixel-game-logic/SKILL.md +113 -0
- package/templates/common/.agents/skills/funpixel-game-logic/references/balance.md +88 -0
- package/templates/common/.agents/skills/funpixel-game-logic/references/content-at-scale.md +147 -0
- package/templates/common/.agents/skills/funpixel-game-logic/references/depth.md +89 -0
- package/templates/common/.agents/skills/funpixel-game-logic/references/escalation.md +41 -0
- package/templates/common/.agents/skills/funpixel-game-logic/references/levels.md +61 -0
- package/templates/common/.agents/skills/funpixel-game-logic/references/probes.md +122 -0
- package/templates/common/.agents/skills/funpixel-game-logic/references/unity.md +108 -0
- package/templates/common/.agents/skills/funpixel-game-spine/SKILL.md +118 -0
- package/templates/common/.agents/skills/funpixel-game-spine/references/camera.md +94 -0
- package/templates/common/.agents/skills/funpixel-game-spine/references/multiplayer.md +101 -0
- package/templates/common/.agents/skills/funpixel-game-spine/references/patterns.md +103 -0
- package/templates/common/.agents/skills/funpixel-game-spine/references/performance.md +96 -0
- package/templates/common/.agents/skills/funpixel-game-spine/references/pixi.md +26 -0
- package/templates/common/.agents/skills/funpixel-game-spine/references/replay.md +102 -0
- package/templates/common/.agents/skills/funpixel-game-spine/references/room-api.md +63 -0
- package/templates/common/.agents/skills/funpixel-game-spine/references/room-modes.md +40 -0
- package/templates/common/.agents/skills/funpixel-game-spine/references/sdk.md +114 -0
- package/templates/common/.agents/skills/funpixel-game-spine/references/three.md +62 -0
- package/templates/common/.agents/skills/funpixel-gdd/SKILL.md +116 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/as-built.md +40 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/design-measures.md +24 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/design-note.md +88 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/experience.md +92 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/first-look.md +226 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/floors.md +62 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/frame.md +75 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/gameplay-contract.md +81 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/gdd-template.md +417 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-card.md +109 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-platformer.md +159 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-puzzle.md +145 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-racing.md +137 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-rpg.md +125 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-shooter.md +128 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-simulation.md +112 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-strategy.md +116 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-survival.md +122 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/in-the-loop.md +106 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/invent-first.md +131 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/level-and-fun.md +112 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/pages.md +47 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/plan-at-size.md +140 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/production-tiers.md +117 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/sections.md +148 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/spec-folder.md +131 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/start.md +110 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/starters.md +175 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/the-path.md +133 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/track.md +29 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/world-and-identity.md +165 -0
- package/templates/common/.agents/skills/funpixel-gdd/references/worth.md +74 -0
- package/templates/common/.agents/skills/funpixel-mobile-ui/SKILL.md +107 -0
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/contrast.md +123 -0
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/hud-and-title.md +108 -0
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/hud-genres.md +124 -0
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/phone-check.md +156 -0
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/recipes.md +279 -0
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/restyle-ui.md +229 -0
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/unity.md +61 -0
- package/templates/common/.agents/skills/funpixel-publish/SKILL.md +109 -0
- package/templates/common/.agents/skills/funpixel-publish/references/compose.md +113 -0
- package/templates/common/.agents/skills/funpixel-publish/references/motion.md +120 -0
- package/templates/common/.agents/skills/funpixel-publish/references/networks.md +75 -0
- package/templates/common/.agents/skills/funpixel-publish/references/other-hosts.md +65 -0
- package/templates/common/.agents/skills/funpixel-publish/references/playable-ad.md +90 -0
- package/templates/common/.agents/skills/funpixel-publish/references/server-build.md +85 -0
- package/templates/common/.agents/skills/funpixel-publish/references/store-shots.md +85 -0
- package/templates/common/.agents/skills/funpixel-publish/references/trailer.md +55 -0
- package/templates/common/.agents/skills/funpixel-publish/references/what-ships.md +30 -0
- package/templates/common/.agents/skills/funpixel-store/SKILL.md +81 -0
- package/templates/common/.agents/skills/funpixel-store/references/app-store.md +73 -0
- package/templates/common/.agents/skills/funpixel-store/references/google-play.md +141 -0
- package/templates/common/.agents/skills/funpixel-store/references/ios-release.md +63 -0
- package/templates/common/.agents/skills/funpixel-store/references/money.md +66 -0
- package/templates/common/.agents/skills/funpixel-store/references/purchases-and-review.md +74 -0
- package/templates/common/.agents/skills/funpixel-store/references/readiness-page.md +24 -0
- package/templates/common/.agents/skills/funpixel-store/references/readiness.md +107 -0
- package/templates/common/.agents/skills/funpixel-store/references/steam.md +38 -0
- package/templates/common/.agents/skills/funpixel-store/references/unity-store.md +55 -0
- package/templates/common/.agents/skills/funpixel-store/references/web-portals.md +43 -0
- package/templates/common/.agents/skills/funpixel-unity-game/SKILL.md +103 -0
- package/templates/common/.agents/skills/funpixel-unity-game/references/agent-ops.md +54 -0
- package/templates/common/.agents/skills/funpixel-unity-game/references/fixes.md +40 -0
- package/templates/common/.agents/skills/funpixel-unity-game/references/from-a-web-game.md +108 -0
- package/templates/common/.agents/skills/funpixel-unity-game/references/handing-off.md +42 -0
- package/templates/common/.agents/skills/funpixel-unity-game/references/performance.md +59 -0
- package/templates/common/.agents/skills/funpixel-unity-game/references/probe.md +80 -0
- package/templates/common/.agents/skills/funpixel-unity-game/references/shared-mac.md +121 -0
- package/templates/common/.agents/skills/funpixel-unity-game/references/traps.md +108 -0
- package/templates/common/.agents/skills/funpixel-verify/SKILL.md +109 -0
- package/templates/common/.agents/skills/funpixel-verify/references/actors.md +94 -0
- package/templates/common/.agents/skills/funpixel-verify/references/bar.md +62 -0
- package/templates/common/.agents/skills/funpixel-verify/references/checks.md +69 -0
- package/templates/common/.agents/skills/funpixel-verify/references/experience.md +67 -0
- package/templates/common/.agents/skills/funpixel-verify/references/eyes.md +54 -0
- package/templates/common/.agents/skills/funpixel-verify/references/fidelity.md +126 -0
- package/templates/common/.agents/skills/funpixel-verify/references/hit-bar.md +31 -0
- package/templates/common/.agents/skills/funpixel-verify/references/journeys.md +77 -0
- package/templates/common/.agents/skills/funpixel-verify/references/mobile-qa.md +123 -0
- package/templates/common/.agents/skills/funpixel-verify/references/playtest.md +161 -0
- package/templates/common/.agents/skills/funpixel-verify/references/review.md +105 -0
- package/templates/common/.agents/skills/funpixel-verify/references/rubric.md +67 -0
- package/templates/common/.agents/skills/funpixel-verify/references/scenes.md +49 -0
- package/templates/common/.agents/skills/funpixel-verify/references/unity.md +60 -0
- package/templates/common/.agents/skills/funpixel-world-and-story/SKILL.md +99 -0
- package/templates/common/.agents/skills/funpixel-world-and-story/references/atmosphere.md +208 -0
- package/templates/common/.agents/skills/funpixel-world-and-story/references/forged-world.md +79 -0
- package/templates/common/.agents/skills/funpixel-world-and-story/references/living-world.md +237 -0
- package/templates/common/.agents/skills/funpixel-world-and-story/references/opening-and-chapters.md +215 -0
- package/templates/common/.agents/skills/funpixel-world-and-story/references/shelf.md +80 -0
- package/templates/common/.agents/skills/funpixel-world-and-story/references/story-at-size.md +159 -0
- package/templates/common/.agents/skills/funpixel-world-and-story/references/voice.md +175 -0
- package/templates/common/.agents/skills/funpixel-world-and-story/references/world-kit.md +154 -0
- package/templates/common/.claude/settings.json +3 -0
- package/templates/common/.harnessignore +28 -0
- package/templates/common/AGENTS.md +135 -0
- package/templates/common/CLAUDE.md +1 -0
- package/templates/common/assets/assets.example.json +9 -0
- package/templates/common/index.html +13 -0
- package/templates/common/src/art/files.mjs +27 -0
- package/templates/common/src/assets.ts +62 -0
- package/templates/common/src/beat.ts +50 -0
- package/templates/common/src/characters.ts +54 -0
- package/templates/common/src/expose.ts +63 -0
- package/templates/common/src/feel.ts +78 -0
- package/templates/common/src/fpx-hooks.ts +46 -0
- package/templates/common/src/frame.ts +63 -0
- package/templates/common/src/grade.ts +47 -0
- package/templates/common/src/hud-kit.css +29 -0
- package/templates/common/src/hud-kit.tsx +85 -0
- package/templates/common/src/hud.tsx +55 -0
- package/templates/common/src/icons.tsx +35 -0
- package/templates/common/src/input.ts +70 -0
- package/templates/common/src/juice.ts +92 -0
- package/templates/common/src/levels.ts +43 -0
- package/templates/common/src/living.ts +91 -0
- package/templates/common/src/look.json +19 -0
- package/templates/common/src/look.ts +54 -0
- package/templates/common/src/main.tsx +31 -0
- package/templates/common/src/markers.ts +60 -0
- package/templates/common/src/motion-sample.ts +71 -0
- package/templates/common/src/motion.ts +92 -0
- package/templates/common/src/pin.ts +32 -0
- package/templates/common/src/platform.ts +67 -0
- package/templates/common/src/pose.ts +22 -0
- package/templates/common/src/probe-human.ts +29 -0
- package/templates/common/src/probe-kit.ts +99 -0
- package/templates/common/src/rules.ts +99 -0
- package/templates/common/src/save.ts +21 -0
- package/templates/common/src/screens.css +34 -0
- package/templates/common/src/screens.tsx +95 -0
- package/templates/common/src/selftests.ts +22 -0
- package/templates/common/src/session.ts +99 -0
- package/templates/common/src/sound.ts +85 -0
- package/templates/common/src/splash-funpixel/OFL.txt +94 -0
- package/templates/common/src/splash-funpixel/card.css +18 -0
- package/templates/common/src/splash-funpixel/card.tsx +22 -0
- package/templates/common/src/splash.css +15 -0
- package/templates/common/src/splash.tsx +86 -0
- package/templates/common/src/store.ts +68 -0
- package/templates/common/src/strike.ts +82 -0
- package/templates/common/src/styles.css +81 -0
- package/templates/common/src/toasts.ts +75 -0
- package/templates/common/src/world.ts +91 -0
- package/templates/common/test/feel.json +36 -0
- package/templates/common/test/platform.test.ts +42 -0
- package/templates/common/test/probes.ts +72 -0
- package/templates/common/test/rules.test.ts +88 -0
- package/templates/common/tsconfig.json +16 -0
- package/templates/common/vite.config.ts +6 -0
- package/templates/pixi/src/character.ts +63 -0
- package/templates/pixi/src/game.ts +99 -0
- package/templates/pixi/src/world-hud.ts +16 -0
- package/templates/spec/common/src/chapters.ts +97 -0
- package/templates/spec/common/src/levels.ts +68 -0
- package/templates/spec/common/src/probe-rooms.ts +63 -0
- package/templates/spec/common/src/room-map.tsx +30 -0
- package/templates/spec/common/src/tune.ts +93 -0
- package/templates/spec/common/test/rooms.test.ts +59 -0
- package/templates/spec/common/test/rooms.ts +53 -0
- package/templates/spec/three-world/test/rooms.ts +54 -0
- package/templates/three/src/character.ts +65 -0
- package/templates/three/src/game.ts +99 -0
- package/templates/three/src/world-hud.ts +22 -0
- package/templates/three-world/src/bot.ts +43 -0
- package/templates/three-world/src/budget.ts +73 -0
- package/templates/three-world/src/camera-rig.ts +99 -0
- package/templates/three-world/src/controls.tsx +49 -0
- package/templates/three-world/src/cutout-atlas.ts +26 -0
- package/templates/three-world/src/cutout-math.ts +47 -0
- package/templates/three-world/src/cutouts.ts +99 -0
- package/templates/three-world/src/dressing-math.ts +98 -0
- package/templates/three-world/src/dressing.ts +84 -0
- package/templates/three-world/src/expose.ts +82 -0
- package/templates/three-world/src/feel.ts +79 -0
- package/templates/three-world/src/game.ts +99 -0
- package/templates/three-world/src/hud.tsx +44 -0
- package/templates/three-world/src/icons.tsx +36 -0
- package/templates/three-world/src/input.ts +73 -0
- package/templates/three-world/src/juice.ts +91 -0
- package/templates/three-world/src/layout.ts +73 -0
- package/templates/three-world/src/light-math.ts +78 -0
- package/templates/three-world/src/light.ts +77 -0
- package/templates/three-world/src/look.json +30 -0
- package/templates/three-world/src/main.tsx +38 -0
- package/templates/three-world/src/models.ts +62 -0
- package/templates/three-world/src/palette.ts +21 -0
- package/templates/three-world/src/places.json +50 -0
- package/templates/three-world/src/places.ts +56 -0
- package/templates/three-world/src/pose.ts +22 -0
- package/templates/three-world/src/post.ts +47 -0
- package/templates/three-world/src/rest-math.ts +29 -0
- package/templates/three-world/src/rules.ts +89 -0
- package/templates/three-world/src/screens.css +45 -0
- package/templates/three-world/src/screens.tsx +96 -0
- package/templates/three-world/src/selftests.ts +25 -0
- package/templates/three-world/src/session.ts +99 -0
- package/templates/three-world/src/shots.ts +59 -0
- package/templates/three-world/src/sky.ts +48 -0
- package/templates/three-world/src/stage.ts +83 -0
- package/templates/three-world/src/styles.css +95 -0
- package/templates/three-world/src/surfaces.ts +55 -0
- package/templates/three-world/src/world.ts +70 -0
- package/templates/three-world/test/feel.json +29 -0
- package/templates/three-world/test/probes.ts +65 -0
- package/templates/three-world/test/resolve.mjs +13 -0
- package/templates/three-world/test/rules.test.ts +81 -0
- package/unity/com.funpixel.probe/Editor/Funpixel.Probe.Editor.asmdef +16 -0
- package/unity/com.funpixel.probe/Editor/Funpixel.Probe.Editor.asmdef.meta +7 -0
- package/unity/com.funpixel.probe/Editor/ProbeBuild.cs +97 -0
- package/unity/com.funpixel.probe/Editor/ProbeBuild.cs.meta +11 -0
- package/unity/com.funpixel.probe/Editor/ReleaseGuard.cs +23 -0
- package/unity/com.funpixel.probe/Editor/ReleaseGuard.cs.meta +11 -0
- package/unity/com.funpixel.probe/Editor.meta +8 -0
- package/unity/com.funpixel.probe/Runtime/Api/Funpixel.Probe.asmdef +14 -0
- package/unity/com.funpixel.probe/Runtime/Api/Funpixel.Probe.asmdef.meta +7 -0
- package/unity/com.funpixel.probe/Runtime/Api/FunpixelProbe.cs +146 -0
- package/unity/com.funpixel.probe/Runtime/Api/FunpixelProbe.cs.meta +11 -0
- package/unity/com.funpixel.probe/Runtime/Api.meta +8 -0
- package/unity/com.funpixel.probe/Runtime/Player/Args.cs +87 -0
- package/unity/com.funpixel.probe/Runtime/Player/Args.cs.meta +11 -0
- package/unity/com.funpixel.probe/Runtime/Player/Boot.cs +67 -0
- package/unity/com.funpixel.probe/Runtime/Player/Boot.cs.meta +11 -0
- package/unity/com.funpixel.probe/Runtime/Player/Bridge.cs +559 -0
- package/unity/com.funpixel.probe/Runtime/Player/Bridge.cs.meta +11 -0
- package/unity/com.funpixel.probe/Runtime/Player/Capture.cs +145 -0
- package/unity/com.funpixel.probe/Runtime/Player/Capture.cs.meta +11 -0
- package/unity/com.funpixel.probe/Runtime/Player/Funpixel.Probe.Player.asmdef +32 -0
- package/unity/com.funpixel.probe/Runtime/Player/Funpixel.Probe.Player.asmdef.meta +7 -0
- package/unity/com.funpixel.probe/Runtime/Player/Inject.cs +127 -0
- package/unity/com.funpixel.probe/Runtime/Player/Inject.cs.meta +11 -0
- package/unity/com.funpixel.probe/Runtime/Player/Json.cs +246 -0
- package/unity/com.funpixel.probe/Runtime/Player/Json.cs.meta +11 -0
- package/unity/com.funpixel.probe/Runtime/Player/Probe.cs +194 -0
- package/unity/com.funpixel.probe/Runtime/Player/Probe.cs.meta +11 -0
- package/unity/com.funpixel.probe/Runtime/Player/Stats.cs +266 -0
- package/unity/com.funpixel.probe/Runtime/Player/Stats.cs.meta +11 -0
- package/unity/com.funpixel.probe/Runtime/Player/UiTargets.cs +134 -0
- package/unity/com.funpixel.probe/Runtime/Player/UiTargets.cs.meta +11 -0
- package/unity/com.funpixel.probe/Runtime/Player.meta +8 -0
- package/unity/com.funpixel.probe/Runtime/link.xml +7 -0
- package/unity/com.funpixel.probe/Runtime/link.xml.meta +7 -0
- package/unity/com.funpixel.probe/Runtime.meta +8 -0
- package/unity/com.funpixel.probe/Tests/Editor/Funpixel.Probe.Tests.asmdef +25 -0
- package/unity/com.funpixel.probe/Tests/Editor/Funpixel.Probe.Tests.asmdef.meta +7 -0
- package/unity/com.funpixel.probe/Tests/Editor/StatsTests.cs +147 -0
- package/unity/com.funpixel.probe/Tests/Editor/StatsTests.cs.meta +11 -0
- package/unity/com.funpixel.probe/Tests/Editor/WireTests.cs +86 -0
- package/unity/com.funpixel.probe/Tests/Editor/WireTests.cs.meta +11 -0
- package/unity/com.funpixel.probe/Tests/Editor.meta +8 -0
- package/unity/com.funpixel.probe/Tests.meta +8 -0
- package/unity/com.funpixel.probe/package.json +14 -0
- package/unity/com.funpixel.probe/package.json.meta +7 -0
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export const TAUGHT_WINS = 0.5;
|
|
4
|
+
export const NOVICE_FLOOR = 0.8;
|
|
5
|
+
export const CEILING_SHARE = 0.9;
|
|
6
|
+
export const CEILING_TIME = 1.25;
|
|
7
|
+
export const IDLE_SHARE = 0.5;
|
|
8
|
+
export const byRole = (cohorts, role) => cohorts.find((c) => c.role === role && !c.human) ?? cohorts.find((c) => c.role === role);
|
|
9
|
+
const pct = (a, b) => (b > 0 ? Math.round((100 * a) / b) : 0);
|
|
10
|
+
const rate = (c) => (c.seeds > 0 ? c.won / c.seeds : 0);
|
|
11
|
+
export function invalid(out) {
|
|
12
|
+
const o = out;
|
|
13
|
+
if (!o || typeof o !== 'object')
|
|
14
|
+
return 'the probe printed no JSON object';
|
|
15
|
+
if (o.probes !== 1)
|
|
16
|
+
return 'the JSON is not a probe run ({ "probes": 1, "cohorts": [...] })';
|
|
17
|
+
if (!Array.isArray(o.cohorts))
|
|
18
|
+
return 'the probe run has no cohorts';
|
|
19
|
+
for (const c of o.cohorts)
|
|
20
|
+
if (!c || typeof c.policy !== 'string' || typeof c.seeds !== 'number' || !c.progress)
|
|
21
|
+
return `a cohort is malformed (${JSON.stringify(c).slice(0, 80)})`;
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
export const STALLED_SHARE = 1.25;
|
|
25
|
+
export function stalledBot(cohorts) {
|
|
26
|
+
const skilled = byRole(cohorts, 'skilled');
|
|
27
|
+
if (!skilled)
|
|
28
|
+
return null;
|
|
29
|
+
const next = 'fix the sharp policy first (replay a seed and watch where it stops: a target it cannot reach, an input the rules ignore, a timer that never fires); the ceiling, length and moments read the bot until then';
|
|
30
|
+
if (skilled.progress.max <= 0 && skilled.won === 0)
|
|
31
|
+
return { id: 'bot', state: 'warn', says: `bot broken: the sharp bot (${skilled.says}) made no progress on any of ${skilled.seeds} seeds in ${skilled.seconds} s`, next };
|
|
32
|
+
const better = cohorts.filter((c) => c.role !== 'skilled' && !c.human && c.progress.mean > STALLED_SHARE * skilled.progress.mean && c.won >= skilled.won)
|
|
33
|
+
.sort((a, b) => b.progress.mean - a.progress.mean)[0];
|
|
34
|
+
if (better)
|
|
35
|
+
return { id: 'bot', state: 'warn', says: `bot broken: the ${better.role} player gets ${pct(better.progress.mean, skilled.progress.mean)}% as far as the sharp bot (progress ${better.progress.mean} vs ${skilled.progress.mean}), so the sharp bot stalls`, next };
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
export function judgeCohorts(cohorts, noviceFloor = NOVICE_FLOOR) {
|
|
39
|
+
const by = (r) => byRole(cohorts, r);
|
|
40
|
+
const idle = by('idle'), naive = by('naive'), taught = by('taught'), skilled = by('skilled'), novice = by('novice');
|
|
41
|
+
const out = [];
|
|
42
|
+
const stalled = stalledBot(cohorts);
|
|
43
|
+
if (stalled)
|
|
44
|
+
out.push(stalled);
|
|
45
|
+
if (!idle)
|
|
46
|
+
out.push({ id: 'idle', state: 'not measured', says: 'no idle policy: whether standing still wins was never played' });
|
|
47
|
+
else if (idle.won > 0)
|
|
48
|
+
out.push({ id: 'idle', state: 'warn', says: `standing still wins ${idle.won}/${idle.seeds} seeds`, next: 'let a threat or the clock end an idle run; a phone player idles while reading the screen and should not win for it' });
|
|
49
|
+
else if (skilled && skilled.progress.mean > 0 && idle.progress.mean >= IDLE_SHARE * skilled.progress.mean)
|
|
50
|
+
out.push({ id: 'idle', state: 'warn', says: `standing still gets ${pct(idle.progress.mean, skilled.progress.mean)}% as far as the sharp bot (progress ${idle.progress.mean} vs ${skilled.progress.mean})`, next: 'waves that clear themselves or points that accrue untouched: make progress come from the verb' });
|
|
51
|
+
else
|
|
52
|
+
out.push({ id: 'idle', state: 'ok', says: `standing still does not win (${idle.lost} lost, ${idle.open} unfinished of ${idle.seeds}; progress ${idle.progress.mean})` });
|
|
53
|
+
if (!naive || !skilled)
|
|
54
|
+
out.push({ id: 'skill-ceiling', state: 'not measured', says: `no ${!naive ? 'naive' : 'skilled'} policy: the gap between steering at the target and playing well was never measured` });
|
|
55
|
+
else if (stalled)
|
|
56
|
+
out.push({ id: 'skill-ceiling', state: 'not measured', says: 'the sharp bot is broken, so the gap between steering at the target and playing well was not measured' });
|
|
57
|
+
else {
|
|
58
|
+
const own = 'on purpose (a toy, a relaxed game, a race against the clock)? say so in the design note; else give the verb something to master: a risk that pays, a line to read, a combo';
|
|
59
|
+
const slower = skilled.meanSeconds > 0 ? naive.meanSeconds / skilled.meanSeconds : 1;
|
|
60
|
+
if (rate(naive) >= CEILING_SHARE && rate(skilled) >= CEILING_SHARE) {
|
|
61
|
+
out.push(slower < CEILING_TIME
|
|
62
|
+
? { id: 'skill-ceiling', state: 'note', says: `no skill ceiling: the naive player (${naive.says}) wins ${naive.won}/${naive.seeds} as fast as the sharp one (${naive.meanSeconds} s vs ${skilled.meanSeconds} s)`, next: own }
|
|
63
|
+
: { id: 'skill-ceiling', state: 'note', says: `the win holds no challenge: the naive player (${naive.says}) wins ${naive.won}/${naive.seeds}; skill shows only as time (${naive.meanSeconds} s vs ${skilled.meanSeconds} s)`, next: own });
|
|
64
|
+
}
|
|
65
|
+
else if (skilled.progress.mean > 0 && naive.progress.mean >= CEILING_SHARE * skilled.progress.mean && Math.abs(rate(naive) - rate(skilled)) <= 0.1) {
|
|
66
|
+
out.push({ id: 'skill-ceiling', state: 'note', says: `no skill ceiling: the naive player gets ${pct(naive.progress.mean, skilled.progress.mean)}% as far as the sharp one (progress ${naive.progress.mean} vs ${skilled.progress.mean})`, next: own });
|
|
67
|
+
}
|
|
68
|
+
else
|
|
69
|
+
out.push({ id: 'skill-ceiling', state: 'ok', says: `playing well goes further: progress ${skilled.progress.mean} vs ${naive.progress.mean}, wins ${skilled.won} vs ${naive.won} of ${skilled.seeds}` });
|
|
70
|
+
}
|
|
71
|
+
const base = naive ?? idle;
|
|
72
|
+
if (!taught)
|
|
73
|
+
out.push({ id: 'taught', state: 'not measured', says: 'no taught policy: whether doing what the game teaches pays was never played' });
|
|
74
|
+
else if (base && (rate(taught) < rate(base) - 0.1 || taught.progress.mean < CEILING_SHARE * base.progress.mean)) {
|
|
75
|
+
out.push({ id: 'taught', state: 'warn', says: `doing what the game teaches (${taught.says}) does worse than the ${base.role} player: progress ${taught.progress.mean} vs ${base.progress.mean}, wins ${taught.won} vs ${base.won}`, next: 'the tutorial teaches a losing line, or the mechanic hurts the player who uses it: check the reward reaches them and they are safe from their own move' });
|
|
76
|
+
}
|
|
77
|
+
else if (skilled && skilled.won > 0 && rate(taught) < TAUGHT_WINS) {
|
|
78
|
+
out.push({ id: 'taught', state: 'warn', says: `doing what the game teaches (${taught.policy}: ${taught.says}) wins only ${taught.won}/${taught.seeds} where the sharp policy wins ${skilled.won}/${skilled.seeds} (progress ${taught.progress.mean} vs ${skilled.progress.mean})`, next: 'the lesson alone does not get a player through: teach what the winning player does, give the taught line more room (longer tells, a wider window), or ease the defaults' });
|
|
79
|
+
}
|
|
80
|
+
else
|
|
81
|
+
out.push({ id: 'taught', state: 'ok', says: `doing what the game teaches pays: progress ${taught.progress.mean}, wins ${taught.won}/${taught.seeds}` });
|
|
82
|
+
if (skilled && skilled.won === 0 && skilled.lost > 0)
|
|
83
|
+
out.push({ id: 'winnable', state: 'note', says: `the sharp bot never wins in ${skilled.seconds} s (${skilled.lost} lost): a win may be out of reach, or the bot is weak` });
|
|
84
|
+
else if (skilled && skilled.won > 0)
|
|
85
|
+
out.push({ id: 'winnable', state: 'ok', says: `the sharp bot wins ${skilled.won}/${skilled.seeds}` });
|
|
86
|
+
if (!novice)
|
|
87
|
+
out.push({ id: 'novice', state: 'not measured', says: 'no novice policy: the first-success floor was never played' });
|
|
88
|
+
else if (novice.firstSuccess === null)
|
|
89
|
+
out.push({ id: 'novice', state: 'not measured', says: 'the game names no first success (ProbeGame.firstSuccess)' });
|
|
90
|
+
else {
|
|
91
|
+
const ok = novice.firstSuccess >= noviceFloor * novice.seeds;
|
|
92
|
+
out.push({ id: 'novice', state: ok ? 'ok' : 'warn', says: `the novice (${novice.says}) reaches the first success on ${novice.firstSuccess}/${novice.seeds} seeds (the skill's floor: ${Math.round(noviceFloor * 100)}%)`, ...(ok ? {} : { next: 'fix controls, safe introductions and warning time before lowering every enemy\'s health; freeze the novice before tuning' }) });
|
|
93
|
+
}
|
|
94
|
+
const checked = cohorts.filter((c) => c.broken !== undefined);
|
|
95
|
+
const broke = checked.find((c) => c.broken);
|
|
96
|
+
if (broke?.broken)
|
|
97
|
+
out.push({ id: 'broken', state: 'warn', says: `${broke.broken.what}: ${broke.policy} policy, seed ${broke.broken.seed}, at ${broke.broken.at} s`, next: 'replay that seed; the worst case matters, not the average' });
|
|
98
|
+
else if (checked.length)
|
|
99
|
+
out.push({ id: 'broken', state: 'ok', says: `the game's never-happens check held for ${checked.map((c) => c.policy).join(', ')}` });
|
|
100
|
+
else
|
|
101
|
+
out.push({ id: 'broken', state: 'not measured', says: 'no broken() check (NaN, off the map, inside a wall)' });
|
|
102
|
+
return out;
|
|
103
|
+
}
|
|
104
|
+
export function judgeMoments(moments = []) {
|
|
105
|
+
return moments.map((m) => {
|
|
106
|
+
const [best, next] = m.candidates ?? [];
|
|
107
|
+
if (!best || best.score <= 0)
|
|
108
|
+
return { id: `moment:${m.name}`, state: 'note', says: `no seed staged a ${m.name} moment in the search`, next: 'widen the seeds or start times, or check the score counts the payoff event' };
|
|
109
|
+
return {
|
|
110
|
+
id: `moment:${m.name}`, state: 'ok',
|
|
111
|
+
says: `best ${m.name}${m.says ? ` (${m.says})` : ''}: seed ${best.seed} at ${best.at} s, score ${best.score}${next ? `; next ${next.score}` : ''}`,
|
|
112
|
+
next: `the moment view's enter() can replay it: replayTo(game, policy, ${best.seed}, ${best.at}), so capture shoots a real payoff`,
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
export function correlation(a, b) {
|
|
117
|
+
const n = Math.min(a.length, b.length);
|
|
118
|
+
if (n < 3)
|
|
119
|
+
return null;
|
|
120
|
+
const ma = a.slice(0, n).reduce((s, x) => s + x, 0) / n, mb = b.slice(0, n).reduce((s, x) => s + x, 0) / n;
|
|
121
|
+
let ab = 0, aa = 0, bb = 0;
|
|
122
|
+
for (let i = 0; i < n; i++) {
|
|
123
|
+
ab += (a[i] - ma) * (b[i] - mb);
|
|
124
|
+
aa += (a[i] - ma) ** 2;
|
|
125
|
+
bb += (b[i] - mb) ** 2;
|
|
126
|
+
}
|
|
127
|
+
return aa < 1e-9 || bb < 1e-9 ? null : Math.round((ab / Math.sqrt(aa * bb)) * 100) / 100;
|
|
128
|
+
}
|
|
129
|
+
export function judgeTimelines(timelines = []) {
|
|
130
|
+
const out = [];
|
|
131
|
+
for (const tl of timelines)
|
|
132
|
+
for (const f of tl.follow ?? []) {
|
|
133
|
+
const id = `music:${tl.name}:${f.layer}`;
|
|
134
|
+
const layer = tl.rows.map((r) => r[f.layer]).filter((v) => typeof v === 'number');
|
|
135
|
+
const driver = tl.rows.map((r) => r[f.driver]).filter((v) => typeof v === 'number');
|
|
136
|
+
const span = (xs) => (xs.length ? Math.max(...xs) - Math.min(...xs) : 0);
|
|
137
|
+
const secs = tl.rows.at(-1)?.t ?? 0;
|
|
138
|
+
if (layer.length < 4 || driver.length < 4) {
|
|
139
|
+
out.push({ id, state: 'not measured', says: `${tl.name}: too few samples of ${f.layer} and ${f.driver}` });
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (span(layer) < 0.05) {
|
|
143
|
+
out.push({ id, state: 'warn', says: `${tl.name}: the ${f.layer} layer never moved in ${secs} s of play`, next: 'the mix does not follow play: raise the layer with what it names, or drop the claim' });
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const r = correlation(layer, driver);
|
|
147
|
+
if (r === null)
|
|
148
|
+
out.push({ id, state: 'not measured', says: `${tl.name}: ${f.driver} never changed, so nothing to follow` });
|
|
149
|
+
else if (r < 0.3)
|
|
150
|
+
out.push({ id, state: 'note', says: `${tl.name}: ${f.layer} moves but not with ${f.driver} (r = ${r} over ${layer.length} samples)`, next: 'check what drives the layer: a mix on a timer reads as a playlist' });
|
|
151
|
+
else
|
|
152
|
+
out.push({ id, state: 'ok', says: `${tl.name}: ${f.layer} follows ${f.driver} (r = ${r} over ${layer.length} samples)` });
|
|
153
|
+
}
|
|
154
|
+
return out;
|
|
155
|
+
}
|
|
156
|
+
export const SHORT_RUN_SECONDS = 60;
|
|
157
|
+
export function perMinute(c) {
|
|
158
|
+
const total = Object.values(c.events ?? {}).reduce((a, b) => a + b, 0);
|
|
159
|
+
return c.meanSeconds > 0 ? Math.round((total / c.meanSeconds) * 600) / 10 : 0;
|
|
160
|
+
}
|
|
161
|
+
const mmss = (secs) => { const s = Math.round(secs); return `${Math.floor(s / 60)}:${String(s % 60).padStart(2, '0')}`; };
|
|
162
|
+
export function judgeDepth(cohorts) {
|
|
163
|
+
const out = [];
|
|
164
|
+
for (const role of ['skilled', 'novice']) {
|
|
165
|
+
const c = byRole(cohorts, role);
|
|
166
|
+
if (!c || !(c.meanSeconds > 0))
|
|
167
|
+
continue;
|
|
168
|
+
const kinds = Object.entries(c.events ?? {}).sort((a, b) => b[1] - a[1]).slice(0, 4)
|
|
169
|
+
.map(([k, v]) => `${k} ${Math.round((v / c.meanSeconds) * 600) / 10}`).join(', ');
|
|
170
|
+
const says = `${role}: a run lasts ${mmss(c.meanSeconds)} and ${perMinute(c)} events a minute${kinds ? ` (${kinds})` : ''}`;
|
|
171
|
+
if (c.lost >= c.seeds / 2 && c.meanSeconds < SHORT_RUN_SECONDS) {
|
|
172
|
+
out.push({ id: `depth:${role}`, state: 'note', says: `${says}; ${c.lost}/${c.seeds} runs end lost in under a minute`, next: 'a run under a minute is a demo in most genres (depth.md run length): warning time, a safer start or a slower ramp, before cutting the threat' });
|
|
173
|
+
}
|
|
174
|
+
else
|
|
175
|
+
out.push({ id: `depth:${role}`, state: 'ok', says, ...(kinds ? {} : { next: 'the policy steps return no events: count eats, pickups and decisions to measure density' }) });
|
|
176
|
+
}
|
|
177
|
+
return out;
|
|
178
|
+
}
|
|
179
|
+
export const PLAY_FLOOR = 900;
|
|
180
|
+
export const DEFAULT_FLOOR = { seconds: PLAY_FLOOR, where: 'a complete game' };
|
|
181
|
+
export function playFloor(root) {
|
|
182
|
+
try {
|
|
183
|
+
const n = Number(JSON.parse(readFileSync(join(root, 'funpixel.json'), 'utf8'))?.play_min_minutes);
|
|
184
|
+
if (Number.isFinite(n) && n > 0)
|
|
185
|
+
return { seconds: Math.round(n * 60), where: 'this game (funpixel.json play_min_minutes)' };
|
|
186
|
+
}
|
|
187
|
+
catch { }
|
|
188
|
+
return DEFAULT_FLOOR;
|
|
189
|
+
}
|
|
190
|
+
const ON_PURPOSE = /\bon purpose\b|\bby design\b|\bdeliberate(?:ly)?\b/i;
|
|
191
|
+
export function statedLength(text, where = 'the design doc') {
|
|
192
|
+
const m = /play[ -]length\W{0,8}(?:about |~|≈)?(\d+(?:\.\d+)?)(?::(\d\d))?(?:\s*[–-]\s*\d+(?:\.\d+)?)?\s*(min(?:ute)?s?\b|m\b|s\b|sec(?:ond)?s?\b)?/i.exec(text);
|
|
193
|
+
if (!m) {
|
|
194
|
+
const body = /^#{1,4}\s*play[ -]length\b[^\n]*\n([\s\S]{0,400})/im.exec(text)?.[1] ?? '';
|
|
195
|
+
const n = /(\d+(?:\.\d+)?)(?:\s*(?:to|–|-)\s*\d+(?:\.\d+)?)?\s*(min(?:ute)?s?\b|s\b|sec(?:ond)?s?\b)/i.exec(body);
|
|
196
|
+
return n ? { seconds: /^s/i.test(n[2]) ? Number(n[1]) : Number(n[1]) * 60, where, ...(ON_PURPOSE.test(body) ? { onPurpose: true } : {}) } : null;
|
|
197
|
+
}
|
|
198
|
+
const seconds = m[2] !== undefined ? Number(m[1]) * 60 + Number(m[2]) : m[3] && /^s/i.test(m[3]) ? Number(m[1]) : m[3] ? Number(m[1]) * 60 : 0;
|
|
199
|
+
const at = m.index + m[0].length - 1, eol = text.indexOf('\n', at);
|
|
200
|
+
const line = text.slice(text.lastIndexOf('\n', at) + 1, eol < 0 ? text.length : eol);
|
|
201
|
+
return seconds > 0 ? { seconds, where, ...(ON_PURPOSE.test(line) ? { onPurpose: true } : {}) } : null;
|
|
202
|
+
}
|
|
203
|
+
export function judgeLength(cohorts, stated = null, floor = DEFAULT_FLOOR) {
|
|
204
|
+
const skilled = byRole(cohorts, 'skilled');
|
|
205
|
+
if (!skilled || !(skilled.meanSeconds > 0))
|
|
206
|
+
return { id: 'length', state: 'not measured', says: 'no skilled policy: how long a good run lasts was never played' };
|
|
207
|
+
const levels = (skilled.levels?.length ?? 0) > 1;
|
|
208
|
+
const chosen = !!stated?.onPurpose && stated.seconds < floor.seconds;
|
|
209
|
+
const need = chosen ? stated.seconds : Math.max(floor.seconds, stated?.seconds ?? 0);
|
|
210
|
+
const spread = skilled.spread ? ` (${mmss(skilled.spread.min)}–${mmss(skilled.spread.max)} over ${skilled.seeds} seeds)` : '';
|
|
211
|
+
const split = levels ? `; levels reached at ${skilled.levels.map((l) => `${l.level} ${mmss(l.meanAt)}`).join(', ')}` : '';
|
|
212
|
+
const ending = skilled.ended === undefined ? '' : skilled.ended > 0
|
|
213
|
+
? `; the ending reached on ${skilled.ended}/${skilled.seeds} seeds${skilled.endedAt ? ` at ${mmss(skilled.endedAt)}` : ''}` : '';
|
|
214
|
+
const says = `a skilled run lasts ${mmss(skilled.meanSeconds)}${spread}${split}${ending}`;
|
|
215
|
+
const bar = `${mmss(floor.seconds)} for ${floor.where}${stated ? `, ${stated.where} says ${mmss(stated.seconds)}${stated.onPurpose ? ' on purpose' : ''}` : ''}`;
|
|
216
|
+
if (skilled.open >= skilled.seeds / 2 && skilled.seconds < need) {
|
|
217
|
+
return { id: 'length', state: 'not measured', says: `${says}, but the probe stops each run at ${skilled.seconds} s, under the bar (${bar})`, next: `raise the seconds in test/probes.ts to ${need} or more so a run can reach its ending` };
|
|
218
|
+
}
|
|
219
|
+
if (skilled.ended === 0) {
|
|
220
|
+
const looped = skilled.open >= skilled.seeds / 2;
|
|
221
|
+
const what = looped ? `no ending reached in ${skilled.seconds} s` : `no ending reached in ${skilled.seconds} s: every skilled run ends lost first (${skilled.lost}/${skilled.seeds})`;
|
|
222
|
+
if (stated?.onPurpose && looped)
|
|
223
|
+
return { id: 'length', state: 'note', says: `${says}; ${what}, as ${stated.where} chooses (endless on purpose)`, next: 'an endless game carries its minutes in what brings a player back (a best, a daily seed, a score attack)' };
|
|
224
|
+
return { id: 'length', state: 'warn', says: `${says}; ${what}`, next: looped
|
|
225
|
+
? 'play never runs out and never ends: a game reaches an ending worth reaching (a last level, a final boss, an end screen); name it in ProbeGame.ended(run) so sim times it (skill funpixel-game-logic, references/probes.md)'
|
|
226
|
+
: 'a good player never sees the end: ease the last stretch or check the sharp bot reaches it; a run that must end in a loss says so on the play-length line "on purpose"' };
|
|
227
|
+
}
|
|
228
|
+
if (chosen && skilled.meanSeconds + 0.5 >= stated.seconds) {
|
|
229
|
+
return { id: 'length', state: 'note', says: `${says}: shorter than the ${mmss(floor.seconds)} floor for ${floor.where}, as ${stated.where} chooses on purpose (${mmss(stated.seconds)})`, next: 'a round that short is a choice; what brings a player back for the next one (a best, a daily seed, a score attack) carries the minutes' };
|
|
230
|
+
}
|
|
231
|
+
if (skilled.meanSeconds + 0.5 < need) {
|
|
232
|
+
return { id: 'length', state: 'warn', says: `${says}: under the bar (${bar})`, next: stated && stated.seconds >= floor.seconds
|
|
233
|
+
? `play ends before the length ${stated.where} states: content that play reaches (a new idea per stage, a twist, an ending worth reaching), or state the length it has`
|
|
234
|
+
: `real play of ${mmss(floor.seconds)} or more for a first-time player: escalation, variety, a twist, an ending worth reaching (skill funpixel-game-logic, references/depth.md); a smaller scope is a choice: say "on purpose" on the play-length line of the design doc, or set funpixel.json play_min_minutes` };
|
|
235
|
+
}
|
|
236
|
+
return { id: 'length', state: 'ok', says: `${says}, at or over the bar (${bar})${skilled.ended === undefined ? '; the probe kit reports no ending (src/probe-kit.ts predates endedAt: `funtools upgrade`)' : ''}` };
|
|
237
|
+
}
|
|
238
|
+
export function judge(out, noviceFloor = NOVICE_FLOOR, stated = null, floor = DEFAULT_FLOOR) {
|
|
239
|
+
return [...judgeCohorts(out.cohorts, noviceFloor), judgeLength(out.cohorts, stated, floor), ...judgeDepth(out.cohorts), ...judgeMoments(out.moments), ...judgeTimelines(out.timelines)];
|
|
240
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export const RULES_FILES = ['src/rules.ts', 'src/sim/rules.ts', 'src/sim/index.ts', 'src/logic/rules.ts', 'src/logic/index.ts', 'src/rules/index.ts'];
|
|
4
|
+
export function rulesModule(dir) {
|
|
5
|
+
const rel = RULES_FILES.find((f) => existsSync(join(dir, f)));
|
|
6
|
+
if (!rel)
|
|
7
|
+
return null;
|
|
8
|
+
const text = readFileSync(join(dir, rel), 'utf8');
|
|
9
|
+
const names = new Set();
|
|
10
|
+
for (const m of text.matchAll(/^export\s+(?:async\s+)?(?:function\*?|const|let|class|enum)\s+([A-Za-z_$][\w$]*)/gm))
|
|
11
|
+
names.add(m[1]);
|
|
12
|
+
for (const m of text.matchAll(/^export\s*\{([^}]+)\}/gm))
|
|
13
|
+
for (const n of m[1].split(',')) {
|
|
14
|
+
const x = n.trim().split(/\s+as\s+/).pop().trim();
|
|
15
|
+
if (/^[A-Za-z_$][\w$]*$/.test(x))
|
|
16
|
+
names.add(x);
|
|
17
|
+
}
|
|
18
|
+
return { rel, exports: [...names] };
|
|
19
|
+
}
|
|
20
|
+
export const UNWIRED = 'is not wired yet';
|
|
21
|
+
export function probeSkeleton(dir) {
|
|
22
|
+
return probeSkeletonFor(rulesModule(dir), 'funtools upgrade');
|
|
23
|
+
}
|
|
24
|
+
export function probeSkeletonFor(mod, writer) {
|
|
25
|
+
const from = mod ? `../${mod.rel}` : '../src/rules.ts';
|
|
26
|
+
const listed = mod?.exports.length ? mod.exports.join(', ') : '(none found: export the rules first)';
|
|
27
|
+
const imports = mod
|
|
28
|
+
? `import * as rules from '${from}';\n`
|
|
29
|
+
: `// TODO: your rules, engine-free beside the game (skill funpixel-game-logic), then:\n// import * as rules from '${from}';\n`;
|
|
30
|
+
return `// test/probes.ts — the rules played by five policies over 100 seeds, for \`npx @funpixel/tools sim\`.
|
|
31
|
+
// Written by ${writer} for this game: ${mod ? `${mod.rel} exports ${listed}` : 'no rules module yet (src/rules.ts is yours to write)'}.
|
|
32
|
+
// Fill the five marked places (TODO 1–5) with your own rules; each policy sees only what a player could see.
|
|
33
|
+
// Until they are filled, \`sim\` fails: the bots never played the rules (a naive bot that loses and a
|
|
34
|
+
// skilled one that wins some is the core test's gate). When the rules change, change this file in the
|
|
35
|
+
// same step: sim reads it every round (play length, standing still wins, the skill ceiling). Shape and
|
|
36
|
+
// worked examples: skill funpixel-game-logic, references/probes.md. Run: node test/probes.ts
|
|
37
|
+
|
|
38
|
+
${imports}import { cohort, type Policy, type ProbeGame } from '../src/probe-kit.ts';
|
|
39
|
+
|
|
40
|
+
type Run = any; // TODO 1. the run's state type from your rules (e.g. ReturnType<typeof rules.newRun>)
|
|
41
|
+
type Input = number; // TODO 2. what a player presses each step (a direction, a tap at x, nothing)
|
|
42
|
+
const todo = (what: string): never => { throw new Error(\`test/probes.ts ${UNWIRED}: \${what} (skill funpixel-game-logic, references/probes.md)\`); };
|
|
43
|
+
${mod ? 'void rules;\n' : ''}
|
|
44
|
+
const game: ProbeGame<Run, Input> = {
|
|
45
|
+
dt: 1 / 60,
|
|
46
|
+
newRun: (seed) => todo(\`newRun(\${seed}): start a seeded run from your rules\`), // TODO 3. start, advance, end
|
|
47
|
+
step: () => todo('step(run, input): advance one dt with the input, return events as { type }'),
|
|
48
|
+
outcome: () => todo("outcome(run): 'won' | 'lost' | null"),
|
|
49
|
+
progress: () => todo('progress(run): how far it got (score, level, waves)'),
|
|
50
|
+
// level: (run) => run.level, // TODO 4. with levels, stages or waves: sim splits play length by level
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// TODO 5. the players: idle never presses; naive steers straight at the goal (it must LOSE some runs);
|
|
54
|
+
// skilled plays as the how-to teaches (at a human pace it must WIN some); then taught, novice, middle.
|
|
55
|
+
const policies: Policy<Run, Input>[] = [
|
|
56
|
+
{ name: 'idle', role: 'idle', says: 'never presses', make: () => () => 0 },
|
|
57
|
+
{ name: 'naive', role: 'naive', says: 'steers straight at the goal, never reads a threat', make: () => () => todo('the naive policy: press toward the goal every step') },
|
|
58
|
+
{ name: 'skilled', role: 'skilled', says: 'plays as the how-to teaches', make: () => () => todo('the skilled policy: read what the player sees, answer it') },
|
|
59
|
+
];
|
|
60
|
+
|
|
61
|
+
const seeds = Array.from({ length: 100 }, (_, i) => i + 1);
|
|
62
|
+
// Seconds per run: past the length the game means to have (sim's floor is 15 min and an ending: ProbeGame.ended).
|
|
63
|
+
console.log(JSON.stringify({ probes: 1, cohorts: policies.map((p) => cohort(game, p, seeds, 960)) }));
|
|
64
|
+
`;
|
|
65
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { randomBytes } from 'node:crypto';
|
|
2
|
+
import { mkdir, readdir, readFile, rename, rm, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { alive } from "../machine/procs.js";
|
|
5
|
+
import { guarded, isUdid, LEASE_PREFIX, parseDevices, parseDeviceTypes, parseRuntimes, pickDeviceType, pickRuntime } from "./simctl.js";
|
|
6
|
+
export const DEFAULT_DEVICE = 'iPhone 17 Pro';
|
|
7
|
+
const file = (root, udid) => join(root, `${udid.toUpperCase()}.json`);
|
|
8
|
+
export async function readLeases(root) {
|
|
9
|
+
let names = [];
|
|
10
|
+
try {
|
|
11
|
+
names = await readdir(root);
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
const out = [];
|
|
17
|
+
for (const n of names.filter((x) => x.endsWith('.json'))) {
|
|
18
|
+
try {
|
|
19
|
+
out.push(JSON.parse(await readFile(join(root, n), 'utf8')));
|
|
20
|
+
}
|
|
21
|
+
catch { }
|
|
22
|
+
}
|
|
23
|
+
return out.sort((a, b) => a.created.localeCompare(b.created));
|
|
24
|
+
}
|
|
25
|
+
export async function readLease(root, udid) {
|
|
26
|
+
try {
|
|
27
|
+
return JSON.parse(await readFile(file(root, udid), 'utf8'));
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export async function writeLease(root, l) {
|
|
34
|
+
await mkdir(root, { recursive: true });
|
|
35
|
+
const f = file(root, l.udid);
|
|
36
|
+
const tmp = `${f}.${randomBytes(3).toString('hex')}.tmp`;
|
|
37
|
+
await writeFile(tmp, JSON.stringify(l, null, 2) + '\n');
|
|
38
|
+
await rename(tmp, f);
|
|
39
|
+
}
|
|
40
|
+
const ours = (leases, devices) => (udid) => {
|
|
41
|
+
const u = udid.toUpperCase();
|
|
42
|
+
return leases.some((l) => l.udid.toUpperCase() === u) && devices.some((d) => d.udid.toUpperCase() === u && d.name.startsWith(LEASE_PREFIX));
|
|
43
|
+
};
|
|
44
|
+
async function devices(run) {
|
|
45
|
+
return parseDevices(await run(['list', 'devices', '-j'], 30_000));
|
|
46
|
+
}
|
|
47
|
+
export async function lease(o, d) {
|
|
48
|
+
const types = parseDeviceTypes(await d.simctl(['list', 'devicetypes', '-j'], 30_000));
|
|
49
|
+
const type = pickDeviceType(types, o.device ?? DEFAULT_DEVICE);
|
|
50
|
+
if (!type)
|
|
51
|
+
return { ok: false, message: `no simulator device type "${o.device ?? DEFAULT_DEVICE}" — \`xcrun simctl list devicetypes\` lists them` };
|
|
52
|
+
const rt = pickRuntime(parseRuntimes(await d.simctl(['list', 'runtimes', '-j'], 30_000)), type, o.runtime);
|
|
53
|
+
if (!rt)
|
|
54
|
+
return { ok: false, message: o.runtime ? `no available runtime "${o.runtime}" for ${type.name} — \`xcrun simctl list runtimes\` lists them` : `no available iOS runtime for ${type.name} (Xcode → Settings → Components installs one)` };
|
|
55
|
+
const name = `${LEASE_PREFIX}${randomBytes(4).toString('hex')}`;
|
|
56
|
+
const udid = (await d.simctl(['create', name, type.identifier, rt.identifier], 120_000)).trim().split('\n').pop().trim();
|
|
57
|
+
if (!isUdid(udid))
|
|
58
|
+
return { ok: false, message: `simctl create answered "${udid}", not a udid` };
|
|
59
|
+
const procs = await d.procs();
|
|
60
|
+
const l = {
|
|
61
|
+
udid, name, device: type.name, runtime: rt.name, owner_pid: d.ownerPid,
|
|
62
|
+
owner: procs.find((p) => p.pid === d.ownerPid)?.args.slice(0, 120) ?? '?', session: d.session, cwd: d.cwd, created: new Date(d.now()).toISOString(),
|
|
63
|
+
};
|
|
64
|
+
await writeLease(d.root, l);
|
|
65
|
+
if (!o.boot)
|
|
66
|
+
return { ok: true, lease: l, booted: false };
|
|
67
|
+
const run = guarded(d.simctl, ours([l], [{ udid, name, state: 'Shutdown', runtime: rt.identifier }]));
|
|
68
|
+
try {
|
|
69
|
+
await run(['boot', udid], 240_000);
|
|
70
|
+
await run(['bootstatus', udid, '-b'], 240_000);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
await run(['shutdown', udid], 120_000).catch(() => '');
|
|
74
|
+
await run(['delete', udid], 120_000).catch(() => '');
|
|
75
|
+
await rm(file(d.root, udid), { force: true });
|
|
76
|
+
return { ok: false, message: `${name} would not boot (deleted again): ${e.message}` };
|
|
77
|
+
}
|
|
78
|
+
return { ok: true, lease: l, booted: true };
|
|
79
|
+
}
|
|
80
|
+
export async function release(udid, o, d) {
|
|
81
|
+
if (!isUdid(udid))
|
|
82
|
+
return { ok: false, message: `${udid} is not a udid (funtools sim list shows the leases)` };
|
|
83
|
+
const l = await readLease(d.root, udid);
|
|
84
|
+
if (!l)
|
|
85
|
+
return { ok: false, message: `${udid} is not a funtools lease — funtools only releases simulators it created (funtools sim list)` };
|
|
86
|
+
const devs = await devices(d.simctl);
|
|
87
|
+
const dev = devs.find((x) => x.udid.toUpperCase() === udid.toUpperCase());
|
|
88
|
+
if (!dev) {
|
|
89
|
+
await rm(file(d.root, udid), { force: true });
|
|
90
|
+
return { ok: true, lease: l, note: 'the device was already gone; its record is removed' };
|
|
91
|
+
}
|
|
92
|
+
if (!dev.name.startsWith(LEASE_PREFIX))
|
|
93
|
+
return { ok: false, message: `${udid} is named "${dev.name}", not ${LEASE_PREFIX}…: a record names it but funtools did not create it, so it is left alone` };
|
|
94
|
+
const procs = await d.procs();
|
|
95
|
+
if (!o.force && l.owner_pid !== d.ownerPid && alive(procs, l.owner_pid)) {
|
|
96
|
+
return { ok: false, message: `${l.name} belongs to session ${l.session} (pid ${l.owner_pid}, still running) — releasing it would end that agent's run; pass --force only if it is yours` };
|
|
97
|
+
}
|
|
98
|
+
const run = guarded(d.simctl, ours([l], devs));
|
|
99
|
+
if (dev.state !== 'Shutdown')
|
|
100
|
+
await run(['shutdown', udid], 120_000).catch((e) => { if (!/current state: Shutdown/i.test(e.message))
|
|
101
|
+
throw e; return ''; });
|
|
102
|
+
await run(['delete', udid], 120_000);
|
|
103
|
+
await rm(file(d.root, udid), { force: true });
|
|
104
|
+
return { ok: true, lease: l };
|
|
105
|
+
}
|
|
106
|
+
export async function list(d) {
|
|
107
|
+
const leases = await readLeases(d.root);
|
|
108
|
+
const devs = await devices(d.simctl);
|
|
109
|
+
const procs = await d.procs();
|
|
110
|
+
const rows = leases.map((l) => ({ lease: l, device: devs.find((x) => x.udid.toUpperCase() === l.udid.toUpperCase()) ?? null, owner_alive: alive(procs, l.owner_pid), orphan: false }));
|
|
111
|
+
for (const dev of devs)
|
|
112
|
+
if (dev.name.startsWith(LEASE_PREFIX) && !leases.some((l) => l.udid.toUpperCase() === dev.udid.toUpperCase()))
|
|
113
|
+
rows.push({ lease: null, device: dev, owner_alive: false, orphan: true });
|
|
114
|
+
return rows;
|
|
115
|
+
}
|
|
116
|
+
export async function gc(o, d) {
|
|
117
|
+
const rows = await list(d);
|
|
118
|
+
const out = { released: [], deleted_orphans: [], kept: [], dry_run: o.dryRun };
|
|
119
|
+
const leases = rows.flatMap((r) => (r.lease ? [r.lease] : []));
|
|
120
|
+
const devs = await devices(d.simctl);
|
|
121
|
+
const orphanIds = new Set(rows.filter((r) => r.orphan && r.device?.state === 'Shutdown').map((r) => r.device.udid.toUpperCase()));
|
|
122
|
+
const run = guarded(d.simctl, (u) => ours(leases, devs)(u) || (orphanIds.has(u.toUpperCase()) && devs.some((x) => x.udid.toUpperCase() === u.toUpperCase() && x.name.startsWith(LEASE_PREFIX))));
|
|
123
|
+
for (const r of rows) {
|
|
124
|
+
if (r.lease && r.owner_alive) {
|
|
125
|
+
out.kept.push({ name: r.lease.name, why: `owner pid ${r.lease.owner_pid} is running` });
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (r.lease && !r.device) {
|
|
129
|
+
if (!o.dryRun)
|
|
130
|
+
await rm(file(d.root, r.lease.udid), { force: true });
|
|
131
|
+
out.released.push(r.lease);
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
if (r.lease && r.device) {
|
|
135
|
+
if (!r.device.name.startsWith(LEASE_PREFIX)) {
|
|
136
|
+
out.kept.push({ name: r.device.name, why: 'recorded, but not an ft-lease-* device: left alone' });
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (!o.dryRun) {
|
|
140
|
+
if (r.device.state !== 'Shutdown')
|
|
141
|
+
await run(['shutdown', r.device.udid], 120_000).catch(() => '');
|
|
142
|
+
await run(['delete', r.device.udid], 120_000);
|
|
143
|
+
await rm(file(d.root, r.lease.udid), { force: true });
|
|
144
|
+
}
|
|
145
|
+
out.released.push(r.lease);
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
if (r.orphan && r.device) {
|
|
149
|
+
if (r.device.state !== 'Shutdown') {
|
|
150
|
+
out.kept.push({ name: r.device.name, why: `no record and ${r.device.state}: it may be in use, so it is left running; the next gc deletes it once it is shut down` });
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
if (!o.dryRun)
|
|
154
|
+
await run(['delete', r.device.udid], 120_000);
|
|
155
|
+
out.deleted_orphans.push(r.device);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export const ORIENTATIONS = ['portrait', 'portrait-upside-down', 'landscape', 'landscape-left', 'landscape-right'];
|
|
2
|
+
export function orientationOf(word) {
|
|
3
|
+
const w = word.toLowerCase();
|
|
4
|
+
if (w === 'landscape')
|
|
5
|
+
return 'landscape-left';
|
|
6
|
+
return ['portrait', 'portrait-upside-down', 'landscape-left', 'landscape-right'].find((o) => o === w) ?? null;
|
|
7
|
+
}
|
|
8
|
+
export function rotation(o) {
|
|
9
|
+
return o === 'landscape-left' ? 90 : o === 'landscape-right' ? 270 : o === 'portrait-upside-down' ? 180 : 0;
|
|
10
|
+
}
|
|
11
|
+
export function uprightSize(o, w, h) {
|
|
12
|
+
return o === 'landscape-left' || o === 'landscape-right' ? { width: h, height: w } : { width: w, height: h };
|
|
13
|
+
}
|
|
14
|
+
export function toDevice(o, x, y, w, h) {
|
|
15
|
+
switch (o) {
|
|
16
|
+
case 'landscape-left': return { x: y, y: h - x };
|
|
17
|
+
case 'landscape-right': return { x: w - y, y: x };
|
|
18
|
+
case 'portrait-upside-down': return { x: w - x, y: h - y };
|
|
19
|
+
default: return { x, y };
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
export function toUpright(o, x, y, w, h) {
|
|
23
|
+
switch (o) {
|
|
24
|
+
case 'landscape-left': return { x: h - y, y: x };
|
|
25
|
+
case 'landscape-right': return { x: y, y: w - x };
|
|
26
|
+
case 'portrait-upside-down': return { x: w - x, y: h - y };
|
|
27
|
+
default: return { x, y };
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
const PLIST = {
|
|
31
|
+
UIInterfaceOrientationPortrait: 'portrait',
|
|
32
|
+
UIInterfaceOrientationPortraitUpsideDown: 'portrait-upside-down',
|
|
33
|
+
UIInterfaceOrientationLandscapeLeft: 'landscape-left',
|
|
34
|
+
UIInterfaceOrientationLandscapeRight: 'landscape-right',
|
|
35
|
+
};
|
|
36
|
+
export function appOrientation(plist, family = 'iphone') {
|
|
37
|
+
const list = (plist[`UISupportedInterfaceOrientations~${family}`] ?? plist.UISupportedInterfaceOrientations);
|
|
38
|
+
const supported = Array.isArray(list) ? list.map(String).filter((s) => s in PLIST) : [];
|
|
39
|
+
const initial = typeof plist.UIInterfaceOrientation === 'string' && plist.UIInterfaceOrientation in PLIST ? plist.UIInterfaceOrientation : null;
|
|
40
|
+
if (supported.includes('UIInterfaceOrientationPortrait'))
|
|
41
|
+
return { orientation: 'portrait', from: 'supports portrait' };
|
|
42
|
+
if (initial && (!supported.length || supported.includes(initial)))
|
|
43
|
+
return { orientation: PLIST[initial], from: `UIInterfaceOrientation ${initial}` };
|
|
44
|
+
const land = supported.find((s) => /Landscape/.test(s));
|
|
45
|
+
if (land)
|
|
46
|
+
return { orientation: PLIST[land], from: `UISupportedInterfaceOrientations ${land}` };
|
|
47
|
+
if (supported.length)
|
|
48
|
+
return { orientation: PLIST[supported[0]], from: `UISupportedInterfaceOrientations ${supported[0]}` };
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
export function runningApps(launchctl) {
|
|
52
|
+
const out = new Set();
|
|
53
|
+
for (const m of launchctl.matchAll(/UIKitApplication:([A-Za-z0-9._-]+)\[/g))
|
|
54
|
+
if (!m[1].startsWith('com.apple.'))
|
|
55
|
+
out.add(m[1]);
|
|
56
|
+
return [...out];
|
|
57
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { homedir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import { findBaguette, INSTALL as BAGUETTE_INSTALL } from "../phone/baguette.js";
|
|
6
|
+
import { appOrientation, orientationOf, rotation, runningApps, toDevice, uprightSize } from "./orient.js";
|
|
7
|
+
import { parseDevices, parseDeviceTypes } from "./simctl.js";
|
|
8
|
+
export const IDB_INSTALL = 'brew install facebook/fb/idb-companion && pipx install fb-idb';
|
|
9
|
+
export const readPlist = (f) => new Promise((ok) => {
|
|
10
|
+
execFile('plutil', ['-convert', 'json', '-o', '-', f], { timeout: 15_000, maxBuffer: 16 * 1024 * 1024 }, (err, stdout) => {
|
|
11
|
+
if (err)
|
|
12
|
+
return ok(null);
|
|
13
|
+
try {
|
|
14
|
+
ok(JSON.parse(String(stdout)));
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
ok(null);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
});
|
|
21
|
+
export const sipsRotate = (f, deg) => new Promise((ok, fail) => {
|
|
22
|
+
if (!deg)
|
|
23
|
+
return ok();
|
|
24
|
+
execFile('sips', ['-r', String(deg), f], { timeout: 30_000 }, (err, _o, stderr) => (err ? fail(new Error(`sips: ${String(stderr || err.message).trim()}`)) : ok()));
|
|
25
|
+
});
|
|
26
|
+
export async function geometry(dev, simctl, plist) {
|
|
27
|
+
const t = parseDeviceTypes(await simctl(['list', 'devicetypes', '-j'], 30_000)).find((x) => x.identifier === dev.deviceTypeIdentifier || x.name === dev.name);
|
|
28
|
+
if (!t?.bundlePath)
|
|
29
|
+
return null;
|
|
30
|
+
const p = await plist(join(t.bundlePath, 'Contents', 'Resources', 'profile.plist'));
|
|
31
|
+
const w = Number(p?.mainScreenWidth), h = Number(p?.mainScreenHeight), s = Number(p?.mainScreenScale);
|
|
32
|
+
return w > 0 && h > 0 && s > 0 ? { width: Math.min(w, h), height: Math.max(w, h), scale: s } : null;
|
|
33
|
+
}
|
|
34
|
+
export async function device(udid, simctl) {
|
|
35
|
+
return parseDevices(await simctl(['list', 'devices', '-j'], 30_000)).find((d) => d.udid.toUpperCase() === udid.toUpperCase()) ?? null;
|
|
36
|
+
}
|
|
37
|
+
export async function stand(udid, o, simctl, plist) {
|
|
38
|
+
const asked = o.orientation ? orientationOf(o.orientation) : null;
|
|
39
|
+
if (o.orientation && !asked)
|
|
40
|
+
return { error: `--orientation ${o.orientation}: portrait, landscape, landscape-left, landscape-right or portrait-upside-down` };
|
|
41
|
+
if (asked && o.orientation !== 'landscape')
|
|
42
|
+
return { orientation: asked, from: `--orientation ${o.orientation}` };
|
|
43
|
+
let app = o.app;
|
|
44
|
+
if (!app) {
|
|
45
|
+
const apps = runningApps(await simctl(['spawn', udid, 'launchctl', 'list'], 30_000).catch(() => ''));
|
|
46
|
+
if (apps.length === 1)
|
|
47
|
+
app = apps[0];
|
|
48
|
+
}
|
|
49
|
+
if (app) {
|
|
50
|
+
const path = (await simctl(['get_app_container', udid, app, 'app'], 30_000).catch(() => '')).trim();
|
|
51
|
+
const info = path ? await plist(join(path, 'Info.plist')) : null;
|
|
52
|
+
const got = info ? appOrientation(info) : null;
|
|
53
|
+
if (got && (!asked || got.orientation.startsWith('landscape')))
|
|
54
|
+
return { orientation: got.orientation, from: `${app} Info.plist (${got.from})`, app };
|
|
55
|
+
if (o.app && !path)
|
|
56
|
+
return { error: `${o.app} is not installed on ${udid}` };
|
|
57
|
+
}
|
|
58
|
+
if (asked)
|
|
59
|
+
return { orientation: asked, from: '--orientation landscape (landscape-left; pass landscape-right if the picture comes back upside down)' };
|
|
60
|
+
if (o.remembered)
|
|
61
|
+
return { orientation: o.remembered, from: 'the orientation this lease last used' };
|
|
62
|
+
return { orientation: 'portrait', from: 'no app orientation found: portrait (pass --orientation or --app)' };
|
|
63
|
+
}
|
|
64
|
+
export async function shot(udid, out, st, d) {
|
|
65
|
+
await d.simctl(['io', udid, 'screenshot', '--type=png', out], 60_000);
|
|
66
|
+
const deg = rotation(st.orientation);
|
|
67
|
+
await d.rotate(out, deg);
|
|
68
|
+
const dev = await device(udid, d.simctl);
|
|
69
|
+
const g = dev ? await geometry(dev, d.simctl, d.plist) : null;
|
|
70
|
+
return { file: out, orientation: st.orientation, from: st.from, rotated: deg, size: g ? uprightSize(st.orientation, g.width, g.height) : null };
|
|
71
|
+
}
|
|
72
|
+
export const runTool = (bin, args) => new Promise((ok, fail) => {
|
|
73
|
+
execFile(bin, args, { timeout: 30_000 }, (err, _o, stderr) => (err ? fail(new Error(`${bin.split('/').pop()} ${args[0]}: ${String(stderr || err.message).trim().split('\n').slice(-2).join(' ')}`)) : ok()));
|
|
74
|
+
});
|
|
75
|
+
export function findTapTool(env = process.env, prefer) {
|
|
76
|
+
const b = findBaguette(env);
|
|
77
|
+
let i = null;
|
|
78
|
+
for (const d of [...(env.PATH ?? '').split(':'), join(homedir(), '.local', 'bin'), '/opt/homebrew/bin'].filter(Boolean))
|
|
79
|
+
if (existsSync(join(d, 'idb'))) {
|
|
80
|
+
i = join(d, 'idb');
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
if (prefer === 'idb')
|
|
84
|
+
return i ? { kind: 'idb', bin: i } : null;
|
|
85
|
+
if (prefer === 'baguette')
|
|
86
|
+
return b ? { kind: 'baguette', bin: b } : null;
|
|
87
|
+
return b ? { kind: 'baguette', bin: b } : i ? { kind: 'idb', bin: i } : null;
|
|
88
|
+
}
|
|
89
|
+
export const NO_TAP_TOOL = `simctl cannot tap a simulator, and neither baguette nor idb is installed: ${BAGUETTE_INSTALL} (what funtools phone uses), or ${IDB_INSTALL}`;
|
|
90
|
+
export async function tap(udid, x, y, o, d) {
|
|
91
|
+
if (!d.tool)
|
|
92
|
+
return { error: NO_TAP_TOOL };
|
|
93
|
+
const dev = await device(udid, d.simctl);
|
|
94
|
+
if (!dev)
|
|
95
|
+
return { error: `no simulator ${udid}` };
|
|
96
|
+
if (dev.state !== 'Booted')
|
|
97
|
+
return { error: `${dev.name} is ${dev.state}, not booted` };
|
|
98
|
+
const g = await geometry(dev, d.simctl, d.plist);
|
|
99
|
+
if (!g)
|
|
100
|
+
return { error: `the screen size of ${dev.name} is unknown (no profile.plist for its device type)` };
|
|
101
|
+
const w = g.width / g.scale, h = g.height / g.scale;
|
|
102
|
+
const px = o.points ? x : x / g.scale, py = o.points ? y : y / g.scale;
|
|
103
|
+
const up = uprightSize(o.stand.orientation, w, h);
|
|
104
|
+
if (px < 0 || py < 0 || px > up.width || py > up.height)
|
|
105
|
+
return { error: `(${x}, ${y}) is off the ${o.stand.orientation} screen (${Math.round(up.width * (o.points ? 1 : g.scale))}x${Math.round(up.height * (o.points ? 1 : g.scale))} ${o.points ? 'points' : 'pixels'})` };
|
|
106
|
+
const p = toDevice(o.stand.orientation, px, py, w, h);
|
|
107
|
+
const pt = { x: Math.round(p.x * 10) / 10, y: Math.round(p.y * 10) / 10 };
|
|
108
|
+
if (d.tool.kind === 'baguette')
|
|
109
|
+
await d.run(d.tool.bin, ['tap', '--udid', udid, '--x', String(pt.x), '--y', String(pt.y), '--width', String(w), '--height', String(h)]);
|
|
110
|
+
else
|
|
111
|
+
await d.run(d.tool.bin, ['ui', 'tap', String(Math.round(pt.x)), String(Math.round(pt.y)), '--udid', udid]);
|
|
112
|
+
return { tool: d.tool.kind, game: { x, y }, device_points: pt, orientation: o.stand.orientation, from: o.stand.from };
|
|
113
|
+
}
|