@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,929 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { existsSync, readdirSync, readFileSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { BAR_DEFAULT, fixList, fixSummary, STRETCH_DEFAULT } from "../direct/round.js";
|
|
5
|
+
import { roomsGate, specHash } from "../spec/rooms.js";
|
|
6
|
+
import { firstLookSet, missingLines, SET_RUN } from "../firstlook/set.js";
|
|
7
|
+
import { worthGate, PROTOTYPE_STAGE } from "../gdd/worth.js";
|
|
8
|
+
import { chaptersGate } from "../gdd/chapters.js";
|
|
9
|
+
import { readKeep } from "../playtest/keep.js";
|
|
10
|
+
import { readsUnchanged, sceneReads } from "../verify/reads.js";
|
|
11
|
+
export const PIPELINE_FILE = join('design', 'pipeline.json');
|
|
12
|
+
const T = 'npx @funpixel/tools';
|
|
13
|
+
export const ACCURACY_DEFAULT = BAR_DEFAULT;
|
|
14
|
+
export const PANEL_DEFAULT = 7.3;
|
|
15
|
+
export const CATALOGUE = {
|
|
16
|
+
pitch: {
|
|
17
|
+
title: 'Invent and pitch',
|
|
18
|
+
why: 'a game whose answers are generic loses to one that invented something (an A/B, 3 of 3 seats)',
|
|
19
|
+
gates: [{ kind: 'gdd', headings: ['The invention'] }, { kind: 'studio' }, { kind: 'worth' }],
|
|
20
|
+
rules: [
|
|
21
|
+
'Answer the six forcing questions for THIS game in the GDD\'s `## The invention`: what the core object means, why the verb exists in this world, who wants what (names), what the twist costs, the one system that lives, what only this game has. A generic answer means the idea is not there yet.',
|
|
22
|
+
'A hit per axis (mechanic, feel, touch controls, layout, satisfaction, readability, market) with what you take, what you avoid and a source.',
|
|
23
|
+
`Pitch the choices as cards (\`${T} pitch\`): genre and fidelity, depth, the core that burns, story standard, extras with their cost.`,
|
|
24
|
+
'Scaffold after the GDD names the genre and the controls, not before.',
|
|
25
|
+
`Worth building at this length? Challenge the owner with numbers before the rest of the first look's art (the opening's key art and hero sheet come first, and the first playable; this read follows what the owner played): \`## The numbers\` say how long one flight/run/level lasts and how many there are, \`## Content list\` counts the places, verbs, characters and meta, and \`## Worth against the genre\` holds 3–5 of the genre's best (length, places, verbs, characters, progression; every number with a source URL or "approx, from memory"). \`${T} greenlight worth\` computes the minutes the plan supplies against the owner's target and gives one verdict: fits, stretch (what to add), does not carry (shrink, reshape or drop) or prove the core first. Recommend dropping a weak idea when the numbers say so.`,
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
'key-look': {
|
|
29
|
+
title: 'First look: the key art and the hero',
|
|
30
|
+
why: 'the owner steers a picture before a model, a sound or code is paid for; the first playable is built from it and judged against it',
|
|
31
|
+
gates: [{ kind: 'refs', min: 1 }, { kind: 'targets', min: 1 }, { kind: 'owner' }],
|
|
32
|
+
rules: [
|
|
33
|
+
'From the confirmed brief, two pictures only: the key art (the game\'s look in its own light, at the play framing: desktop 1280x720, phone held sideways 852x393, named as a target) and the hero\'s reference sheet (ref-*.png, the one the model is made from).',
|
|
34
|
+
`Show both in the chat and take the owner's words ("warmer", "darker", "yes") before any model, sound or code is paid for; the stage ends on their yes (\`${T} note verdict key-look accept "<their words>"\`), a "not this" redraws.`,
|
|
35
|
+
`A look drawn in code (budget 0, or the owner's code-drawn choice): both pictures are composed from the game's own draw module on design/first-look/draw.html and rendered to PNG (\`${T} firstlook render\`; skill funpixel-gdd, references/first-look.md, "Drawn in code"), never a capture of play.`,
|
|
36
|
+
'The rest of the first look (screens, HUD, places, the living world, animation) grows later, while the game is planned around the first playable.',
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
[PROTOTYPE_STAGE]: {
|
|
40
|
+
title: 'A first playable that already looks like the game',
|
|
41
|
+
why: 'the owner plays something real and nice before the whole game is planned, and says whether it has potential (owner, 5 Oct: "plan the first look, develop, then iterate if we see potential")',
|
|
42
|
+
gates: [{ kind: 'verify' }, { kind: 'world' }, { kind: 'owner' }],
|
|
43
|
+
rules: [
|
|
44
|
+
'Sized by the game: a short game (small) about 1 minute, mostly the place: its look, light, sound and the verb once; a mid game 2 to 3 minutes; a long game (deep) 3 to 5 minutes: the core loop once through, a win and a loss.',
|
|
45
|
+
'Short in CONTENT, never bare in LOOK: built in the game itself (the starter, its framework and real camera; a 3D game in 3D) with real assets made from the key art and the hero sheet: the hero (rigged and moving where it moves), the sky and the place in the key art\'s light, the title art, a music loop and the verb\'s sounds. No stand-in shapes where a planned piece belongs.',
|
|
46
|
+
`Judge it before the owner sees it: the key art is its target (\`${T} score --target\`), \`${T} check --front-door\`, and a blind player on a long game (\`${T} play --viewport phone\`).`,
|
|
47
|
+
`Show it in the chat with captures and the preview link. The owner plays it and says whether it has potential: \`${T} note verdict ${PROTOTYPE_STAGE} accept "<their words>"\` plans the whole game around it; their "not this" changes direction (a new key art) or drops the idea.`,
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
lock: {
|
|
51
|
+
title: 'Pick and lock the core',
|
|
52
|
+
why: 'effort, art budget and checks concentrate on what was picked; the rest stays light',
|
|
53
|
+
gates: [{ kind: 'pitch-locked' }],
|
|
54
|
+
rules: [
|
|
55
|
+
`The owner picks: \`${T} pitch ask\` puts each choice to the owner in the chat (taste, spend, scope) with your proposal; \`${T} pitch lock\` locks once every choice has their answer (only the owner's own autonomy "go" lets your proposals lock). Autonomy is the owner's setting, never a card.`,
|
|
56
|
+
'Go hard on the locked core; what was not picked stays light or out.',
|
|
57
|
+
`Under autonomy "go", record each pick with its reason (\`${T} decide\`).`,
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
gdd: {
|
|
61
|
+
title: 'The GDD core',
|
|
62
|
+
why: 'a short core the creator owns beats a long template filled in',
|
|
63
|
+
gates: [{ kind: 'gdd', headings: ['Core loop', 'The numbers', 'The hook'] }, { kind: 'gdd', min: 3 }],
|
|
64
|
+
rules: [
|
|
65
|
+
'The core is short and the creator\'s: pitch, invention, core loop, the numbers (each with why exactly that value), the hook, behaviour tests named before code.',
|
|
66
|
+
'Every attack tells 0.6 s or more; teach once, at the element; a camera that never fights the player.',
|
|
67
|
+
'Bodies in a world: one scale sheet in metres (a person 1.75 m), every asset sized from it.',
|
|
68
|
+
'Grow a section when the tier or the game calls for it, never to fill the template.',
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
'first-look': {
|
|
72
|
+
title: 'First look',
|
|
73
|
+
why: 'identity drifts between frames unless it is locked first (one game: 7 of 7 redraws on-model with reference sheets)',
|
|
74
|
+
gates: [{ kind: 'refs', min: 1 }, { kind: 'targets', min: 4 }, { kind: 'kit' }, { kind: 'set' }],
|
|
75
|
+
rules: [
|
|
76
|
+
`The whole game, not a few frames (owner, 4 Oct, asked twice): key art; every screen (the title as the play world, pause, the end; past small settings, results, a level select); the HUD on the phone and the desktop; a frame per place, each tied to a story beat; a living-world sheet; an animation board; a juice board; the sound list; the fun page. \`${T} firstlook\` lists what is missing; places and the living world only for a world game.`,
|
|
77
|
+
'Reference sheets (identity lock) BEFORE moment frames; every recurring design drawn with its references and one verbatim style block.',
|
|
78
|
+
'A target frame per hook moment at the play framing (desktop 1280x720, phone held sideways 852x393).',
|
|
79
|
+
`The world's kit beside the hero: sheets of its made parts (structures, ground, props, the living cast), cut into pieces before the slice (\`${T} cut\`); the slice is built from them, never from plain shapes (a fresh build shipped code-drawn primitives until the owner's note).`,
|
|
80
|
+
'A picture of every place; no two places alike in shape, material, era and light.',
|
|
81
|
+
'The HUD mockup drawn over a target frame.',
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
'core-test': {
|
|
85
|
+
title: 'Core test (A1): the game bites',
|
|
86
|
+
why: 'both builds of one game spent their rounds on looks and the challenge never bit ("no challenges at all")',
|
|
87
|
+
gates: [{ kind: 'tests' }, { kind: 'sim' }],
|
|
88
|
+
rules: [
|
|
89
|
+
`The GDD's named bots play the REAL level (\`${T} sim\`): an engine-free, fixed-step, seeded sim, plus a replay test.`,
|
|
90
|
+
'The naive steer-to-goal bot must be able to lose; a run nobody can lose is no game yet.',
|
|
91
|
+
'A sharp bot that stalls is a broken bot, not a design note: fix the bot before reading the curve.',
|
|
92
|
+
`Named behaviour tests green on the current files (\`${T} test\`).`,
|
|
93
|
+
'Resolve each curve warning, or accept it by id in design/pipeline.json with the reason in the GDD.',
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
slice: {
|
|
97
|
+
title: 'A playable slice',
|
|
98
|
+
why: 'one place in real art and sound, a win and a loss, through the real controls, in a world that reads as made and alive (judged, not claimed)',
|
|
99
|
+
gates: [{ kind: 'verify' }, { kind: 'world' }],
|
|
100
|
+
rules: [
|
|
101
|
+
`\`${T} check --front-door\` (build, tests, verify, and the world: boxes, grounding, life) — or \`npm run build\`, \`${T} verify --front-door\`, then \`${T} check --world\`; exit 2 measured nothing, which is not a pass.`,
|
|
102
|
+
'Never a dead end: a disabled control says why and leads to the fix; pressing it opens the missing step.',
|
|
103
|
+
'Touch controls only for touch input (last input wins).',
|
|
104
|
+
'A living world as it is built: each person animates, walks a task loop through space, idles and answers the player; a crowd is a few focused scenes along the path (fewer people, each readable), never the hero\'s face; creatures have gaits matched to ground speed, flyers flap; a painted cut-out animates too (frames by distance, a bent plane, a hinge), never a picture slid or bobbed; feet on the ground, never inside a prop (skill funpixel-world-and-story, references/living-world.md; expose them in __FPX_ACTORS__).',
|
|
105
|
+
`A made world as it is built: camera-near geometry is the most detailed, never the plainest; every structure the player passes reads as made (shape detail + textures or decals in the palette), matched to the best-painted asset; landed vehicles and big props rest on the ground (\`${T} boxes\`).`,
|
|
106
|
+
'Name every stand-in (state.art.placeholders) and in the hand-back.',
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
chapters: {
|
|
110
|
+
title: 'Chapter by chapter',
|
|
111
|
+
why: 'a long game is built in segments, as studios build theirs after the vertical slice: each chapter planned, made to its own target frames and agreed before the next, so the plan and the asks grow only as far as the game does',
|
|
112
|
+
gates: [{ kind: 'chapters' }],
|
|
113
|
+
rules: [
|
|
114
|
+
'One chapter at a time, in the order of the GDD\'s ## Chapters: plan it with the owner in the chat (its place, what it adds, its story beat, its length), make its target frames first, then build it with its assets and the look-dev loop until each target is close.',
|
|
115
|
+
`Show it in the chat; the owner plays it and says yes (\`${T} note verdict chapter:<id> accept "<their words>"\`), then the next opens. Their "not yet" is the next round on that chapter.`,
|
|
116
|
+
'A chapter extends the game, never redesigns the slice; its levels can be data in design/spec/rooms.json like any room.',
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
expand: {
|
|
120
|
+
title: 'Expand, room by room',
|
|
121
|
+
why: 'our real games are 10 to 18 minutes of designed play, grown room by room from a slice that passed (one plan: "nothing in Rooms 2-6 starts until the slice passes its gates")',
|
|
122
|
+
gates: [{ kind: 'rooms' }],
|
|
123
|
+
rules: [
|
|
124
|
+
`Slice first: a room is opened for building only once the room before it passes (\`${T} rooms open <id>\`); the owner alone releases one early (\`--by owner\`).`,
|
|
125
|
+
`Each room is data in design/spec/rooms.json (par, exit, what it teaches, its numbers), never hand-placed in code; \`${T} rooms\` plays every room with bots over 5 seeds and times each against its par.`,
|
|
126
|
+
'A par is the seconds a good first run takes; the pars add up to the play floor (15 minutes for a complete game). A room far off its par is a guess: fix the room or the par.',
|
|
127
|
+
`Every number a room changes is a tunable (design/spec/tunables.json); \`${T} spec lint\` names a number typed into the code, an id nothing reads, a room without a par or an exit.`,
|
|
128
|
+
],
|
|
129
|
+
},
|
|
130
|
+
hook: {
|
|
131
|
+
title: 'The hook: the first minutes',
|
|
132
|
+
why: 'the title and the first minutes decide whether people keep playing',
|
|
133
|
+
gates: [{ kind: 'hook' }, { kind: 'life' }],
|
|
134
|
+
rules: [
|
|
135
|
+
`Read the title, the real Play and the first minutes (\`${T} hook\`): 2 to 4 wow moments on the clock.`,
|
|
136
|
+
'A loading screen or a staged capture is not a moment: measure from the real Play.',
|
|
137
|
+
`Something alive in every play view: people on task loops that move them through space, idles, reactions to the player, creatures with gaits, flyers that flap; motion without animation slides like a stone, a crowd that only animates in place reads as a still (\`${T} life\`).`,
|
|
138
|
+
'Collisions solid, nothing floating, one scale.',
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
accuracy: {
|
|
142
|
+
title: 'Accuracy to the targets',
|
|
143
|
+
why: 'the owner\'s bar: every moment at 75+ beside its target (90 the stretch), built toward the target round by round',
|
|
144
|
+
gates: [{ kind: 'score' }],
|
|
145
|
+
rules: [
|
|
146
|
+
`Score each moment against its target at the same framing (\`${T} score --target\`, 0 to 100): composition, hero size and pose, identity, palette and light, density, life.`,
|
|
147
|
+
`The bar is funpixel.json \`accuracy_min\` (${ACCURACY_DEFAULT} by default, \`accuracy_stretch\` ${STRETCH_DEFAULT} the stretch); below it the moment goes back with its fix list.`,
|
|
148
|
+
`Each round works down the fix list the score printed (\`${T} score --fixes\`: the camera, the light, the colours, the dressing as numbers), then re-shoots at the same framing; three rounds without a gain ask the owner about scope.`,
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
walk: {
|
|
152
|
+
title: 'World walk',
|
|
153
|
+
why: 'world building is verified by playing, not by stills ("lots of misplaces, collisions, static people")',
|
|
154
|
+
gates: [{ kind: 'walk' }, { kind: 'sim' }],
|
|
155
|
+
rules: [
|
|
156
|
+
`Walk every route from the title as a player, no teleports, filmed from the play camera (\`${T} walk\`).`,
|
|
157
|
+
'Along the way: no clipping, nothing floating (people or the landed ship), one scale, no blocked path unless planned, every person and creature animated and the people moving through space, a few focused scenes with no clumps or empty stretches, no crowd wearing the hero\'s face, no flat boxes near the camera, the challenge visible and a run that can be lost, then retried.',
|
|
158
|
+
`A prologue and the first run are one walk: \`then\` on the route (or \`${T} walk --chain prologue,run01\`), one film from the title.`,
|
|
159
|
+
'A still is not evidence that a world is built; a walk is.',
|
|
160
|
+
],
|
|
161
|
+
},
|
|
162
|
+
'blind-play': {
|
|
163
|
+
title: 'Blind play from the title',
|
|
164
|
+
why: 'blind players from the title found the blockers no panel could',
|
|
165
|
+
gates: [{ kind: 'play' }, { kind: 'sim' }],
|
|
166
|
+
rules: [
|
|
167
|
+
`A blind player from the title, no instructions (\`${T} play\`): a stall counts as blocking.`,
|
|
168
|
+
'A play round counts only when the challenge is proven on the same files: sim fresh, the naive bot can lose.',
|
|
169
|
+
'Read the mid-hold frames for hold verbs.',
|
|
170
|
+
'The owner\'s own phone play is the last word; keep their screenshots as named before-frames.',
|
|
171
|
+
],
|
|
172
|
+
},
|
|
173
|
+
panel: {
|
|
174
|
+
title: 'The panel',
|
|
175
|
+
why: 'blind seats on fresh captures; read the flaw list, not the score',
|
|
176
|
+
gates: [{ kind: 'panel' }],
|
|
177
|
+
rules: [
|
|
178
|
+
`\`${T} playtest\`: fresh captures, blind seats; a passing panel is a floor, not proof of fun.`,
|
|
179
|
+
'Work down the blockers ledger before polishing anything else.',
|
|
180
|
+
],
|
|
181
|
+
},
|
|
182
|
+
publish: {
|
|
183
|
+
title: 'Publish',
|
|
184
|
+
why: 'the person plays it and says yes',
|
|
185
|
+
gates: [{ kind: 'verify' }, { kind: 'owner' }, { kind: 'published' }],
|
|
186
|
+
rules: [
|
|
187
|
+
`\`${T} pack --dry-run\` clean and verify passing on the files that ship, then \`${T} publish\`.`,
|
|
188
|
+
'Finish when the person plays it and says yes; green means stop.',
|
|
189
|
+
],
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
export const TIER_STAGES = {
|
|
193
|
+
small: ['pitch', 'gdd', 'first-look', 'core-test', 'slice', 'hook', 'blind-play', 'publish'],
|
|
194
|
+
mid: ['pitch', 'lock', 'gdd', 'first-look', 'core-test', 'slice', 'expand', 'hook', 'accuracy', 'blind-play', 'panel', 'publish'],
|
|
195
|
+
deep: ['pitch', 'lock', 'gdd', 'first-look', 'core-test', 'slice', 'expand', 'chapters', 'hook', 'accuracy', 'walk', 'blind-play', 'panel', 'publish'],
|
|
196
|
+
};
|
|
197
|
+
export const TIER_NAME = { small: 'nugget (a few minutes)', mid: 'short (15 to 30 minutes)', deep: 'long (an hour or more, chapter by chapter)' };
|
|
198
|
+
export const OPENING_STAGES = ['key-look', PROTOTYPE_STAGE];
|
|
199
|
+
export const SESSION_RULE = 'Never end the session while a background job, subagent or recording runs: a session that ends does not come back. Do the work in the session and wait for it.';
|
|
200
|
+
export function defaultPipeline(tier, now = new Date(), by = 'funtools init', opts = {}) {
|
|
201
|
+
const stages = [...(opts.opening ? OPENING_STAGES : []), ...TIER_STAGES[tier]].map((id) => {
|
|
202
|
+
const c = CATALOGUE[id];
|
|
203
|
+
const gates = id === 'first-look' && tier === 'small' ? [{ kind: 'targets', min: 2 }, ...(opts.world ? [{ kind: 'kit' }] : []), { kind: 'set' }]
|
|
204
|
+
: id === 'publish' && tier === 'small' ? c.gates.filter((g) => g.kind !== 'owner')
|
|
205
|
+
: id === 'gdd' && tier !== 'small' ? [...c.gates, { kind: 'spec' }] : c.gates;
|
|
206
|
+
return { id, title: c.title, gates: gates.map((g) => ({ ...g })), status: 'open' };
|
|
207
|
+
});
|
|
208
|
+
return { version: 1, tier, written_by: by, at: now.toISOString(), stages, notes: [] };
|
|
209
|
+
}
|
|
210
|
+
const readJson = (p) => { try {
|
|
211
|
+
return JSON.parse(readFileSync(p, 'utf8'));
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return null;
|
|
215
|
+
} };
|
|
216
|
+
export function readPipeline(root) {
|
|
217
|
+
const p = readJson(join(root, PIPELINE_FILE));
|
|
218
|
+
if (!p || !Array.isArray(p.stages))
|
|
219
|
+
return null;
|
|
220
|
+
const out = { version: 1, tier: ['small', 'mid', 'deep'].includes(p.tier) ? p.tier : 'small', written_by: String(p.written_by ?? ''), at: String(p.at ?? ''), stages: p.stages.filter((s) => s && typeof s.id === 'string' && Array.isArray(s.gates)), notes: Array.isArray(p.notes) ? p.notes : [], ...(Array.isArray(p.verdicts) ? { verdicts: p.verdicts } : {}), ...(p.dropped?.by === 'owner' ? { dropped: p.dropped } : {}) };
|
|
221
|
+
return withAccuracy(root, withKeyLookOwner(withFreshOwnerPlan(root, out)));
|
|
222
|
+
}
|
|
223
|
+
export function withKeyLookOwner(p) {
|
|
224
|
+
const st = p.stages.find((s) => s.id === 'key-look');
|
|
225
|
+
if (!st || st.status === 'done' || st.status === 'skipped' || st.gates.some((g) => g.kind === 'owner'))
|
|
226
|
+
return p;
|
|
227
|
+
return { ...p, stages: p.stages.map((s) => (s === st ? { ...s, gates: [...s.gates, { kind: 'owner' }] } : s)) };
|
|
228
|
+
}
|
|
229
|
+
export function withAccuracy(root, p) {
|
|
230
|
+
const owed = p.stages.some((s) => s.status !== 'skipped' && s.status !== 'done' && s.gates.some((g) => g.kind === 'targets'));
|
|
231
|
+
if (p.tier !== 'small' || p.stages.some((s) => s.id === 'accuracy') || !(owed || pictures(root).targets.length))
|
|
232
|
+
return p;
|
|
233
|
+
const c = CATALOGUE.accuracy;
|
|
234
|
+
const stage = { id: 'accuracy', title: c.title, gates: c.gates.map((g) => ({ ...g })), status: 'open' };
|
|
235
|
+
const at = (id) => p.stages.findIndex((s) => s.id === id);
|
|
236
|
+
const after = at('hook') >= 0 ? at('hook') + 1 : at('slice') >= 0 ? at('slice') + 1 : at('blind-play') >= 0 ? at('blind-play') : p.stages.length;
|
|
237
|
+
return { ...p, stages: [...p.stages.slice(0, after), stage, ...p.stages.slice(after)] };
|
|
238
|
+
}
|
|
239
|
+
const DESIGN_DOCS = [join('design', 'GDD.md'), join('design', 'README.md'), join('design', 'plan.md')];
|
|
240
|
+
function gddText(root) {
|
|
241
|
+
const found = [];
|
|
242
|
+
for (const rel of DESIGN_DOCS) {
|
|
243
|
+
try {
|
|
244
|
+
found.push({ text: readFileSync(join(root, rel), 'utf8'), rel });
|
|
245
|
+
}
|
|
246
|
+
catch { }
|
|
247
|
+
}
|
|
248
|
+
if (!found.length)
|
|
249
|
+
return null;
|
|
250
|
+
return { text: found.map((f) => f.text).join('\n\n'), rel: found.map((f) => f.rel).join(' + ') };
|
|
251
|
+
}
|
|
252
|
+
function sectionLike(text, heading, min) {
|
|
253
|
+
for (const m of text.matchAll(/^(#{1,4})\s+(.+)$/gm)) {
|
|
254
|
+
if (!heading.test(m[2]))
|
|
255
|
+
continue;
|
|
256
|
+
const body = sectionBody(text, m[2].trim().replace(/\s+/g, ' ').slice(0, 60)) ?? '';
|
|
257
|
+
const words = saysWords(body);
|
|
258
|
+
if (words >= min)
|
|
259
|
+
return { heading: m[2].trim(), words };
|
|
260
|
+
}
|
|
261
|
+
return null;
|
|
262
|
+
}
|
|
263
|
+
function sourceFiles(root) {
|
|
264
|
+
let n = 0;
|
|
265
|
+
const walk = (dir, depth) => {
|
|
266
|
+
if (depth > 4 || n > 200)
|
|
267
|
+
return;
|
|
268
|
+
let names = [];
|
|
269
|
+
try {
|
|
270
|
+
names = readdirSync(join(root, dir));
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
for (const f of names) {
|
|
276
|
+
if (/\.(ts|tsx|js|jsx)$/.test(f))
|
|
277
|
+
n++;
|
|
278
|
+
else if (!f.includes('.') && f !== 'node_modules')
|
|
279
|
+
walk(join(dir, f), depth + 1);
|
|
280
|
+
}
|
|
281
|
+
};
|
|
282
|
+
walk('src', 0);
|
|
283
|
+
return n;
|
|
284
|
+
}
|
|
285
|
+
export function existingEvidence(root) {
|
|
286
|
+
const out = {};
|
|
287
|
+
const doc = gddText(root);
|
|
288
|
+
const m = readJson(join(root, 'funpixel.json')) ?? {};
|
|
289
|
+
const files = sourceFiles(root);
|
|
290
|
+
const building = existsSync(join(root, 'verify.json')) || files >= 8;
|
|
291
|
+
const pitch = doc ? sectionLike(doc.text, PITCH_HEADING, 30) : null;
|
|
292
|
+
if (pitch)
|
|
293
|
+
out.pitch = `${doc.rel} has the pitch (## ${pitch.heading}, ${pitch.words} words)`;
|
|
294
|
+
else if (doc && building && saysWords(doc.text) >= 400)
|
|
295
|
+
out.pitch = `${doc.rel} (${saysWords(doc.text)} words) is the plan this game is built from`;
|
|
296
|
+
if (m.studio?.locked)
|
|
297
|
+
out.lock = 'funpixel.json studio is locked';
|
|
298
|
+
else if (out.pitch && building)
|
|
299
|
+
out.lock = `the plan is already being built (${files} source files${existsSync(join(root, 'verify.json')) ? ', verify.json' : ''})`;
|
|
300
|
+
if (doc && building) {
|
|
301
|
+
const core = CORE_HEADINGS.filter((h) => sectionLike(doc.text, new RegExp(h, 'i'), 8));
|
|
302
|
+
if (core.length >= 2)
|
|
303
|
+
out.gdd = `${doc.rel} covers the core (${core.length} of 4: loop, controls, numbers, hook) and the game is being built`;
|
|
304
|
+
}
|
|
305
|
+
return { ...ownerPlan(root), ...out };
|
|
306
|
+
}
|
|
307
|
+
export const PLANNING_STAGES = new Set(['pitch', 'lock', 'gdd']);
|
|
308
|
+
const DESIGN_WORK_STAGES = new Set([...PLANNING_STAGES, 'key-look', 'first-look']);
|
|
309
|
+
const SIGN_OFF = /\b(signed[- ]off|approved|green-?lit|agreed|locked)\s+(?:by|with)\s+the\s+owner\b/gi;
|
|
310
|
+
const NOT_YET = /\b(?:not|never|no|nor|yet to be|awaits?|awaiting|waits?|waiting|until|before|once|when|if|unless|pending|needs? to be|to be)\b[^.;·\n]{0,30}$/i;
|
|
311
|
+
export function ownerSignOff(head) {
|
|
312
|
+
for (const m of head.matchAll(SIGN_OFF))
|
|
313
|
+
if (!NOT_YET.test(head.slice(Math.max(0, m.index - 40), m.index)))
|
|
314
|
+
return m[0];
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
const HEAD_LINE = /^#\s|\b(?:stage|status|state|version)\b[*_ ]*:|sign|approv|green|agreed|locked/i;
|
|
318
|
+
export function planSig(root) {
|
|
319
|
+
const h = createHash('sha256');
|
|
320
|
+
for (const rel of DESIGN_DOCS) {
|
|
321
|
+
let text = '';
|
|
322
|
+
try {
|
|
323
|
+
text = readFileSync(join(root, rel), 'utf8');
|
|
324
|
+
}
|
|
325
|
+
catch {
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
h.update(`${rel}\n`);
|
|
329
|
+
for (const l of text.slice(0, 4000).split('\n'))
|
|
330
|
+
if (HEAD_LINE.test(l))
|
|
331
|
+
h.update(`${l.trim()}\n`);
|
|
332
|
+
}
|
|
333
|
+
return h.digest('hex').slice(0, 16);
|
|
334
|
+
}
|
|
335
|
+
const FROM_OWNER_PLAN = /^the owner's plan /;
|
|
336
|
+
export function withFreshOwnerPlan(root, p) {
|
|
337
|
+
const from = p.stages.filter((st) => st.status === 'done' && FROM_OWNER_PLAN.test(st.found ?? ''));
|
|
338
|
+
if (!from.length)
|
|
339
|
+
return p;
|
|
340
|
+
const sig = planSig(root);
|
|
341
|
+
if (from.every((st) => st.found_sig === sig))
|
|
342
|
+
return p;
|
|
343
|
+
const now = ownerPlan(root);
|
|
344
|
+
return { ...p, stages: p.stages.map((st) => {
|
|
345
|
+
if (!from.includes(st))
|
|
346
|
+
return st;
|
|
347
|
+
if (now[st.id])
|
|
348
|
+
return { ...st, found: now[st.id], found_sig: sig };
|
|
349
|
+
const { found, found_sig: _sig, done_at: _done, ...rest } = st;
|
|
350
|
+
return { ...rest, status: 'open', reopened: `${st.title} was read as done from "${found}"; the design's head no longer says the owner signed it off, so it is open again (their yes: \`${T} flow agree --by owner\`)` };
|
|
351
|
+
}) };
|
|
352
|
+
}
|
|
353
|
+
const PITCH_HEADING = /pitch|invention|premise|concept|log ?line|the game|overview|elevator|one line|what it is|promise/i;
|
|
354
|
+
const CORE_HEADINGS = ['core loop|gameplay|mechanics?|the loop', 'controls?|input', 'numbers|tuning|balance|values', 'hook|first minutes?|opening|journey'];
|
|
355
|
+
export function ownerPlan(root) {
|
|
356
|
+
for (const rel of DESIGN_DOCS) {
|
|
357
|
+
let text = '';
|
|
358
|
+
try {
|
|
359
|
+
text = readFileSync(join(root, rel), 'utf8');
|
|
360
|
+
}
|
|
361
|
+
catch {
|
|
362
|
+
continue;
|
|
363
|
+
}
|
|
364
|
+
const head = text.slice(0, 4000);
|
|
365
|
+
const agreed = ownerSignOff(head);
|
|
366
|
+
if (!rel.endsWith('plan.md') && (!agreed || /\(starter default\)/.test(text)))
|
|
367
|
+
continue;
|
|
368
|
+
const words = saysWords(text);
|
|
369
|
+
if (words < 400)
|
|
370
|
+
continue;
|
|
371
|
+
const out = {};
|
|
372
|
+
const said = sectionLike(text, PITCH_HEADING, 30);
|
|
373
|
+
const bold = /^\*\*(pitch|the pitch|premise|log ?line|promise)[^*]*:\*\*\s*(.+)$/im.exec(head);
|
|
374
|
+
const pitch = said ? `## ${said.heading}` : bold && saysWords(bold[2]) >= 12 ? `**${bold[1]}:**` : null;
|
|
375
|
+
if (pitch)
|
|
376
|
+
out.pitch = `the owner's plan ${rel} (${words} words) has the pitch (${pitch})`;
|
|
377
|
+
const m = readJson(join(root, 'funpixel.json')) ?? {};
|
|
378
|
+
if (agreed || m.studio?.locked)
|
|
379
|
+
out.lock = `the owner's plan ${rel} is agreed (${agreed ? `"${agreed}"` : 'funpixel.json studio locked'})`;
|
|
380
|
+
const core = CORE_HEADINGS.filter((h) => sectionLike(text, new RegExp(h, 'i'), 8));
|
|
381
|
+
if (core.length >= 2)
|
|
382
|
+
out.gdd = `the owner's plan ${rel} covers the core (${core.length} of 4: loop, controls, numbers, hook)`;
|
|
383
|
+
return out;
|
|
384
|
+
}
|
|
385
|
+
return {};
|
|
386
|
+
}
|
|
387
|
+
export function adoptExisting(p, found, now = new Date(), sig) {
|
|
388
|
+
const marked = [];
|
|
389
|
+
for (const st of p.stages) {
|
|
390
|
+
const why = found[st.id];
|
|
391
|
+
if (!why || st.status === 'done' || st.status === 'skipped')
|
|
392
|
+
continue;
|
|
393
|
+
st.status = 'done';
|
|
394
|
+
st.found = why;
|
|
395
|
+
st.done_at = now.toISOString();
|
|
396
|
+
if (sig && FROM_OWNER_PLAN.test(why))
|
|
397
|
+
st.found_sig = sig;
|
|
398
|
+
marked.push(st.id);
|
|
399
|
+
}
|
|
400
|
+
return marked;
|
|
401
|
+
}
|
|
402
|
+
const NUMBERED = '(?:\\d{1,3}\\s*[.):·–-]?\\s*[·–-]?\\s*|(?:[IVX]{1,5}|[A-Z])\\s*[.):·–-]\\s*)?';
|
|
403
|
+
export function sectionBody(text, heading) {
|
|
404
|
+
const lines = text.split('\n');
|
|
405
|
+
const at = lines.findIndex((l) => new RegExp(`^##+\\s+${NUMBERED}${heading.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}\\b`, 'i').test(l.trim()));
|
|
406
|
+
if (at < 0)
|
|
407
|
+
return null;
|
|
408
|
+
const level = /^(#+)/.exec(lines[at].trim())[1].length;
|
|
409
|
+
const end = lines.findIndex((l, i) => i > at && /^(#+)\s/.test(l.trim()) && /^(#+)/.exec(l.trim())[1].length <= level);
|
|
410
|
+
return lines.slice(at + 1, end < 0 ? lines.length : end).join('\n');
|
|
411
|
+
}
|
|
412
|
+
export function saysWords(body) {
|
|
413
|
+
const clean = body.replace(/<[^>\n]*>/g, ' ').replace(/^\s*\|?[\s:|-]+\|?\s*$/gm, ' ').replace(/[`*_|…]/g, ' ')
|
|
414
|
+
.replace(/^[\s-]*[A-Z][\w ,'()]*:\s*$/gm, ' ');
|
|
415
|
+
return (clean.match(/[A-Za-z]{3,}/g) ?? []).length;
|
|
416
|
+
}
|
|
417
|
+
export function namedTests(text) {
|
|
418
|
+
const body = sectionBody(text, 'Behaviour tests');
|
|
419
|
+
if (!body)
|
|
420
|
+
return [];
|
|
421
|
+
return [...body.matchAll(/^\s*[-*]\s+`([^`<>]{6,})`/gm)].map((m) => m[1].trim());
|
|
422
|
+
}
|
|
423
|
+
function pictures(root) {
|
|
424
|
+
const out = { refs: [], targets: [] };
|
|
425
|
+
for (const rel of [join('design', 'first-look'), join('design', 'look', 'targets'), join('design', 'targets')]) {
|
|
426
|
+
let names = [];
|
|
427
|
+
try {
|
|
428
|
+
names = readdirSync(join(root, rel));
|
|
429
|
+
}
|
|
430
|
+
catch {
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
for (const n of names) {
|
|
434
|
+
if (!/\.(png|jpe?g|webp)$/i.test(n))
|
|
435
|
+
continue;
|
|
436
|
+
(/^ref[-_]/i.test(n) ? out.refs : out.targets).push(join(rel, n));
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
return out;
|
|
440
|
+
}
|
|
441
|
+
export function ownerGates(root) {
|
|
442
|
+
const m = readJson(join(root, 'funpixel.json')) ?? {};
|
|
443
|
+
const og = m.owner_gates && typeof m.owner_gates === 'object' ? m.owner_gates : {};
|
|
444
|
+
const acc = typeof og.accuracy_min === 'number' ? og.accuracy_min : typeof m.accuracy_min === 'number' ? m.accuracy_min : null;
|
|
445
|
+
const panel = typeof og.panel_min === 'number' && og.panel_min >= 0 && og.panel_min <= 10 ? og.panel_min : null;
|
|
446
|
+
return { accuracy_min: acc, evidence: og.evidence === true || og.round_needs_evidence === true, panel_min: panel };
|
|
447
|
+
}
|
|
448
|
+
function latestPlay(root) {
|
|
449
|
+
let names = [];
|
|
450
|
+
try {
|
|
451
|
+
names = readdirSync(join(root, '.funtools', 'play'));
|
|
452
|
+
}
|
|
453
|
+
catch {
|
|
454
|
+
return null;
|
|
455
|
+
}
|
|
456
|
+
const rounds = names.map((n) => /^round-(\d+)$/.exec(n)).filter((m) => !!m).map((m) => Number(m[1])).sort((a, b) => b - a);
|
|
457
|
+
for (const n of rounds) {
|
|
458
|
+
const rel = join('.funtools', 'play', `round-${n}`, 'report.json');
|
|
459
|
+
const r = readJson(join(root, rel));
|
|
460
|
+
if (r)
|
|
461
|
+
return { rel, r };
|
|
462
|
+
}
|
|
463
|
+
return null;
|
|
464
|
+
}
|
|
465
|
+
export function momentScores(raw) {
|
|
466
|
+
if (!raw)
|
|
467
|
+
return [];
|
|
468
|
+
const list = Array.isArray(raw) ? raw : Array.isArray(raw.moments) ? raw.moments : Array.isArray(raw.scores) ? raw.scores : null;
|
|
469
|
+
if (list) {
|
|
470
|
+
return list.map((m) => ({ moment: String(m.moment ?? m.name ?? m.view ?? '?'), score: Number(m.score ?? m.total ?? m.accuracy) })).filter((m) => Number.isFinite(m.score));
|
|
471
|
+
}
|
|
472
|
+
const map = raw.scores && typeof raw.scores === 'object' ? raw.scores : raw;
|
|
473
|
+
return Object.entries(map).map(([moment, v]) => ({ moment, score: Number(typeof v === 'object' && v ? v.score ?? v.total : v) })).filter((m) => Number.isFinite(m.score));
|
|
474
|
+
}
|
|
475
|
+
const warnsOf = (r) => (Array.isArray(r?.findings) ? r.findings : [])
|
|
476
|
+
.filter((f) => f && (f.level === 'warn' || f.level === 'fail' || f.state === 'warn' || f.state === 'fail'))
|
|
477
|
+
.map((f) => String(f.text ?? f.says ?? f.id ?? 'a warning'));
|
|
478
|
+
const short = (t, n = 110) => (t.length > n ? `${t.slice(0, n - 1)}…` : t);
|
|
479
|
+
const notesSaid = (kind, w) => `${kind} holds on the current files; ${w.length} note(s), not a gate until the owner's agreed plan lists the world: ${w.slice(0, 2).map((x) => short(x, 90)).join('; ')}`;
|
|
480
|
+
export const KIT_KINDS = [
|
|
481
|
+
['structures', /struct|build|house|hut|home|shack|machine|ship|vehicle|tower|ruin|env|place|landmark|architect|bridge|dock|station/i],
|
|
482
|
+
['ground', /ground|terrain|tile|floor|path|road|crust|grass|sand|soil|rock/i],
|
|
483
|
+
['props', /prop|item|object|crate|furniture|debris|clutter|barrel|kit/i],
|
|
484
|
+
['living cast', /fauna|flora|creature|animal|crowd|npc|folk|people|cast|bird|beast|critter|townsfolk|villager/i],
|
|
485
|
+
];
|
|
486
|
+
export function worldKit(root) {
|
|
487
|
+
const out = Object.fromEntries(KIT_KINDS.map(([k]) => [k, []]));
|
|
488
|
+
for (const rel of [join('design', 'first-look'), join('design', 'kit'), join('design', 'look', 'targets'), join('design', 'targets'), join('assets', 'kit')]) {
|
|
489
|
+
let names = [];
|
|
490
|
+
try {
|
|
491
|
+
names = readdirSync(join(root, rel));
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
continue;
|
|
495
|
+
}
|
|
496
|
+
for (const n of names) {
|
|
497
|
+
if (!/\.(png|jpe?g|webp)$/i.test(n) || /^ref[-_]/i.test(n))
|
|
498
|
+
continue;
|
|
499
|
+
const kind = KIT_KINDS.find(([, re]) => re.test(n));
|
|
500
|
+
if (kind)
|
|
501
|
+
out[kind[0]].push(join(rel, n));
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
return out;
|
|
505
|
+
}
|
|
506
|
+
export function isWorldGame(dir) {
|
|
507
|
+
let m = {};
|
|
508
|
+
try {
|
|
509
|
+
m = JSON.parse(readFileSync(join(dir, 'funpixel.json'), 'utf8'));
|
|
510
|
+
}
|
|
511
|
+
catch { }
|
|
512
|
+
const three = m?.metadata?.dimension === '3d' || /three/i.test(String(m?.metadata?.framework ?? ''));
|
|
513
|
+
if (three)
|
|
514
|
+
return { world: true, three };
|
|
515
|
+
const grep = (d, depth) => {
|
|
516
|
+
let names = [];
|
|
517
|
+
try {
|
|
518
|
+
names = readdirSync(join(dir, d));
|
|
519
|
+
}
|
|
520
|
+
catch {
|
|
521
|
+
return false;
|
|
522
|
+
}
|
|
523
|
+
for (const n of names) {
|
|
524
|
+
if (n === 'node_modules' || n.startsWith('.'))
|
|
525
|
+
continue;
|
|
526
|
+
const rel = join(d, n);
|
|
527
|
+
if (/\.(ts|tsx|js|jsx)$/.test(n)) {
|
|
528
|
+
try {
|
|
529
|
+
if (readFileSync(join(dir, rel), 'utf8').includes('__FPX_ACTORS__'))
|
|
530
|
+
return true;
|
|
531
|
+
}
|
|
532
|
+
catch { }
|
|
533
|
+
}
|
|
534
|
+
else if (!n.includes('.') && depth < 4 && grep(rel, depth + 1))
|
|
535
|
+
return true;
|
|
536
|
+
}
|
|
537
|
+
return false;
|
|
538
|
+
};
|
|
539
|
+
return { world: grep('src', 0), three };
|
|
540
|
+
}
|
|
541
|
+
const WORLD_RECORDS = { walk: join('.funtools', 'walk.json'), life: join('.funtools', 'life.json'), boxes: join('.funtools', 'boxes.json') };
|
|
542
|
+
export function worldRead(root, fp) {
|
|
543
|
+
let now;
|
|
544
|
+
const fresh = (rec) => !fp || !rec?.fingerprint || rec.fingerprint === fp || (Boolean(rec?.reads) && readsUnchanged(root, rec, now ??= sceneReads(root)));
|
|
545
|
+
const m = readJson(join(root, 'funpixel.json')) ?? {};
|
|
546
|
+
const three = m.metadata?.dimension === '3d' || /three/i.test(String(m.metadata?.framework ?? ''));
|
|
547
|
+
const warnsIn = {
|
|
548
|
+
walk: (r) => (Array.isArray(r?.routes) ? r.routes : []).flatMap((x) => (Array.isArray(x?.checks) ? x.checks : []).filter((c) => c?.status === 'warn').map((c) => String(c.text))),
|
|
549
|
+
life: (r) => (Array.isArray(r?.findings) ? r.findings : []).filter((f) => f?.level === 'warn').map((f) => String(f.text)),
|
|
550
|
+
boxes: (r) => (Array.isArray(r?.views) ? r.views : []).flatMap((v) => (Array.isArray(v?.checks) ? v.checks : []).filter((c) => c?.status === 'warn').map((c) => `${v.view}: ${String(c.text)}`)),
|
|
551
|
+
};
|
|
552
|
+
const seen = [];
|
|
553
|
+
const warns = [];
|
|
554
|
+
for (const check of ['walk', 'life', 'boxes']) {
|
|
555
|
+
const rec = readJson(join(root, WORLD_RECORDS[check]));
|
|
556
|
+
if (!rec)
|
|
557
|
+
continue;
|
|
558
|
+
const isFresh = fresh(rec);
|
|
559
|
+
const w = isFresh ? [...new Set(warnsIn[check](rec))] : [];
|
|
560
|
+
seen.push({ check, fresh: isFresh, warns: w.length });
|
|
561
|
+
warns.push(...w.map((x) => `${check}: ${x}`));
|
|
562
|
+
}
|
|
563
|
+
const loud = (x) => (/: [A-Z][A-Z' -]{3,}:/.test(x) ? 0 : 1);
|
|
564
|
+
warns.sort((a, b) => loud(a) - loud(b));
|
|
565
|
+
const ok = (c) => seen.some((x) => x.check === c && x.fresh);
|
|
566
|
+
if (!seen.length)
|
|
567
|
+
return { state: 'open', says: 'the world was never judged: no walk, life or boxes record', warns, seen };
|
|
568
|
+
if (!seen.some((x) => x.fresh))
|
|
569
|
+
return { state: 'stale', says: `the world was judged on older files (${seen.map((x) => x.check).join(', ')})`, warns, seen };
|
|
570
|
+
if (warns.length)
|
|
571
|
+
return { state: 'failing', says: `${warns.length} warning(s): ${warns.slice(0, 2).map((x) => short(x, 120)).join('; ')}`, warns, seen };
|
|
572
|
+
if (ok('walk') || (ok('life') && (ok('boxes') || !three)))
|
|
573
|
+
return { state: 'met', says: `the world holds on the current files (${seen.filter((x) => x.fresh).map((x) => x.check).join(', ')})`, warns, seen };
|
|
574
|
+
const missing = ['life', ...(three ? ['boxes'] : [])].filter((c) => !ok(c));
|
|
575
|
+
return { state: 'open', says: `${seen.filter((x) => x.fresh).map((x) => x.check).join(', ')} holds; ${missing.join(' and ')} never ran on these files`, warns, seen };
|
|
576
|
+
}
|
|
577
|
+
export const HOLD_LABELS = ['BOXES', 'BOX FIGURES', 'CUT-OUTS THAT GLIDE', 'CUT-OUTS ON A STICK', 'HERO CLONES', 'NOTHING MOVES', 'NO HERO', 'OFF THE GROUND'];
|
|
578
|
+
const HOLD_LABEL = new RegExp(`(^|: )(${HOLD_LABELS.join('|')}):`);
|
|
579
|
+
const NO_HERO_LINE = /no (player|hero) node found|no hero on screen/i;
|
|
580
|
+
export const isWorldFault = (line) => HOLD_LABEL.test(line) || NO_HERO_LINE.test(line);
|
|
581
|
+
const WORLD_READS = new Set(['life', 'walk', 'world']);
|
|
582
|
+
export function evaluateGate(root, g, fp, p, stageId, has = () => true, agreed = true) {
|
|
583
|
+
const r = (state, says, closes, run) => ({ gate: g, state, says, closes, run });
|
|
584
|
+
const fresh = (rec) => !fp || !rec?.fingerprint || rec.fingerprint === fp;
|
|
585
|
+
switch (g.kind) {
|
|
586
|
+
case 'gdd': {
|
|
587
|
+
const doc = gddText(root);
|
|
588
|
+
if (!doc)
|
|
589
|
+
return r('open', 'no design/GDD.md', g.min ? `${g.min}+ named behaviour tests in design/GDD.md` : `design/GDD.md with ${(g.headings ?? []).map((h) => `## ${h}`).join(', ')} written`, 'write it (skill funpixel-gdd, references/invent-first.md)');
|
|
590
|
+
if (g.min) {
|
|
591
|
+
const n = namedTests(doc.text).length;
|
|
592
|
+
return n >= g.min ? r('met', `${n} behaviour tests named`, '', '') : r('open', `${n} behaviour tests named in ${doc.rel}`, `${g.min}+ test names under ### Behaviour tests (rules as tests, before code)`, `name them in ${doc.rel}, then write them in test/`);
|
|
593
|
+
}
|
|
594
|
+
const thin = (g.headings ?? []).filter((h) => { const b = sectionBody(doc.text, h); return b === null || saysWords(b) < (h === 'The invention' ? 30 : 8); });
|
|
595
|
+
return thin.length ? r('open', `${doc.rel}: ${thin.map((h) => `## ${h}`).join(', ')} ${thin.length === 1 ? 'is' : 'are'} not written yet`, `${thin.map((h) => `## ${h}`).join(', ')} answered for this game`, `write ${thin.length === 1 ? 'it' : 'them'} in ${doc.rel} (skill funpixel-gdd)`) : r('met', `${(g.headings ?? []).map((h) => `## ${h}`).join(', ')} written`, '', '');
|
|
596
|
+
}
|
|
597
|
+
case 'studio':
|
|
598
|
+
return existsSync(join(root, 'design', 'studio.json')) ? r('met', 'the pitch is on the cards (design/studio.json)', '', '') : r('open', 'no studio pitch yet', 'design/studio.json with the choices proposed for this game', `${T} pitch, then ${T} pitch propose <choice> <option> --why "…"`);
|
|
599
|
+
case 'pitch-locked': {
|
|
600
|
+
const m = readJson(join(root, 'funpixel.json'));
|
|
601
|
+
return m?.studio?.locked ? r('met', 'the picks are locked (funpixel.json studio)', '', '') : r('open', 'the studio pitch is not locked', 'funpixel.json `studio` with the locked picks', `${T} pitch ask (each choice to the owner in the chat), then ${T} pitch lock once they answer (under the owner's autonomy go: propose, record why, lock)`);
|
|
602
|
+
}
|
|
603
|
+
case 'targets':
|
|
604
|
+
case 'refs': {
|
|
605
|
+
const pics = pictures(root), have = g.kind === 'refs' ? pics.refs : pics.targets, min = g.min ?? 1;
|
|
606
|
+
const what = g.kind === 'refs' ? 'reference sheet(s) named ref-*.png' : 'target frame(s)';
|
|
607
|
+
const m = readJson(join(root, 'funpixel.json')) ?? {};
|
|
608
|
+
const coded = m.art3d?.heroes === 'procedural' || m.assets?.budget?.credits === 0;
|
|
609
|
+
const route = coded ? `, drawn in code: compose them from the game's draw module on design/first-look/draw.html, then ${T} firstlook render` : '';
|
|
610
|
+
return have.length >= min ? r('met', `${have.length} ${what} in design/first-look`, '', '') : r('open', `${have.length} ${what} in design/first-look`, `${min}+ ${what} in design/first-look/`, g.kind === 'refs' ? `draw the identity lock first: one sheet per recurring design from the best draft${route} (skill funpixel-gdd, references/first-look.md)` : coded ? `draw them at the play framing, one per hook moment${route}` : `draw them at the play framing (${T} gen image, or your own route), one per hook moment`);
|
|
611
|
+
}
|
|
612
|
+
case 'tests': {
|
|
613
|
+
const rec = readJson(join(root, '.funtools', 'tests.json'));
|
|
614
|
+
if (!rec)
|
|
615
|
+
return r('open', 'the tests never ran through funtools', '.funtools/tests.json: exit 0 on the current files', `${T} test`);
|
|
616
|
+
if (!fresh(rec))
|
|
617
|
+
return r('stale', 'the tests ran on older files', '.funtools/tests.json: exit 0 on the current files', `${T} test`);
|
|
618
|
+
return rec.exit === 0 ? r('met', 'tests pass on the current files', '', '') : r('failing', `the tests exit ${rec.exit}`, '.funtools/tests.json: exit 0', `${T} test, and fix what fails`);
|
|
619
|
+
}
|
|
620
|
+
case 'sim': {
|
|
621
|
+
const rec = readJson(join(root, '.funtools', 'sim.json'));
|
|
622
|
+
const closes = '.funtools/sim.json on the current files: the naive bot loses at least one run (a run that ENDS failed, not a penalty), a careful player at a human pace wins some, no "a run cannot be lost", no broken bot, every warning resolved or accepted by id';
|
|
623
|
+
if (!rec)
|
|
624
|
+
return r('open', 'the bots never played the rules', closes, existsSync(join(root, 'test', 'probes.ts')) ? `${T} sim` : `write test/probes.ts with the GDD's bots on the real level, then ${T} sim (skill funpixel-game-logic, references/probes.md)`);
|
|
625
|
+
if (!fresh(rec))
|
|
626
|
+
return r('stale', 'sim ran on older files', closes, `${T} sim`);
|
|
627
|
+
const accepted = new Set(g.accept ?? []);
|
|
628
|
+
const cohorts = Array.isArray(rec.cohorts) ? rec.cohorts : [];
|
|
629
|
+
const naive = cohorts.find((c) => c.role === 'naive');
|
|
630
|
+
const problems = [];
|
|
631
|
+
for (const f of Array.isArray(rec.findings) ? rec.findings : [])
|
|
632
|
+
if (f.state === 'warn' && !accepted.has(f.id))
|
|
633
|
+
problems.push(short(String(f.says)));
|
|
634
|
+
if (!naive)
|
|
635
|
+
problems.push('no naive bot played (a steer-to-goal policy with role "naive")');
|
|
636
|
+
else if (!(naive.lost > 0) && !accepted.has('losable'))
|
|
637
|
+
problems.push(`the naive bot never loses (${naive.lost ?? 0} of ${naive.seeds ?? '?'} seeds)`);
|
|
638
|
+
const careful = cohorts.filter((c) => c.human && (c.role === 'skilled' || c.role === 'taught'));
|
|
639
|
+
if (careful.length && !careful.some((c) => c.won > 0 && !c.foresight) && !accepted.has('human-win'))
|
|
640
|
+
problems.push(`at a human pace nobody wins with the defaults (${careful.map((c) => `${c.policy ?? c.role} ${c.won ?? 0}/${c.seeds ?? '?'}`).join(', ')})`);
|
|
641
|
+
const missing = (g.bots ?? []).filter((b) => !cohorts.some((c) => c.policy === b));
|
|
642
|
+
if (missing.length)
|
|
643
|
+
problems.push(`the GDD's bots never played: ${missing.join(', ')}`);
|
|
644
|
+
return problems.length ? r('failing', [...new Set(problems)].slice(0, 3).join('; '), closes, `change the rules (or fix the bot), then ${T} sim`) : r('met', `the challenge bites: the naive bot loses ${naive.lost} of ${naive.seeds}`, '', '');
|
|
645
|
+
}
|
|
646
|
+
case 'verify': {
|
|
647
|
+
const rec = readJson(join(root, 'verify.json'));
|
|
648
|
+
if (!rec)
|
|
649
|
+
return r('open', 'never verified', 'verify.json: pass on the current files', `${T} check --front-door (or npm run build, then ${T} verify --front-door)`);
|
|
650
|
+
if (!fresh(rec))
|
|
651
|
+
return r('stale', 'verify.json is from older files', 'verify.json: pass on the current files', `${T} check --front-door (or npm run build, then ${T} verify --front-door)`);
|
|
652
|
+
return rec.verdict === 'pass' ? r('met', 'verify passes on the current files', '', '') : rec.verdict === 'fail' ? r('failing', 'the last verify failed', 'verify.json: pass', `read its FAIL lines, fix, ${T} verify`) : r('not_observed', 'the last verify measured nothing', 'verify.json: pass', `${T} verify (hooks missing or the page did not load)`);
|
|
653
|
+
}
|
|
654
|
+
case 'hook':
|
|
655
|
+
case 'life':
|
|
656
|
+
case 'walk': {
|
|
657
|
+
const rel = join('.funtools', `${g.kind}.json`), rec = readJson(join(root, rel));
|
|
658
|
+
const cmd = g.kind === 'walk' ? `${T} walk` : `${T} ${g.kind}${g.kind === 'hook' ? ' --viewport phone' : ''}`;
|
|
659
|
+
const closes = `${rel} on the current files with zero warnings`;
|
|
660
|
+
if (!rec)
|
|
661
|
+
return has(g.kind) ? r('open', `${g.kind} never ran`, closes, cmd) : r('not_observed', `\`funtools ${g.kind}\` is not in this funtools yet: not observed, never a pass`, closes, `upgrade funtools, then ${cmd}`);
|
|
662
|
+
if (!fresh(rec) && !(g.kind !== 'hook' && readsUnchanged(root, rec)))
|
|
663
|
+
return r('stale', `${g.kind} ran on older files`, closes, cmd);
|
|
664
|
+
const w = warnsOf(rec);
|
|
665
|
+
if (rec.verdict === 'fail' && !w.length)
|
|
666
|
+
w.push('its verdict is fail');
|
|
667
|
+
if (w.length && !agreed && WORLD_READS.has(g.kind) && !w.some(isWorldFault))
|
|
668
|
+
return r('met', notesSaid(g.kind, w), '', '');
|
|
669
|
+
return w.length ? r('failing', w.slice(0, 2).map((x) => short(x)).join('; '), closes, `fix what it names, then ${cmd}`) : r('met', `${g.kind} holds on the current files`, '', '');
|
|
670
|
+
}
|
|
671
|
+
case 'score': {
|
|
672
|
+
const rel = join('design', 'look', 'scores.json'), raw = readJson(join(root, rel));
|
|
673
|
+
const bar = g.min ?? ownerGates(root).accuracy_min ?? ACCURACY_DEFAULT;
|
|
674
|
+
const closes = `${rel}: every moment at ${bar} or more beside its target`;
|
|
675
|
+
if (!raw)
|
|
676
|
+
return has('score') ? r('open', 'no moment scored against its target', closes, `${T} score --target`) : r('not_observed', '`funtools score` is not in this funtools yet: not observed, never a pass', closes, `upgrade funtools, then ${T} score --target`);
|
|
677
|
+
if (!fresh(raw))
|
|
678
|
+
return r('stale', 'the scores are from older files', closes, `${T} score --target`);
|
|
679
|
+
const s = momentScores(raw);
|
|
680
|
+
if (!s.length)
|
|
681
|
+
return r('not_observed', `${rel} names no moment`, closes, `${T} score --target`);
|
|
682
|
+
const low = s.filter((m) => m.score < bar);
|
|
683
|
+
const fx = fixSummary(fixList(root, raw));
|
|
684
|
+
return low.length ? r('failing', `${low.length} of ${s.length} under ${bar}: ${low.slice(0, 3).map((m) => `${m.moment} ${m.score}`).join(', ')}`, closes, `apply the fix list${fx ? ` (${fx})` : ''}, rebuild, then ${T} score at the same framing (${T} score --fixes prints it whole)`) : r('met', `every moment at ${bar}+ (${s.map((m) => `${m.moment} ${m.score}`).slice(0, 4).join(', ')})`, '', '');
|
|
685
|
+
}
|
|
686
|
+
case 'play': {
|
|
687
|
+
const last = latestPlay(root);
|
|
688
|
+
const closes = 'a blind round from the title on the current files that is not blocked (.funtools/play/round-N/report.json)';
|
|
689
|
+
if (!last)
|
|
690
|
+
return r('open', 'no blind round yet', closes, `${T} play --viewport phone (the player agent plays from the title)`);
|
|
691
|
+
if (last.r.source_changed === true || !fresh(last.r))
|
|
692
|
+
return r('stale', `${last.rel} played older files`, closes, `${T} play --viewport phone`);
|
|
693
|
+
return last.r.blocked ? r('failing', `the blind player was blocked: ${short(String(last.r.blocking || last.r.defects?.[0]?.title || 'see the report'))}`, closes, `fix it, then ${T} play`) : r('met', `${last.rel}: a new player gets through`, '', '');
|
|
694
|
+
}
|
|
695
|
+
case 'panel': {
|
|
696
|
+
const h = readJson(join(root, '.funtools', 'playtest', 'history.json'));
|
|
697
|
+
const rounds = Array.isArray(h?.rounds) ? h.rounds : [];
|
|
698
|
+
const bar = g.min ?? PANEL_DEFAULT;
|
|
699
|
+
const closes = `a playtest round on the current files with the panel's mean at ${bar}+, no blocker still there and nothing on the do-not-regress list lost`;
|
|
700
|
+
if (!rounds.length)
|
|
701
|
+
return r('open', 'no playtest round yet', closes, `${T} playtest`);
|
|
702
|
+
const last = rounds[rounds.length - 1];
|
|
703
|
+
if (!fresh(last))
|
|
704
|
+
return r('stale', `playtest round ${last.n} judged older files`, closes, `${T} playtest`);
|
|
705
|
+
const vals = Object.values(last.panel ?? {}).filter((v) => typeof v === 'number');
|
|
706
|
+
const mean = vals.length ? Math.round((vals.reduce((a, b) => a + b, 0) / vals.length) * 100) / 100 : null;
|
|
707
|
+
const still = (last.blockers ?? []).filter((b) => /still/i.test(String(b.status))).length;
|
|
708
|
+
const dropped = new Set((readKeep(root)?.items ?? []).filter((k) => k.dropped).map((k) => k.id));
|
|
709
|
+
const lost = (Array.isArray(last.keep) ? last.keep : []).filter((k) => k?.status === 'lost' && !dropped.has(k.id));
|
|
710
|
+
if (lost.length)
|
|
711
|
+
return r('failing', `a regression: ${lost.map((k) => `${k.id} ${short(String(k.text ?? ''), 80)}`).join('; ')} worked and is lost (round ${last.n})`, closes, `put ${lost.length === 1 ? 'it' : 'them'} back first (.funtools/keep.json has the evidence), then ${T} playtest; the ledger seat judges ${lost.length === 1 ? 'it' : 'them'} again`);
|
|
712
|
+
if (mean === null)
|
|
713
|
+
return r('not_observed', `round ${last.n} has no panel numbers`, closes, `${T} playtest report`);
|
|
714
|
+
return mean >= bar && !still ? r('met', `panel ${mean} (round ${last.n})`, '', '') : r('failing', `panel ${mean}${still ? `, ${still} blocker(s) still there` : ''} (round ${last.n})`, closes, 'work down the blockers ledger, then playtest again');
|
|
715
|
+
}
|
|
716
|
+
case 'owner': {
|
|
717
|
+
const v = [...(p.verdicts ?? [])].reverse().find((x) => x.stage === stageId);
|
|
718
|
+
const closes = `the owner's verdict on ${stageId}: accept`;
|
|
719
|
+
const look = stageId === 'key-look';
|
|
720
|
+
if (!v)
|
|
721
|
+
return look
|
|
722
|
+
? r('open', 'the owner has not looked at the key art and the hero\'s sheet yet', closes, `show both in the chat, opened big, and ask whether this is the look; record their words: ${T} note verdict key-look accept|reject "…"`)
|
|
723
|
+
: r('open', 'the owner has not played it', closes, `the owner plays it on a phone; record their words: ${T} note verdict ${stageId} accept|reject "…"`);
|
|
724
|
+
return v.says === 'accept' ? r('met', `the owner accepted (${v.at.slice(0, 10)})`, '', '') : r('failing', `the owner rejected: ${short(v.words ?? '')}`, closes, look ? 'redraw what they named; show them again' : 'fix what they named; ask them to play again');
|
|
725
|
+
}
|
|
726
|
+
case 'published': {
|
|
727
|
+
let lines = 0;
|
|
728
|
+
try {
|
|
729
|
+
lines = readFileSync(join(root, '.funtools', 'publish.jsonl'), 'utf8').split('\n').filter((l) => l.trim()).length;
|
|
730
|
+
}
|
|
731
|
+
catch { }
|
|
732
|
+
return lines ? r('met', 'published', '', '') : r('open', 'not published', '.funtools/publish.jsonl', `${T} pack --dry-run, then ${T} publish`);
|
|
733
|
+
}
|
|
734
|
+
case 'kit': {
|
|
735
|
+
const k = worldKit(root);
|
|
736
|
+
const have = KIT_KINDS.map(([kind]) => kind).filter((kind) => k[kind].length);
|
|
737
|
+
const closes = 'sheets of at least two of the world\'s made parts (structures, ground, props, the living cast) in design/first-look, named for what they hold';
|
|
738
|
+
return have.length >= 2 ? r('met', `the world's kit: ${have.map((kind) => `${kind} (${k[kind].length})`).join(', ')}`, '', '')
|
|
739
|
+
: r('open', have.length ? `the world's kit has only ${have.join(', ')}` : 'no sheet of the world\'s made parts yet (only the hero and the frames)', closes, `draw them from the reference sheets with the style block (skill funpixel-art), then \`${T} cut <sheet>\` into pieces the slice is built from`);
|
|
740
|
+
}
|
|
741
|
+
case 'set': {
|
|
742
|
+
const s = firstLookSet(root);
|
|
743
|
+
const have = s.items.filter((i) => i.state === 'have').length;
|
|
744
|
+
if (!s.missing.length)
|
|
745
|
+
return r('met', `the first-look set: ${have} of ${s.items.length} shown${s.items.some((i) => i.state === 'skipped') ? `, ${s.items.filter((i) => i.state === 'skipped').length} skipped by the owner` : ''}${s.skippedGroups.length ? ` (${s.skippedGroups.map((x) => x.why).join('; ')})` : ''}`, '', '');
|
|
746
|
+
const waiting = s.missing.find((i) => i.state === 'waiting');
|
|
747
|
+
return r('open', `the first-look set misses ${s.missing.length} of ${s.items.length}: ${s.missing.slice(0, 6).map((i) => i.title.replace(/ \(.*$/, '')).join(', ')}${s.missing.length > 6 ? '…' : ''}`, `${missingLines(s).slice(0, 3).join('; ')}${s.missing.length > 3 ? `; …and ${s.missing.length - 3} more (${T} firstlook)` : ''}`, waiting ? `the owner answers ${s.world.ask ?? 'the world question'} in the chat; meanwhile ${SET_RUN}` : SET_RUN);
|
|
748
|
+
}
|
|
749
|
+
case 'worth': {
|
|
750
|
+
const w = worthGate(root, { needPlayed: !!g.played });
|
|
751
|
+
return r(w.state, w.says, w.closes, w.run);
|
|
752
|
+
}
|
|
753
|
+
case 'world': {
|
|
754
|
+
const w = worldRead(root, fp);
|
|
755
|
+
const run = `${T} check --world (boxes, grounding, life on the play views), or ${T} walk on a route from the title`;
|
|
756
|
+
const closes = 'walk.json, or life.json + boxes.json (boxes for a 3D game), on the current files with zero warnings: no flat boxes near the camera, nothing floating, every person and creature animated (not a picture slid or bobbed)';
|
|
757
|
+
if (w.state === 'failing' && !agreed && !w.warns.some(isWorldFault))
|
|
758
|
+
return r('met', notesSaid('world', w.warns), '', '');
|
|
759
|
+
return w.state === 'met' ? r('met', w.says, '', '') : r(w.state, w.says, closes, w.state === 'failing' ? `fix what it names, then ${T} check --world` : run);
|
|
760
|
+
}
|
|
761
|
+
case 'spec': {
|
|
762
|
+
const rec = readJson(join(root, '.funtools', 'spec.json'));
|
|
763
|
+
const closes = '.funtools/spec.json on the current spec and src/: zero warnings (every id cited exists, every tunable read and none typed into the code, every room with a par and an exit, the pars at the floor, the tier\'s sections there)';
|
|
764
|
+
if (!existsSync(join(root, 'design', 'spec', 'tunables.json')))
|
|
765
|
+
return r('open', 'no spec folder yet (design/spec/)', closes, `${T} spec init (the big tier: the build contract, every number as data, rooms and chapters), then ${T} spec lint`);
|
|
766
|
+
if (!rec)
|
|
767
|
+
return r('open', 'the spec was never linted', closes, `${T} spec lint`);
|
|
768
|
+
if (rec.hash !== specHash(root))
|
|
769
|
+
return r('stale', 'the spec or the code changed since the last lint', closes, `${T} spec lint`);
|
|
770
|
+
const warn = Number(rec.counts?.warn ?? 0);
|
|
771
|
+
return warn ? r('failing', `spec lint: ${warn} warning${warn === 1 ? '' : 's'}${rec.first ? ` (${short(String(rec.first))})` : ''}`, closes, `fix what it names, then ${T} spec lint`) : r('met', `the spec lints clean${rec.counts?.note ? ` (${rec.counts.note} notes)` : ''}`, '', '');
|
|
772
|
+
}
|
|
773
|
+
case 'chapters': {
|
|
774
|
+
const v = chaptersGate(root, (p.verdicts ?? []), T);
|
|
775
|
+
return r(v.state, v.says, v.closes, v.run);
|
|
776
|
+
}
|
|
777
|
+
case 'rooms': {
|
|
778
|
+
const v = roomsGate(root, fp);
|
|
779
|
+
return r(v.state, v.says, v.closes, v.run);
|
|
780
|
+
}
|
|
781
|
+
case 'file': {
|
|
782
|
+
const path = g.path ?? '';
|
|
783
|
+
return path && existsSync(join(root, path)) ? r('met', `${path} exists`, '', '') : r('open', `${path || '(no path)'} is missing`, path, `make ${path}`);
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
const FORBIDS_BUILD = /\b(?:do not|don'?t|never)\s+(?:start|begin|touch|write|make)?\s*(?:on\s+)?(?:the\s+|any\s+)?(?:build|building|game code|code)\b|\bno build(?:ing)?\b|\bnot (?:yet )?signed off\b|\bno sign-?off\b|\bkeep (?:designing|planning)\b|\bnothing (?:is )?built\b/i;
|
|
788
|
+
const DESIGN_WORK = /\bopen questions?\b|\b(?:in|into|update|revise|rewrite) the (?:GDD|design doc(?:ument)?|plan)\b/i;
|
|
789
|
+
const DESIGN_STAGES = new Set(['pitch', 'lock', 'gdd']);
|
|
790
|
+
export const LOOK_NOTE = /\b(look\w*|shapes?|box(es|y)?|primitives?|world|art|ugly|worst|flat|ground\w*|float\w*|glid\w*|models?|sprites?|style|colou?rs?|pictures?|visual\w*|cut-?outs?|3d|scenes?|plain|blocky|graphics)\b/i;
|
|
791
|
+
export const forbidsBuild = (n) => FORBIDS_BUILD.test(n.text);
|
|
792
|
+
export const designNote = (n) => forbidsBuild(n) || (!LOOK_NOTE.test(n.text) && (DESIGN_WORK.test(n.text) || DESIGN_STAGES.has(n.stage)));
|
|
793
|
+
export const designPath = (rel) => /^(design\/|GDD\.md$)/.test(rel) && !/^design\/(pipeline|status|plan-notes)\.json$/.test(rel);
|
|
794
|
+
const HOLD_WORDS = /\bnot (?:yet )?signed off\b|\bno sign-?off\b|\bkeep (?:designing|planning)\b|\b(?:do not|don'?t)\s+(?:start|begin)\s+(?:the\s+)?build(?:ing)?\b|\b(?:do not|don'?t)\s+build(?:\s+anything)?\s*(?:yet\b|until\b|before\b|[.;:!,)]|$)/i;
|
|
795
|
+
export const holdsStage = (n) => n.by === 'owner' && (n.hold ?? HOLD_WORDS.test(n.text));
|
|
796
|
+
export function openNotes(p) {
|
|
797
|
+
const open = p.notes.filter((n) => n.status === 'open' || (n.status !== 'dropped' && n.verdict?.says === 'reject'));
|
|
798
|
+
return open.sort((a, b) => (a.by === b.by ? 0 : a.by === 'owner' ? -1 : 1));
|
|
799
|
+
}
|
|
800
|
+
export function evaluate(root, p, fp, has, o = {}) {
|
|
801
|
+
const og = ownerGates(root);
|
|
802
|
+
const fl = readJson(join(root, '.funtools', 'flow.json'));
|
|
803
|
+
const broughtOnly = !!fl && Array.isArray(fl.rounds) && !fl.owner_plan;
|
|
804
|
+
const plan = !broughtOnly && p.stages.some((s) => PLANNING_STAGES.has(s.id) && s.status !== 'done' && s.status !== 'skipped') ? ownerPlan(root) : {};
|
|
805
|
+
const stages = p.stages.map((stage, index) => {
|
|
806
|
+
const skipped = stage.status === 'skipped';
|
|
807
|
+
const byPlan = !skipped && stage.status !== 'done' && PLANNING_STAGES.has(stage.id) ? plan[stage.id] : undefined;
|
|
808
|
+
const gates = skipped ? [] : byPlan ? stage.gates.map((g) => ({ gate: g, state: 'met', says: `answered by ${byPlan}`, closes: '', run: '' }))
|
|
809
|
+
: stage.gates.map((g) => evaluateGate(root, g.kind === 'score' && og.accuracy_min !== null && g.min === undefined ? { ...g, min: og.accuracy_min, owner: true }
|
|
810
|
+
: g.kind === 'panel' && og.panel_min !== null && g.min === undefined ? { ...g, min: og.panel_min, owner: true } : g, fp, p, stage.id, has, o.agreed ?? true));
|
|
811
|
+
return { stage, index, gates, skipped, done: skipped || stage.status === 'done' || gates.every((x) => x.state === 'met') };
|
|
812
|
+
});
|
|
813
|
+
const current = stages.find((s) => !s.done) ?? null;
|
|
814
|
+
const notes = openNotes(p);
|
|
815
|
+
const order = new Map(p.stages.map((s, i) => [s.id, i]));
|
|
816
|
+
const holds = notes.filter(holdsStage);
|
|
817
|
+
const due = notes.filter((n) => n.by === 'owner' && !holds.includes(n) && (current === null || (order.get(n.stage) ?? 0) <= current.index || stages[order.get(n.stage) ?? 0]?.done));
|
|
818
|
+
const held = holds.length && current && !DESIGN_WORK_STAGES.has(current.stage.id) ? holds[0] : null;
|
|
819
|
+
let next;
|
|
820
|
+
if (p.dropped) {
|
|
821
|
+
next = { kind: 'done', stage: null, step: `the owner dropped this game (${p.dropped.at.slice(0, 10)}): "${short(p.dropped.words, 160)}"`, why: 'a drop is the owner\'s word; nothing more is built', closes: 'nothing: the game is dropped', run: `none; a new idea starts with ${T} flow start <dir> --idea "<line>"` };
|
|
822
|
+
}
|
|
823
|
+
else if (due.length) {
|
|
824
|
+
const n = due[0];
|
|
825
|
+
const st = stages.find((s) => s.stage.id === n.stage) ?? current;
|
|
826
|
+
next = {
|
|
827
|
+
kind: 'owner-note', stage: st, note: n,
|
|
828
|
+
step: `the owner's note ${n.id} (${n.stage}): "${short(n.text, 160)}"${n.verdict?.says === 'reject' ? ` — reopened by the owner: ${short(n.verdict.words ?? '', 80)}` : ''}`,
|
|
829
|
+
why: 'the owner\'s notes outrank anything an agent claims; it stays open until evidence closes it',
|
|
830
|
+
...(designNote(n)
|
|
831
|
+
? { closes: 'the design it asks for: a commit that changes the GDD or design/ made after the note (or the owner\'s own word)', run: `${T} note close ${n.id} --evidence <commit sha>` }
|
|
832
|
+
: { closes: `evidence that it is fixed: a file (a film or a still from the same framing${n.screenshot ? ` as ${n.screenshot}` : ''}), a commit or a test name`, run: `${T} note close ${n.id} --evidence <path|sha|test>` }),
|
|
833
|
+
};
|
|
834
|
+
}
|
|
835
|
+
else if (held) {
|
|
836
|
+
next = {
|
|
837
|
+
kind: 'hold', stage: current, note: held,
|
|
838
|
+
step: `waiting on the owner: their note ${held.id} holds the stage: "${short(held.text, 160)}"`,
|
|
839
|
+
why: 'the owner holds the stage: the build waits for their word, and only the work the note names goes on (the design, the GDD, art tests); it is not a task to close',
|
|
840
|
+
closes: `the owner's word in the chat; only when they release it, record it in their words (\`${T} note close ${held.id} --by owner --force "<their words>"\`)`,
|
|
841
|
+
run: 'nothing to run for it: go on with the work the note names, or ask the owner in the chat',
|
|
842
|
+
};
|
|
843
|
+
}
|
|
844
|
+
else if (current) {
|
|
845
|
+
const g = current.gates.find((x) => x.state !== 'met');
|
|
846
|
+
const c = CATALOGUE[current.stage.id];
|
|
847
|
+
next = {
|
|
848
|
+
kind: 'gate', stage: current, gate: g,
|
|
849
|
+
step: `${current.stage.title}: ${g.says}`,
|
|
850
|
+
why: current.stage.why ?? c?.why ?? 'the stage\'s gate has no evidence yet',
|
|
851
|
+
closes: g.closes, run: g.run,
|
|
852
|
+
};
|
|
853
|
+
}
|
|
854
|
+
else {
|
|
855
|
+
next = { kind: 'done', stage: null, step: 'every stage has its evidence', why: 'the path is walked', closes: 'the person plays it and says yes', run: 'hand back: what plays, what is out on purpose, the next two or three steps, every stand-in' };
|
|
856
|
+
}
|
|
857
|
+
return { tier: p.tier, stages, current, openNotes: notes, holds, next, ownerGates: og };
|
|
858
|
+
}
|
|
859
|
+
export function rulesFor(stage) {
|
|
860
|
+
if (!stage)
|
|
861
|
+
return [SESSION_RULE];
|
|
862
|
+
return [...(stage.rules?.length ? stage.rules : CATALOGUE[stage.id]?.rules ?? []), SESSION_RULE];
|
|
863
|
+
}
|
|
864
|
+
const MARK = { met: 'met', open: 'no evidence', stale: 'stale', failing: 'failing', not_observed: 'not observed' };
|
|
865
|
+
export function stageBlock(e, opts = {}) {
|
|
866
|
+
const out = [];
|
|
867
|
+
const n = e.stages.length;
|
|
868
|
+
const at = e.current ? `stage ${e.current.index + 1} of ${n}: ${e.current.stage.title}` : `all ${n} stages have their evidence`;
|
|
869
|
+
out.push(`## ${opts.heading ?? 'Where the game is'} (design/pipeline.json, ${TIER_NAME[e.tier] ?? e.tier})`);
|
|
870
|
+
out.push(`- path: ${e.stages.map((s) => `${s.skipped ? '-' : s.done ? '✓' : s === e.current ? '▸' : '·'} ${s.stage.id}`).join(' ')}`);
|
|
871
|
+
out.push(`- now: ${at}`);
|
|
872
|
+
if (e.current?.stage.reopened)
|
|
873
|
+
out.push(`- reopened: ${e.current.stage.reopened}`);
|
|
874
|
+
out.push(`- next: ${e.next.step}`);
|
|
875
|
+
out.push(` run: ${e.next.run}`);
|
|
876
|
+
out.push(` closes when: ${e.next.closes}`);
|
|
877
|
+
if (e.current) {
|
|
878
|
+
const other = e.current.gates.filter((g) => g !== e.next.gate && g.state !== 'met');
|
|
879
|
+
for (const g of other)
|
|
880
|
+
out.push(` also open here (${MARK[g.state]}): ${g.says} → ${g.run}`);
|
|
881
|
+
}
|
|
882
|
+
const holds = e.holds ?? [];
|
|
883
|
+
if (holds.length) {
|
|
884
|
+
out.push('', 'Waiting on the owner (they hold the stage; information, not a step: only they release it):');
|
|
885
|
+
for (const note of holds)
|
|
886
|
+
out.push(`- ${note.id} [${note.stage}] "${short(note.text, 180)}"`);
|
|
887
|
+
}
|
|
888
|
+
const own = e.openNotes.filter((n) => !n.from_bar && !holds.includes(n)), bar = e.openNotes.filter((n) => n.from_bar);
|
|
889
|
+
if (own.length) {
|
|
890
|
+
out.push('', 'The owner\'s open notes (they outrank any agent claim; each stays open until evidence closes it):');
|
|
891
|
+
for (const note of own.slice(0, 6))
|
|
892
|
+
out.push(`- ${note.id} [${note.stage}] ${note.by === 'owner' ? '' : '(agent) '}"${short(note.text, 180)}"${note.screenshot ? ` (${note.screenshot})` : ''}`);
|
|
893
|
+
if (own.length > 6)
|
|
894
|
+
out.push(`- …and ${own.length - 6} more: \`${T} note\``);
|
|
895
|
+
}
|
|
896
|
+
if (bar.length) {
|
|
897
|
+
out.push('', `The owner's standing bar for this game (${bar.length} line${bar.length === 1 ? '' : 's'}, carried from their earlier games; the plan, the first look and the build answer each):`);
|
|
898
|
+
for (const note of bar.slice(0, 12))
|
|
899
|
+
out.push(`- ${note.id} [${note.stage}] ${short(note.text.replace(/^the owner's bar: /, ''), 120)}`);
|
|
900
|
+
if (bar.length > 12)
|
|
901
|
+
out.push(`- …and ${bar.length - 12} more: \`${T} owner list\``);
|
|
902
|
+
}
|
|
903
|
+
if (opts.rules !== false) {
|
|
904
|
+
out.push('', `What matters at this stage${e.current ? ` (${e.current.stage.title})` : ''}:`);
|
|
905
|
+
for (const r of rulesFor(e.current?.stage))
|
|
906
|
+
out.push(`- ${r}`);
|
|
907
|
+
}
|
|
908
|
+
out.push('', `Start from \`${T} next\`: the one next step, why, and the evidence that closes it.`);
|
|
909
|
+
return out.join('\n');
|
|
910
|
+
}
|
|
911
|
+
export function gatesWithoutEvidence(e) {
|
|
912
|
+
if (!e.current)
|
|
913
|
+
return [];
|
|
914
|
+
return e.current.gates.filter((g) => g.state !== 'met').map((g) => `${e.current.stage.title} — ${g.gate.kind}: ${MARK[g.state]} (${g.says}). Closes with ${g.closes}: ${g.run}`);
|
|
915
|
+
}
|
|
916
|
+
export function ownerGateItems(e) {
|
|
917
|
+
const out = [];
|
|
918
|
+
for (const s of e.stages) {
|
|
919
|
+
for (const g of s.gates)
|
|
920
|
+
if (g.gate.owner && g.state !== 'met' && !s.skipped && s.index <= (e.current?.index ?? Infinity))
|
|
921
|
+
out.push(`the owner's bar (funpixel.json accuracy_min ${g.gate.min}): ${g.says}`);
|
|
922
|
+
}
|
|
923
|
+
if (e.ownerGates.evidence && e.current) {
|
|
924
|
+
for (const g of e.current.gates)
|
|
925
|
+
if (g.state !== 'met')
|
|
926
|
+
out.push(`the owner's rule "a round is not done without evidence" (funpixel.json owner_gates.evidence): ${e.current.stage.title} has no ${g.gate.kind} evidence (${g.says})`);
|
|
927
|
+
}
|
|
928
|
+
return out;
|
|
929
|
+
}
|