@funpixel/tools 0.1.0 → 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/bench/handlers/bake_emissive.py +2 -2
- package/bench/handlers/decimate.py +2 -2
- package/bench/handlers/fracture.py +1 -1
- package/bench/handlers/normalize_transform.py +3 -3
- package/bench/handlers/render_views.py +2 -2
- package/bench/handlers/views.py +6 -6
- package/dist/cli.js +8 -9
- package/dist/commands/feedback.js +5 -5
- package/dist/commands/init.js +1 -1
- package/dist/direct/read.js +1 -1
- package/dist/doctor/unity-checks.js +5 -5
- package/dist/doctor/unity-history.js +17 -33
- package/dist/feedback/ab.js +0 -40
- package/dist/gen/unity.js +3 -3
- package/dist/mcp/server.js +2 -1
- package/dist/pipeline/pipeline.js +6 -6
- package/dist/playtest/moments.js +1 -1
- package/dist/playtest/report.js +1 -1
- package/dist/production/mirror.js +2 -2
- package/dist/sim/curve.js +3 -3
- package/dist/spec/scaffold.js +1 -1
- package/dist/studio/pitch.js +1 -1
- package/dist/unity/probe/install.js +1 -1
- package/dist/vendor/verify/src/page/actors.js +2 -2
- package/dist/vendor/verify/src/page/capture_view.js +2 -2
- package/dist/vendor/verify/src/page/dressing.js +1 -1
- package/dist/vendor/verify/src/page/frame_honesty.js +1 -1
- package/dist/vendor/verify/src/page/front_door.js +2 -2
- package/dist/vendor/verify/src/page/grounding.js +3 -3
- package/dist/vendor/verify/src/page/hud.js +3 -3
- package/dist/vendor/verify/src/page/layout.js +5 -5
- package/dist/vendor/verify/src/page/life_anim.js +6 -6
- package/dist/vendor/verify/src/page/mechanic_check.js +1 -1
- package/dist/vendor/verify/src/page/phone_check.js +2 -2
- package/dist/vendor/verify/src/page/recorder.js +2 -2
- package/dist/vendor/verify/src/page/surfaces.js +2 -2
- package/dist/vendor/verify/src/page/world_actors.js +3 -3
- package/package.json +2 -2
- package/plugins/README.md +16 -0
- package/plugins/claude/README.md +2 -3
- package/plugins/claude/agents/art-director.md +2 -2
- package/plugins/claude/commands/playtest.md +2 -2
- package/plugins/claude/hooks/brief.md +1 -1
- package/plugins/claude/hooks/guidance.json +1 -1
- package/plugins/claude/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/claude/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/claude/skills/3d/references/bake-off.md +3 -3
- package/plugins/claude/skills/3d/references/characters.md +1 -1
- package/plugins/claude/skills/3d/references/hero-route.md +5 -5
- package/plugins/claude/skills/3d/references/level-spec.md +1 -1
- package/plugins/claude/skills/3d/references/levels.md +3 -3
- package/plugins/claude/skills/3d/references/light-and-places.md +3 -3
- package/plugins/claude/skills/3d/references/painted-target.md +7 -7
- package/plugins/claude/skills/3d/references/three-loading.md +4 -4
- package/plugins/claude/skills/3d/references/unity.md +13 -13
- package/plugins/claude/skills/art/references/animation.md +1 -1
- package/plugins/claude/skills/art/references/cast.md +3 -3
- package/plugins/claude/skills/art/references/effects.md +2 -2
- package/plugins/claude/skills/art/references/frames.md +6 -6
- package/plugins/claude/skills/art/references/judging-frames.md +8 -8
- package/plugins/claude/skills/art/references/look.md +4 -4
- package/plugins/claude/skills/art/references/pipeline.md +2 -2
- package/plugins/claude/skills/art/references/prompts.md +4 -4
- package/plugins/claude/skills/art/references/ui.md +15 -15
- package/plugins/claude/skills/art/references/unity.md +14 -14
- package/plugins/claude/skills/audio/references/adaptive-music.md +4 -4
- package/plugins/claude/skills/audio/references/engine.md +2 -2
- package/plugins/claude/skills/audio/references/measure.md +1 -1
- package/plugins/claude/skills/audio/references/unity.md +20 -19
- package/plugins/claude/skills/game-feel/SKILL.md +4 -4
- package/plugins/claude/skills/game-feel/references/contact.md +6 -6
- package/plugins/claude/skills/game-feel/references/unity.md +18 -23
- package/plugins/claude/skills/game-logic/SKILL.md +3 -3
- package/plugins/claude/skills/game-logic/references/balance.md +2 -2
- package/plugins/claude/skills/game-logic/references/depth.md +2 -2
- package/plugins/claude/skills/game-logic/references/escalation.md +5 -5
- package/plugins/claude/skills/game-logic/references/probes.md +10 -10
- package/plugins/claude/skills/game-logic/references/unity.md +28 -28
- package/plugins/claude/skills/game-spine/SKILL.md +1 -1
- package/plugins/claude/skills/game-spine/references/performance.md +2 -2
- package/plugins/claude/skills/game-spine/references/replay.md +11 -11
- package/plugins/claude/skills/game-spine/references/room-api.md +1 -1
- package/plugins/claude/skills/game-spine/references/sdk.md +1 -1
- package/plugins/claude/skills/gdd/SKILL.md +2 -2
- package/plugins/claude/skills/gdd/references/as-built.md +2 -2
- package/plugins/claude/skills/gdd/references/design-measures.md +2 -2
- package/plugins/claude/skills/gdd/references/design-note.md +1 -1
- package/plugins/claude/skills/gdd/references/first-look.md +1 -1
- package/plugins/claude/skills/gdd/references/floors.md +2 -2
- package/plugins/claude/skills/gdd/references/gameplay-contract.md +1 -1
- package/plugins/claude/skills/gdd/references/genre-puzzle.md +4 -4
- package/plugins/claude/skills/gdd/references/genre-racing.md +2 -2
- package/plugins/claude/skills/gdd/references/genre-rpg.md +2 -2
- package/plugins/claude/skills/gdd/references/genre-shooter.md +2 -2
- package/plugins/claude/skills/gdd/references/genre-survival.md +2 -2
- package/plugins/claude/skills/gdd/references/invent-first.md +3 -3
- package/plugins/claude/skills/gdd/references/level-and-fun.md +11 -11
- package/plugins/claude/skills/gdd/references/pages.md +2 -5
- package/plugins/claude/skills/gdd/references/plan-at-size.md +5 -5
- package/plugins/claude/skills/gdd/references/production-tiers.md +11 -11
- package/plugins/claude/skills/gdd/references/sections.md +7 -7
- package/plugins/claude/skills/gdd/references/spec-folder.md +3 -3
- package/plugins/claude/skills/gdd/references/the-path.md +3 -4
- package/plugins/claude/skills/gdd/references/world-and-identity.md +4 -4
- package/plugins/claude/skills/gdd/references/worth.md +4 -4
- package/plugins/claude/skills/mobile-ui/SKILL.md +3 -3
- package/plugins/claude/skills/mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/claude/skills/mobile-ui/references/phone-check.md +1 -1
- package/plugins/claude/skills/mobile-ui/references/recipes.md +1 -1
- package/plugins/claude/skills/mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/claude/skills/mobile-ui/references/unity.md +23 -23
- package/plugins/claude/skills/publishing/references/compose.md +1 -1
- package/plugins/claude/skills/publishing/references/server-build.md +1 -1
- package/plugins/claude/skills/store/SKILL.md +3 -3
- package/plugins/claude/skills/store/references/app-store.md +1 -1
- package/plugins/claude/skills/store/references/google-play.md +2 -2
- package/plugins/claude/skills/store/references/ios-release.md +19 -20
- package/plugins/claude/skills/store/references/money.md +2 -2
- package/plugins/claude/skills/store/references/purchases-and-review.md +18 -18
- package/plugins/claude/skills/store/references/readiness-page.md +1 -1
- package/plugins/claude/skills/store/references/readiness.md +3 -3
- package/plugins/claude/skills/store/references/unity-store.md +9 -12
- package/plugins/claude/skills/unity-game/SKILL.md +28 -35
- package/plugins/claude/skills/unity-game/references/agent-ops.md +9 -9
- package/plugins/claude/skills/unity-game/references/fixes.md +21 -21
- package/plugins/claude/skills/unity-game/references/from-a-web-game.md +17 -17
- package/plugins/claude/skills/unity-game/references/handing-off.md +4 -4
- package/plugins/claude/skills/unity-game/references/performance.md +10 -14
- package/plugins/claude/skills/unity-game/references/probe.md +4 -4
- package/plugins/claude/skills/unity-game/references/shared-mac.md +1 -1
- package/plugins/claude/skills/unity-game/references/traps.md +13 -14
- package/plugins/claude/skills/verifying/references/bar.md +1 -1
- package/plugins/claude/skills/verifying/references/fidelity.md +11 -11
- package/plugins/claude/skills/verifying/references/mobile-qa.md +10 -10
- package/plugins/claude/skills/verifying/references/playtest.md +14 -14
- package/plugins/claude/skills/verifying/references/unity.md +11 -11
- package/plugins/claude/skills/world-and-story/SKILL.md +1 -1
- package/plugins/claude/skills/world-and-story/references/atmosphere.md +4 -4
- package/plugins/claude/skills/world-and-story/references/living-world.md +2 -2
- package/plugins/claude/skills/world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/claude/skills/world-and-story/references/story-at-size.md +2 -2
- package/plugins/claude/skills/world-and-story/references/voice.md +1 -1
- package/plugins/codex/AGENTS.md +1 -1
- package/plugins/codex/README.md +1 -1
- package/plugins/codex/hooks/brief.md +1 -1
- package/plugins/codex/hooks/guidance.json +1 -1
- package/plugins/codex/hooks/host.md +1 -1
- package/plugins/codex/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/codex/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/codex/skills/fp-art-director/SKILL.md +2 -2
- package/plugins/codex/skills/fp-art-director/references/codex.md +1 -1
- package/plugins/codex/skills/fp-audio-director/references/codex.md +1 -1
- package/plugins/codex/skills/fp-critic/references/codex.md +1 -1
- package/plugins/codex/skills/fp-lane/references/codex.md +1 -1
- package/plugins/codex/skills/fp-level-designer/references/codex.md +1 -1
- package/plugins/codex/skills/fp-mobile-qa-seat/references/codex.md +1 -1
- package/plugins/codex/skills/fp-player/references/codex.md +1 -1
- package/plugins/codex/skills/fp-playtest/SKILL.md +2 -2
- package/plugins/codex/skills/fp-qa-lead/references/codex.md +1 -1
- package/plugins/codex/skills/fp-studio/SKILL.md +1 -1
- package/plugins/codex/skills/funpixel-3d/references/bake-off.md +3 -3
- package/plugins/codex/skills/funpixel-3d/references/characters.md +1 -1
- package/plugins/codex/skills/funpixel-3d/references/hero-route.md +5 -5
- package/plugins/codex/skills/funpixel-3d/references/level-spec.md +1 -1
- package/plugins/codex/skills/funpixel-3d/references/levels.md +3 -3
- package/plugins/codex/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/plugins/codex/skills/funpixel-3d/references/painted-target.md +7 -7
- package/plugins/codex/skills/funpixel-3d/references/three-loading.md +4 -4
- package/plugins/codex/skills/funpixel-3d/references/unity.md +13 -13
- package/plugins/codex/skills/funpixel-art/references/animation.md +1 -1
- package/plugins/codex/skills/funpixel-art/references/cast.md +3 -3
- package/plugins/codex/skills/funpixel-art/references/effects.md +2 -2
- package/plugins/codex/skills/funpixel-art/references/frames.md +6 -6
- package/plugins/codex/skills/funpixel-art/references/judging-frames.md +8 -8
- package/plugins/codex/skills/funpixel-art/references/look.md +4 -4
- package/plugins/codex/skills/funpixel-art/references/pipeline.md +2 -2
- package/plugins/codex/skills/funpixel-art/references/prompts.md +4 -4
- package/plugins/codex/skills/funpixel-art/references/ui.md +15 -15
- package/plugins/codex/skills/funpixel-art/references/unity.md +14 -14
- package/plugins/codex/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/plugins/codex/skills/funpixel-audio/references/engine.md +2 -2
- package/plugins/codex/skills/funpixel-audio/references/measure.md +1 -1
- package/plugins/codex/skills/funpixel-audio/references/unity.md +20 -19
- package/plugins/codex/skills/funpixel-game-feel/SKILL.md +4 -4
- package/plugins/codex/skills/funpixel-game-feel/references/contact.md +6 -6
- package/plugins/codex/skills/funpixel-game-feel/references/unity.md +18 -23
- package/plugins/codex/skills/funpixel-game-logic/SKILL.md +3 -3
- package/plugins/codex/skills/funpixel-game-logic/references/balance.md +2 -2
- package/plugins/codex/skills/funpixel-game-logic/references/depth.md +2 -2
- package/plugins/codex/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/plugins/codex/skills/funpixel-game-logic/references/probes.md +10 -10
- package/plugins/codex/skills/funpixel-game-logic/references/unity.md +28 -28
- package/plugins/codex/skills/funpixel-game-spine/SKILL.md +1 -1
- package/plugins/codex/skills/funpixel-game-spine/references/performance.md +2 -2
- package/plugins/codex/skills/funpixel-game-spine/references/replay.md +11 -11
- package/plugins/codex/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/plugins/codex/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/plugins/codex/skills/funpixel-gdd/SKILL.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/as-built.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/design-note.md +1 -1
- package/plugins/codex/skills/funpixel-gdd/references/first-look.md +1 -1
- package/plugins/codex/skills/funpixel-gdd/references/floors.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/plugins/codex/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/plugins/codex/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/plugins/codex/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/plugins/codex/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/plugins/codex/skills/funpixel-gdd/references/pages.md +2 -5
- package/plugins/codex/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/plugins/codex/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/plugins/codex/skills/funpixel-gdd/references/sections.md +7 -7
- package/plugins/codex/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/plugins/codex/skills/funpixel-gdd/references/the-path.md +3 -4
- package/plugins/codex/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/plugins/codex/skills/funpixel-gdd/references/worth.md +4 -4
- package/plugins/codex/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/plugins/codex/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/codex/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/plugins/codex/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/plugins/codex/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/codex/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/plugins/codex/skills/funpixel-publish/references/compose.md +1 -1
- package/plugins/codex/skills/funpixel-publish/references/server-build.md +1 -1
- package/plugins/codex/skills/funpixel-store/SKILL.md +3 -3
- package/plugins/codex/skills/funpixel-store/references/app-store.md +1 -1
- package/plugins/codex/skills/funpixel-store/references/google-play.md +2 -2
- package/plugins/codex/skills/funpixel-store/references/ios-release.md +19 -20
- package/plugins/codex/skills/funpixel-store/references/money.md +2 -2
- package/plugins/codex/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/plugins/codex/skills/funpixel-store/references/readiness-page.md +1 -1
- package/plugins/codex/skills/funpixel-store/references/readiness.md +3 -3
- package/plugins/codex/skills/funpixel-store/references/unity-store.md +9 -12
- package/plugins/codex/skills/funpixel-unity-game/SKILL.md +28 -35
- package/plugins/codex/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/plugins/codex/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/plugins/codex/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/plugins/codex/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/plugins/codex/skills/funpixel-unity-game/references/performance.md +10 -14
- package/plugins/codex/skills/funpixel-unity-game/references/probe.md +4 -4
- package/plugins/codex/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/plugins/codex/skills/funpixel-unity-game/references/traps.md +13 -14
- package/plugins/codex/skills/funpixel-verify/references/bar.md +1 -1
- package/plugins/codex/skills/funpixel-verify/references/fidelity.md +11 -11
- package/plugins/codex/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/plugins/codex/skills/funpixel-verify/references/playtest.md +14 -14
- package/plugins/codex/skills/funpixel-verify/references/unity.md +11 -11
- package/plugins/codex/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/plugins/codex/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/plugins/codex/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/plugins/codex/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/codex/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/plugins/codex/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/plugins/cursor/README.md +1 -1
- package/plugins/cursor/agents/art-director.md +2 -2
- package/plugins/cursor/commands/playtest.md +2 -2
- package/plugins/cursor/hooks/brief.md +1 -1
- package/plugins/cursor/hooks/guidance.json +1 -1
- package/plugins/cursor/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/cursor/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/cursor/rules/funpixel-brief.mdc +1 -1
- package/plugins/cursor/skills/funpixel-3d/references/bake-off.md +3 -3
- package/plugins/cursor/skills/funpixel-3d/references/characters.md +1 -1
- package/plugins/cursor/skills/funpixel-3d/references/hero-route.md +5 -5
- package/plugins/cursor/skills/funpixel-3d/references/level-spec.md +1 -1
- package/plugins/cursor/skills/funpixel-3d/references/levels.md +3 -3
- package/plugins/cursor/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/plugins/cursor/skills/funpixel-3d/references/painted-target.md +7 -7
- package/plugins/cursor/skills/funpixel-3d/references/three-loading.md +4 -4
- package/plugins/cursor/skills/funpixel-3d/references/unity.md +13 -13
- package/plugins/cursor/skills/funpixel-art/references/animation.md +1 -1
- package/plugins/cursor/skills/funpixel-art/references/cast.md +3 -3
- package/plugins/cursor/skills/funpixel-art/references/effects.md +2 -2
- package/plugins/cursor/skills/funpixel-art/references/frames.md +6 -6
- package/plugins/cursor/skills/funpixel-art/references/judging-frames.md +8 -8
- package/plugins/cursor/skills/funpixel-art/references/look.md +4 -4
- package/plugins/cursor/skills/funpixel-art/references/pipeline.md +2 -2
- package/plugins/cursor/skills/funpixel-art/references/prompts.md +4 -4
- package/plugins/cursor/skills/funpixel-art/references/ui.md +15 -15
- package/plugins/cursor/skills/funpixel-art/references/unity.md +14 -14
- package/plugins/cursor/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/plugins/cursor/skills/funpixel-audio/references/engine.md +2 -2
- package/plugins/cursor/skills/funpixel-audio/references/measure.md +1 -1
- package/plugins/cursor/skills/funpixel-audio/references/unity.md +20 -19
- package/plugins/cursor/skills/funpixel-game-feel/SKILL.md +4 -4
- package/plugins/cursor/skills/funpixel-game-feel/references/contact.md +6 -6
- package/plugins/cursor/skills/funpixel-game-feel/references/unity.md +18 -23
- package/plugins/cursor/skills/funpixel-game-logic/SKILL.md +3 -3
- package/plugins/cursor/skills/funpixel-game-logic/references/balance.md +2 -2
- package/plugins/cursor/skills/funpixel-game-logic/references/depth.md +2 -2
- package/plugins/cursor/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/plugins/cursor/skills/funpixel-game-logic/references/probes.md +10 -10
- package/plugins/cursor/skills/funpixel-game-logic/references/unity.md +28 -28
- package/plugins/cursor/skills/funpixel-game-spine/SKILL.md +1 -1
- package/plugins/cursor/skills/funpixel-game-spine/references/performance.md +2 -2
- package/plugins/cursor/skills/funpixel-game-spine/references/replay.md +11 -11
- package/plugins/cursor/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/plugins/cursor/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/plugins/cursor/skills/funpixel-gdd/SKILL.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/as-built.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/design-note.md +1 -1
- package/plugins/cursor/skills/funpixel-gdd/references/first-look.md +1 -1
- package/plugins/cursor/skills/funpixel-gdd/references/floors.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/plugins/cursor/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/plugins/cursor/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/plugins/cursor/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/plugins/cursor/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/plugins/cursor/skills/funpixel-gdd/references/pages.md +2 -5
- package/plugins/cursor/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/plugins/cursor/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/plugins/cursor/skills/funpixel-gdd/references/sections.md +7 -7
- package/plugins/cursor/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/plugins/cursor/skills/funpixel-gdd/references/the-path.md +3 -4
- package/plugins/cursor/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/plugins/cursor/skills/funpixel-gdd/references/worth.md +4 -4
- package/plugins/cursor/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/plugins/cursor/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/cursor/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/plugins/cursor/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/plugins/cursor/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/cursor/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/plugins/cursor/skills/funpixel-publish/references/compose.md +1 -1
- package/plugins/cursor/skills/funpixel-publish/references/server-build.md +1 -1
- package/plugins/cursor/skills/funpixel-store/SKILL.md +3 -3
- package/plugins/cursor/skills/funpixel-store/references/app-store.md +1 -1
- package/plugins/cursor/skills/funpixel-store/references/google-play.md +2 -2
- package/plugins/cursor/skills/funpixel-store/references/ios-release.md +19 -20
- package/plugins/cursor/skills/funpixel-store/references/money.md +2 -2
- package/plugins/cursor/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/plugins/cursor/skills/funpixel-store/references/readiness-page.md +1 -1
- package/plugins/cursor/skills/funpixel-store/references/readiness.md +3 -3
- package/plugins/cursor/skills/funpixel-store/references/unity-store.md +9 -12
- package/plugins/cursor/skills/funpixel-unity-game/SKILL.md +28 -35
- package/plugins/cursor/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/plugins/cursor/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/plugins/cursor/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/plugins/cursor/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/plugins/cursor/skills/funpixel-unity-game/references/performance.md +10 -14
- package/plugins/cursor/skills/funpixel-unity-game/references/probe.md +4 -4
- package/plugins/cursor/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/plugins/cursor/skills/funpixel-unity-game/references/traps.md +13 -14
- package/plugins/cursor/skills/funpixel-verify/references/bar.md +1 -1
- package/plugins/cursor/skills/funpixel-verify/references/fidelity.md +11 -11
- package/plugins/cursor/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/plugins/cursor/skills/funpixel-verify/references/playtest.md +14 -14
- package/plugins/cursor/skills/funpixel-verify/references/unity.md +11 -11
- package/plugins/cursor/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/plugins/cursor/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/plugins/cursor/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/plugins/cursor/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/cursor/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/plugins/cursor/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/plugins/kiro/AGENTS.md +1 -1
- package/plugins/kiro/README.md +1 -1
- package/plugins/kiro/hooks/brief.md +1 -1
- package/plugins/kiro/hooks/guidance.json +1 -1
- package/plugins/kiro/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/kiro/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/kiro/skills/fp-art-director/SKILL.md +2 -2
- package/plugins/kiro/skills/fp-playtest/SKILL.md +2 -2
- package/plugins/kiro/skills/funpixel-3d/references/bake-off.md +3 -3
- package/plugins/kiro/skills/funpixel-3d/references/characters.md +1 -1
- package/plugins/kiro/skills/funpixel-3d/references/hero-route.md +5 -5
- package/plugins/kiro/skills/funpixel-3d/references/level-spec.md +1 -1
- package/plugins/kiro/skills/funpixel-3d/references/levels.md +3 -3
- package/plugins/kiro/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/plugins/kiro/skills/funpixel-3d/references/painted-target.md +7 -7
- package/plugins/kiro/skills/funpixel-3d/references/three-loading.md +4 -4
- package/plugins/kiro/skills/funpixel-3d/references/unity.md +13 -13
- package/plugins/kiro/skills/funpixel-art/references/animation.md +1 -1
- package/plugins/kiro/skills/funpixel-art/references/cast.md +3 -3
- package/plugins/kiro/skills/funpixel-art/references/effects.md +2 -2
- package/plugins/kiro/skills/funpixel-art/references/frames.md +6 -6
- package/plugins/kiro/skills/funpixel-art/references/judging-frames.md +8 -8
- package/plugins/kiro/skills/funpixel-art/references/look.md +4 -4
- package/plugins/kiro/skills/funpixel-art/references/pipeline.md +2 -2
- package/plugins/kiro/skills/funpixel-art/references/prompts.md +4 -4
- package/plugins/kiro/skills/funpixel-art/references/ui.md +15 -15
- package/plugins/kiro/skills/funpixel-art/references/unity.md +14 -14
- package/plugins/kiro/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/plugins/kiro/skills/funpixel-audio/references/engine.md +2 -2
- package/plugins/kiro/skills/funpixel-audio/references/measure.md +1 -1
- package/plugins/kiro/skills/funpixel-audio/references/unity.md +20 -19
- package/plugins/kiro/skills/funpixel-game-feel/SKILL.md +4 -4
- package/plugins/kiro/skills/funpixel-game-feel/references/contact.md +6 -6
- package/plugins/kiro/skills/funpixel-game-feel/references/unity.md +18 -23
- package/plugins/kiro/skills/funpixel-game-logic/SKILL.md +3 -3
- package/plugins/kiro/skills/funpixel-game-logic/references/balance.md +2 -2
- package/plugins/kiro/skills/funpixel-game-logic/references/depth.md +2 -2
- package/plugins/kiro/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/plugins/kiro/skills/funpixel-game-logic/references/probes.md +10 -10
- package/plugins/kiro/skills/funpixel-game-logic/references/unity.md +28 -28
- package/plugins/kiro/skills/funpixel-game-spine/SKILL.md +1 -1
- package/plugins/kiro/skills/funpixel-game-spine/references/performance.md +2 -2
- package/plugins/kiro/skills/funpixel-game-spine/references/replay.md +11 -11
- package/plugins/kiro/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/plugins/kiro/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/plugins/kiro/skills/funpixel-gdd/SKILL.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/as-built.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/design-note.md +1 -1
- package/plugins/kiro/skills/funpixel-gdd/references/first-look.md +1 -1
- package/plugins/kiro/skills/funpixel-gdd/references/floors.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/plugins/kiro/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/plugins/kiro/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/plugins/kiro/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/plugins/kiro/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/plugins/kiro/skills/funpixel-gdd/references/pages.md +2 -5
- package/plugins/kiro/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/plugins/kiro/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/plugins/kiro/skills/funpixel-gdd/references/sections.md +7 -7
- package/plugins/kiro/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/plugins/kiro/skills/funpixel-gdd/references/the-path.md +3 -4
- package/plugins/kiro/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/plugins/kiro/skills/funpixel-gdd/references/worth.md +4 -4
- package/plugins/kiro/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/plugins/kiro/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/kiro/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/plugins/kiro/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/plugins/kiro/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/kiro/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/plugins/kiro/skills/funpixel-publish/references/compose.md +1 -1
- package/plugins/kiro/skills/funpixel-publish/references/server-build.md +1 -1
- package/plugins/kiro/skills/funpixel-store/SKILL.md +3 -3
- package/plugins/kiro/skills/funpixel-store/references/app-store.md +1 -1
- package/plugins/kiro/skills/funpixel-store/references/google-play.md +2 -2
- package/plugins/kiro/skills/funpixel-store/references/ios-release.md +19 -20
- package/plugins/kiro/skills/funpixel-store/references/money.md +2 -2
- package/plugins/kiro/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/plugins/kiro/skills/funpixel-store/references/readiness-page.md +1 -1
- package/plugins/kiro/skills/funpixel-store/references/readiness.md +3 -3
- package/plugins/kiro/skills/funpixel-store/references/unity-store.md +9 -12
- package/plugins/kiro/skills/funpixel-unity-game/SKILL.md +28 -35
- package/plugins/kiro/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/plugins/kiro/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/plugins/kiro/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/plugins/kiro/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/plugins/kiro/skills/funpixel-unity-game/references/performance.md +10 -14
- package/plugins/kiro/skills/funpixel-unity-game/references/probe.md +4 -4
- package/plugins/kiro/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/plugins/kiro/skills/funpixel-unity-game/references/traps.md +13 -14
- package/plugins/kiro/skills/funpixel-verify/references/bar.md +1 -1
- package/plugins/kiro/skills/funpixel-verify/references/fidelity.md +11 -11
- package/plugins/kiro/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/plugins/kiro/skills/funpixel-verify/references/playtest.md +14 -14
- package/plugins/kiro/skills/funpixel-verify/references/unity.md +11 -11
- package/plugins/kiro/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/plugins/kiro/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/plugins/kiro/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/plugins/kiro/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/kiro/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/plugins/kiro/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/plugins/robin/README.md +1 -1
- package/plugins/robin/claude/README.md +2 -3
- package/plugins/robin/claude/agents/art-director.md +2 -2
- package/plugins/robin/claude/commands/playtest.md +2 -2
- package/plugins/robin/claude/hooks/brief.md +1 -1
- package/plugins/robin/claude/hooks/guidance.json +1 -1
- package/plugins/robin/claude/hooks/vendor/pipeline/pipeline.mjs +6 -6
- package/plugins/robin/claude/hooks/vendor/studio/pitch.mjs +1 -1
- package/plugins/robin/claude/skills/3d/references/bake-off.md +3 -3
- package/plugins/robin/claude/skills/3d/references/characters.md +1 -1
- package/plugins/robin/claude/skills/3d/references/hero-route.md +5 -5
- package/plugins/robin/claude/skills/3d/references/level-spec.md +1 -1
- package/plugins/robin/claude/skills/3d/references/levels.md +3 -3
- package/plugins/robin/claude/skills/3d/references/light-and-places.md +3 -3
- package/plugins/robin/claude/skills/3d/references/painted-target.md +7 -7
- package/plugins/robin/claude/skills/3d/references/three-loading.md +4 -4
- package/plugins/robin/claude/skills/3d/references/unity.md +13 -13
- package/plugins/robin/claude/skills/art/references/animation.md +1 -1
- package/plugins/robin/claude/skills/art/references/cast.md +3 -3
- package/plugins/robin/claude/skills/art/references/effects.md +2 -2
- package/plugins/robin/claude/skills/art/references/frames.md +6 -6
- package/plugins/robin/claude/skills/art/references/judging-frames.md +8 -8
- package/plugins/robin/claude/skills/art/references/look.md +4 -4
- package/plugins/robin/claude/skills/art/references/pipeline.md +2 -2
- package/plugins/robin/claude/skills/art/references/prompts.md +4 -4
- package/plugins/robin/claude/skills/art/references/ui.md +15 -15
- package/plugins/robin/claude/skills/art/references/unity.md +14 -14
- package/plugins/robin/claude/skills/audio/references/adaptive-music.md +4 -4
- package/plugins/robin/claude/skills/audio/references/engine.md +2 -2
- package/plugins/robin/claude/skills/audio/references/measure.md +1 -1
- package/plugins/robin/claude/skills/audio/references/unity.md +20 -19
- package/plugins/robin/claude/skills/game-feel/SKILL.md +4 -4
- package/plugins/robin/claude/skills/game-feel/references/contact.md +6 -6
- package/plugins/robin/claude/skills/game-feel/references/unity.md +18 -23
- package/plugins/robin/claude/skills/game-logic/SKILL.md +3 -3
- package/plugins/robin/claude/skills/game-logic/references/balance.md +2 -2
- package/plugins/robin/claude/skills/game-logic/references/depth.md +2 -2
- package/plugins/robin/claude/skills/game-logic/references/escalation.md +5 -5
- package/plugins/robin/claude/skills/game-logic/references/probes.md +10 -10
- package/plugins/robin/claude/skills/game-logic/references/unity.md +28 -28
- package/plugins/robin/claude/skills/game-spine/SKILL.md +1 -1
- package/plugins/robin/claude/skills/game-spine/references/performance.md +2 -2
- package/plugins/robin/claude/skills/game-spine/references/replay.md +11 -11
- package/plugins/robin/claude/skills/game-spine/references/room-api.md +1 -1
- package/plugins/robin/claude/skills/game-spine/references/sdk.md +1 -1
- package/plugins/robin/claude/skills/gdd/SKILL.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/as-built.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/design-measures.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/design-note.md +1 -1
- package/plugins/robin/claude/skills/gdd/references/first-look.md +1 -1
- package/plugins/robin/claude/skills/gdd/references/floors.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/gameplay-contract.md +1 -1
- package/plugins/robin/claude/skills/gdd/references/genre-puzzle.md +4 -4
- package/plugins/robin/claude/skills/gdd/references/genre-racing.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/genre-rpg.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/genre-shooter.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/genre-survival.md +2 -2
- package/plugins/robin/claude/skills/gdd/references/invent-first.md +3 -3
- package/plugins/robin/claude/skills/gdd/references/level-and-fun.md +11 -11
- package/plugins/robin/claude/skills/gdd/references/pages.md +2 -5
- package/plugins/robin/claude/skills/gdd/references/plan-at-size.md +5 -5
- package/plugins/robin/claude/skills/gdd/references/production-tiers.md +11 -11
- package/plugins/robin/claude/skills/gdd/references/sections.md +7 -7
- package/plugins/robin/claude/skills/gdd/references/spec-folder.md +3 -3
- package/plugins/robin/claude/skills/gdd/references/the-path.md +3 -4
- package/plugins/robin/claude/skills/gdd/references/world-and-identity.md +4 -4
- package/plugins/robin/claude/skills/gdd/references/worth.md +4 -4
- package/plugins/robin/claude/skills/mobile-ui/SKILL.md +3 -3
- package/plugins/robin/claude/skills/mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/robin/claude/skills/mobile-ui/references/phone-check.md +1 -1
- package/plugins/robin/claude/skills/mobile-ui/references/recipes.md +1 -1
- package/plugins/robin/claude/skills/mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/robin/claude/skills/mobile-ui/references/unity.md +23 -23
- package/plugins/robin/claude/skills/publishing/references/compose.md +1 -1
- package/plugins/robin/claude/skills/publishing/references/server-build.md +1 -1
- package/plugins/robin/claude/skills/store/SKILL.md +3 -3
- package/plugins/robin/claude/skills/store/references/app-store.md +1 -1
- package/plugins/robin/claude/skills/store/references/google-play.md +2 -2
- package/plugins/robin/claude/skills/store/references/ios-release.md +19 -20
- package/plugins/robin/claude/skills/store/references/money.md +2 -2
- package/plugins/robin/claude/skills/store/references/purchases-and-review.md +18 -18
- package/plugins/robin/claude/skills/store/references/readiness-page.md +1 -1
- package/plugins/robin/claude/skills/store/references/readiness.md +3 -3
- package/plugins/robin/claude/skills/store/references/unity-store.md +9 -12
- package/plugins/robin/claude/skills/unity-game/SKILL.md +28 -35
- package/plugins/robin/claude/skills/unity-game/references/agent-ops.md +9 -9
- package/plugins/robin/claude/skills/unity-game/references/fixes.md +21 -21
- package/plugins/robin/claude/skills/unity-game/references/from-a-web-game.md +17 -17
- package/plugins/robin/claude/skills/unity-game/references/handing-off.md +4 -4
- package/plugins/robin/claude/skills/unity-game/references/performance.md +10 -14
- package/plugins/robin/claude/skills/unity-game/references/probe.md +4 -4
- package/plugins/robin/claude/skills/unity-game/references/shared-mac.md +1 -1
- package/plugins/robin/claude/skills/unity-game/references/traps.md +13 -14
- package/plugins/robin/claude/skills/verifying/references/bar.md +1 -1
- package/plugins/robin/claude/skills/verifying/references/fidelity.md +11 -11
- package/plugins/robin/claude/skills/verifying/references/mobile-qa.md +10 -10
- package/plugins/robin/claude/skills/verifying/references/playtest.md +14 -14
- package/plugins/robin/claude/skills/verifying/references/unity.md +11 -11
- package/plugins/robin/claude/skills/world-and-story/SKILL.md +1 -1
- package/plugins/robin/claude/skills/world-and-story/references/atmosphere.md +4 -4
- package/plugins/robin/claude/skills/world-and-story/references/living-world.md +2 -2
- package/plugins/robin/claude/skills/world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/robin/claude/skills/world-and-story/references/story-at-size.md +2 -2
- package/plugins/robin/claude/skills/world-and-story/references/voice.md +1 -1
- package/plugins/robin/skills/fp-playtest/SKILL.md +2 -2
- package/plugins/robin/skills/funpixel-3d/references/bake-off.md +3 -3
- package/plugins/robin/skills/funpixel-3d/references/characters.md +1 -1
- package/plugins/robin/skills/funpixel-3d/references/hero-route.md +5 -5
- package/plugins/robin/skills/funpixel-3d/references/level-spec.md +1 -1
- package/plugins/robin/skills/funpixel-3d/references/levels.md +3 -3
- package/plugins/robin/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/plugins/robin/skills/funpixel-3d/references/painted-target.md +7 -7
- package/plugins/robin/skills/funpixel-3d/references/three-loading.md +4 -4
- package/plugins/robin/skills/funpixel-3d/references/unity.md +13 -13
- package/plugins/robin/skills/funpixel-art/references/animation.md +1 -1
- package/plugins/robin/skills/funpixel-art/references/cast.md +3 -3
- package/plugins/robin/skills/funpixel-art/references/effects.md +2 -2
- package/plugins/robin/skills/funpixel-art/references/frames.md +6 -6
- package/plugins/robin/skills/funpixel-art/references/judging-frames.md +8 -8
- package/plugins/robin/skills/funpixel-art/references/look.md +4 -4
- package/plugins/robin/skills/funpixel-art/references/pipeline.md +2 -2
- package/plugins/robin/skills/funpixel-art/references/prompts.md +4 -4
- package/plugins/robin/skills/funpixel-art/references/ui.md +15 -15
- package/plugins/robin/skills/funpixel-art/references/unity.md +14 -14
- package/plugins/robin/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/plugins/robin/skills/funpixel-audio/references/engine.md +2 -2
- package/plugins/robin/skills/funpixel-audio/references/measure.md +1 -1
- package/plugins/robin/skills/funpixel-audio/references/unity.md +20 -19
- package/plugins/robin/skills/funpixel-brief/SKILL.md +1 -1
- package/plugins/robin/skills/funpixel-game-feel/SKILL.md +4 -4
- package/plugins/robin/skills/funpixel-game-feel/references/contact.md +6 -6
- package/plugins/robin/skills/funpixel-game-feel/references/unity.md +18 -23
- package/plugins/robin/skills/funpixel-game-logic/SKILL.md +3 -3
- package/plugins/robin/skills/funpixel-game-logic/references/balance.md +2 -2
- package/plugins/robin/skills/funpixel-game-logic/references/depth.md +2 -2
- package/plugins/robin/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/plugins/robin/skills/funpixel-game-logic/references/probes.md +10 -10
- package/plugins/robin/skills/funpixel-game-logic/references/unity.md +28 -28
- package/plugins/robin/skills/funpixel-game-spine/SKILL.md +1 -1
- package/plugins/robin/skills/funpixel-game-spine/references/performance.md +2 -2
- package/plugins/robin/skills/funpixel-game-spine/references/replay.md +11 -11
- package/plugins/robin/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/plugins/robin/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/plugins/robin/skills/funpixel-gdd/SKILL.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/as-built.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/design-note.md +1 -1
- package/plugins/robin/skills/funpixel-gdd/references/first-look.md +1 -1
- package/plugins/robin/skills/funpixel-gdd/references/floors.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/plugins/robin/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/plugins/robin/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/plugins/robin/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/plugins/robin/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/plugins/robin/skills/funpixel-gdd/references/pages.md +2 -5
- package/plugins/robin/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/plugins/robin/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/plugins/robin/skills/funpixel-gdd/references/sections.md +7 -7
- package/plugins/robin/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/plugins/robin/skills/funpixel-gdd/references/the-path.md +3 -4
- package/plugins/robin/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/plugins/robin/skills/funpixel-gdd/references/worth.md +4 -4
- package/plugins/robin/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/plugins/robin/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/plugins/robin/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/plugins/robin/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/plugins/robin/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/plugins/robin/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/plugins/robin/skills/funpixel-publish/references/compose.md +1 -1
- package/plugins/robin/skills/funpixel-publish/references/server-build.md +1 -1
- package/plugins/robin/skills/funpixel-store/SKILL.md +3 -3
- package/plugins/robin/skills/funpixel-store/references/app-store.md +1 -1
- package/plugins/robin/skills/funpixel-store/references/google-play.md +2 -2
- package/plugins/robin/skills/funpixel-store/references/ios-release.md +19 -20
- package/plugins/robin/skills/funpixel-store/references/money.md +2 -2
- package/plugins/robin/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/plugins/robin/skills/funpixel-store/references/readiness-page.md +1 -1
- package/plugins/robin/skills/funpixel-store/references/readiness.md +3 -3
- package/plugins/robin/skills/funpixel-store/references/unity-store.md +9 -12
- package/plugins/robin/skills/funpixel-unity-game/SKILL.md +28 -35
- package/plugins/robin/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/plugins/robin/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/plugins/robin/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/plugins/robin/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/plugins/robin/skills/funpixel-unity-game/references/performance.md +10 -14
- package/plugins/robin/skills/funpixel-unity-game/references/probe.md +4 -4
- package/plugins/robin/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/plugins/robin/skills/funpixel-unity-game/references/traps.md +13 -14
- package/plugins/robin/skills/funpixel-verify/references/bar.md +1 -1
- package/plugins/robin/skills/funpixel-verify/references/fidelity.md +11 -11
- package/plugins/robin/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/plugins/robin/skills/funpixel-verify/references/playtest.md +14 -14
- package/plugins/robin/skills/funpixel-verify/references/unity.md +11 -11
- package/plugins/robin/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/plugins/robin/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/plugins/robin/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/plugins/robin/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/plugins/robin/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/plugins/robin/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/templates/common/.agents/skills/funpixel-3d/references/bake-off.md +3 -3
- package/templates/common/.agents/skills/funpixel-3d/references/characters.md +1 -1
- package/templates/common/.agents/skills/funpixel-3d/references/hero-route.md +5 -5
- package/templates/common/.agents/skills/funpixel-3d/references/level-spec.md +1 -1
- package/templates/common/.agents/skills/funpixel-3d/references/levels.md +3 -3
- package/templates/common/.agents/skills/funpixel-3d/references/light-and-places.md +3 -3
- package/templates/common/.agents/skills/funpixel-3d/references/painted-target.md +7 -7
- package/templates/common/.agents/skills/funpixel-3d/references/three-loading.md +4 -4
- package/templates/common/.agents/skills/funpixel-3d/references/unity.md +13 -13
- package/templates/common/.agents/skills/funpixel-art/references/animation.md +1 -1
- package/templates/common/.agents/skills/funpixel-art/references/cast.md +3 -3
- package/templates/common/.agents/skills/funpixel-art/references/effects.md +2 -2
- package/templates/common/.agents/skills/funpixel-art/references/frames.md +6 -6
- package/templates/common/.agents/skills/funpixel-art/references/judging-frames.md +8 -8
- package/templates/common/.agents/skills/funpixel-art/references/look.md +4 -4
- package/templates/common/.agents/skills/funpixel-art/references/pipeline.md +2 -2
- package/templates/common/.agents/skills/funpixel-art/references/prompts.md +4 -4
- package/templates/common/.agents/skills/funpixel-art/references/ui.md +15 -15
- package/templates/common/.agents/skills/funpixel-art/references/unity.md +14 -14
- package/templates/common/.agents/skills/funpixel-audio/references/adaptive-music.md +4 -4
- package/templates/common/.agents/skills/funpixel-audio/references/engine.md +2 -2
- package/templates/common/.agents/skills/funpixel-audio/references/measure.md +1 -1
- package/templates/common/.agents/skills/funpixel-audio/references/unity.md +20 -19
- package/templates/common/.agents/skills/funpixel-game-feel/SKILL.md +4 -4
- package/templates/common/.agents/skills/funpixel-game-feel/references/contact.md +6 -6
- package/templates/common/.agents/skills/funpixel-game-feel/references/unity.md +18 -23
- package/templates/common/.agents/skills/funpixel-game-logic/SKILL.md +3 -3
- package/templates/common/.agents/skills/funpixel-game-logic/references/balance.md +2 -2
- package/templates/common/.agents/skills/funpixel-game-logic/references/depth.md +2 -2
- package/templates/common/.agents/skills/funpixel-game-logic/references/escalation.md +5 -5
- package/templates/common/.agents/skills/funpixel-game-logic/references/probes.md +10 -10
- package/templates/common/.agents/skills/funpixel-game-logic/references/unity.md +28 -28
- package/templates/common/.agents/skills/funpixel-game-spine/SKILL.md +1 -1
- package/templates/common/.agents/skills/funpixel-game-spine/references/performance.md +2 -2
- package/templates/common/.agents/skills/funpixel-game-spine/references/replay.md +11 -11
- package/templates/common/.agents/skills/funpixel-game-spine/references/room-api.md +1 -1
- package/templates/common/.agents/skills/funpixel-game-spine/references/sdk.md +1 -1
- package/templates/common/.agents/skills/funpixel-gdd/SKILL.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/as-built.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/design-measures.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/design-note.md +1 -1
- package/templates/common/.agents/skills/funpixel-gdd/references/first-look.md +1 -1
- package/templates/common/.agents/skills/funpixel-gdd/references/floors.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/gameplay-contract.md +1 -1
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-puzzle.md +4 -4
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-racing.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-rpg.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-shooter.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/genre-survival.md +2 -2
- package/templates/common/.agents/skills/funpixel-gdd/references/invent-first.md +3 -3
- package/templates/common/.agents/skills/funpixel-gdd/references/level-and-fun.md +11 -11
- package/templates/common/.agents/skills/funpixel-gdd/references/pages.md +2 -5
- package/templates/common/.agents/skills/funpixel-gdd/references/plan-at-size.md +5 -5
- package/templates/common/.agents/skills/funpixel-gdd/references/production-tiers.md +11 -11
- package/templates/common/.agents/skills/funpixel-gdd/references/sections.md +7 -7
- package/templates/common/.agents/skills/funpixel-gdd/references/spec-folder.md +3 -3
- package/templates/common/.agents/skills/funpixel-gdd/references/the-path.md +3 -4
- package/templates/common/.agents/skills/funpixel-gdd/references/world-and-identity.md +4 -4
- package/templates/common/.agents/skills/funpixel-gdd/references/worth.md +4 -4
- package/templates/common/.agents/skills/funpixel-mobile-ui/SKILL.md +3 -3
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/hud-and-title.md +3 -3
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/phone-check.md +1 -1
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/recipes.md +1 -1
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/restyle-ui.md +11 -11
- package/templates/common/.agents/skills/funpixel-mobile-ui/references/unity.md +23 -23
- package/templates/common/.agents/skills/funpixel-publish/references/compose.md +1 -1
- package/templates/common/.agents/skills/funpixel-publish/references/server-build.md +1 -1
- package/templates/common/.agents/skills/funpixel-store/SKILL.md +3 -3
- package/templates/common/.agents/skills/funpixel-store/references/app-store.md +1 -1
- package/templates/common/.agents/skills/funpixel-store/references/google-play.md +2 -2
- package/templates/common/.agents/skills/funpixel-store/references/ios-release.md +19 -20
- package/templates/common/.agents/skills/funpixel-store/references/money.md +2 -2
- package/templates/common/.agents/skills/funpixel-store/references/purchases-and-review.md +18 -18
- package/templates/common/.agents/skills/funpixel-store/references/readiness-page.md +1 -1
- package/templates/common/.agents/skills/funpixel-store/references/readiness.md +3 -3
- package/templates/common/.agents/skills/funpixel-store/references/unity-store.md +9 -12
- package/templates/common/.agents/skills/funpixel-unity-game/SKILL.md +28 -35
- package/templates/common/.agents/skills/funpixel-unity-game/references/agent-ops.md +9 -9
- package/templates/common/.agents/skills/funpixel-unity-game/references/fixes.md +21 -21
- package/templates/common/.agents/skills/funpixel-unity-game/references/from-a-web-game.md +17 -17
- package/templates/common/.agents/skills/funpixel-unity-game/references/handing-off.md +4 -4
- package/templates/common/.agents/skills/funpixel-unity-game/references/performance.md +10 -14
- package/templates/common/.agents/skills/funpixel-unity-game/references/probe.md +4 -4
- package/templates/common/.agents/skills/funpixel-unity-game/references/shared-mac.md +1 -1
- package/templates/common/.agents/skills/funpixel-unity-game/references/traps.md +13 -14
- package/templates/common/.agents/skills/funpixel-verify/references/bar.md +1 -1
- package/templates/common/.agents/skills/funpixel-verify/references/fidelity.md +11 -11
- package/templates/common/.agents/skills/funpixel-verify/references/mobile-qa.md +10 -10
- package/templates/common/.agents/skills/funpixel-verify/references/playtest.md +14 -14
- package/templates/common/.agents/skills/funpixel-verify/references/unity.md +11 -11
- package/templates/common/.agents/skills/funpixel-world-and-story/SKILL.md +1 -1
- package/templates/common/.agents/skills/funpixel-world-and-story/references/atmosphere.md +4 -4
- package/templates/common/.agents/skills/funpixel-world-and-story/references/living-world.md +2 -2
- package/templates/common/.agents/skills/funpixel-world-and-story/references/opening-and-chapters.md +1 -1
- package/templates/common/.agents/skills/funpixel-world-and-story/references/story-at-size.md +2 -2
- package/templates/common/.agents/skills/funpixel-world-and-story/references/voice.md +1 -1
- package/templates/common/AGENTS.md +1 -1
- package/templates/common/src/platform.ts +1 -1
- package/templates/common/src/probe-human.ts +3 -3
- package/templates/common/src/save.ts +1 -1
- package/templates/common/test/platform.test.ts +1 -1
- package/templates/three-world/src/budget.ts +1 -1
- package/templates/three-world/src/cutouts.ts +2 -2
- package/templates/three-world/src/game.ts +1 -1
- package/templates/three-world/src/models.ts +1 -1
- package/unity/com.funpixel.probe/Runtime/Player/Args.cs +1 -1
- package/unity/com.funpixel.probe/Runtime/Player/Bridge.cs +2 -2
- package/unity/com.funpixel.probe/Runtime/Player/Capture.cs +2 -2
- package/unity/com.funpixel.probe/Runtime/Player/Inject.cs +1 -2
- package/unity/com.funpixel.probe/Runtime/Player/Probe.cs +2 -2
- package/unity/com.funpixel.probe/Runtime/Player/UiTargets.cs +1 -1
- package/plugins/claude/skills/unity-game/references/studio-packages.md +0 -127
- package/plugins/codex/skills/funpixel-unity-game/references/studio-packages.md +0 -127
- package/plugins/cursor/skills/funpixel-unity-game/references/studio-packages.md +0 -127
- package/plugins/kiro/skills/funpixel-unity-game/references/studio-packages.md +0 -127
- package/plugins/robin/claude/skills/unity-game/references/studio-packages.md +0 -127
- package/plugins/robin/skills/funpixel-unity-game/references/studio-packages.md +0 -127
- package/templates/common/.agents/skills/funpixel-unity-game/references/studio-packages.md +0 -127
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
2
2
|
"""`bake_emissive` — make only the bright parts of a texture glow (plan b10).
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
One studio's prep script baked "an emissive mask from V or S·V smoothstep, so
|
|
5
5
|
only neon, lanterns and windows glow" (research 12 §3 #13). A whole material
|
|
6
6
|
set emissive glows everywhere, and a bloom pass then washes the model out —
|
|
7
|
-
|
|
7
|
+
a night-market game also found that an emissive boost of 3.5 "blew out the
|
|
8
8
|
bloom" (§2.1), which is why `strength` is capped on the Rust side.
|
|
9
9
|
|
|
10
10
|
For each material whose base colour is an image: read the pixels, score each
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"""`decimate` — bring a model down to a triangle budget (plan b10), or to a
|
|
3
3
|
share of what it has (`ratio`, plan b8; `lod` chains it).
|
|
4
4
|
|
|
5
|
-
WHY: what shipped on phones
|
|
5
|
+
WHY: what shipped on phones in one studio's games was 0.8–9K triangles per mesh (research
|
|
6
6
|
12 §2.3); fal's Hunyuan cannot go below 40K and a Pro mesh is often 300–450K
|
|
7
7
|
(measured on the harness games' rigged characters). The budget is the
|
|
8
8
|
caller's — this verb only meets it.
|
|
@@ -11,7 +11,7 @@ NEVER WELDS. The glTF importer splits a vertex wherever its UV changes, so a UV
|
|
|
11
11
|
seam is an open boundary in Blender. Edge collapse cannot cross a boundary it
|
|
12
12
|
is not connected to, so every UV island keeps its own UVs. Merging vertices
|
|
13
13
|
first ("remove doubles") connects the islands, and the collapse then drags UVs
|
|
14
|
-
across the seam:
|
|
14
|
+
across the seam: one studio lost about an hour to exactly that — the sign "RAMEN"
|
|
15
15
|
decimated to "RMEN" (research 12 §2.3.4; `funpixel-glb-optimize` refuses to
|
|
16
16
|
weld for the same reason). `uv_split_vertices` is reported before and after so
|
|
17
17
|
a caller can SEE that no seam was crossed: a vertex whose corners disagree on
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
2
2
|
"""`fracture` — pre-break a prop into Voronoi shards that keep their UVs (b10).
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
One studio's smashing game broke pre-fractured pieces, and its prep script
|
|
5
5
|
did it this way (research 12 §3 #12): seeds inside the bounds, one cell per
|
|
6
6
|
seed, each cell cut out of the whole mesh by repeated `bisect_plane` against
|
|
7
7
|
every other seed, the cut holes filled — "so every shard carries its piece of
|
|
@@ -7,9 +7,9 @@ generator's GLB arrives with a root node carrying a scale, a rotation or an
|
|
|
7
7
|
offset, an FBX in centimetres carries 0.01 on every object, and the origin sits
|
|
8
8
|
wherever the tool left it. Physics, snapping to the floor and instancing all
|
|
9
9
|
read the root transform, so each of those becomes the game's problem.
|
|
10
|
-
|
|
11
|
-
height with the origin at the base"
|
|
12
|
-
in metres".
|
|
10
|
+
One studio's prep scripts did exactly this before shipping ("normalise to unit
|
|
11
|
+
height with the origin at the base"; another "fits one dimension
|
|
12
|
+
in metres").
|
|
13
13
|
|
|
14
14
|
AFTERWARDS: every mesh has an identity transform, the model's lowest point sits
|
|
15
15
|
on y = 0 (glTF) with its footprint centred on the origin, and if `height_m` was
|
|
@@ -43,12 +43,12 @@ def prepare(args, before_arrays=None):
|
|
|
43
43
|
return model, cams, located_by, all_slots, texels.slot_lookup(model, all_slots)
|
|
44
44
|
|
|
45
45
|
|
|
46
|
-
# Workbench's object outline colour in the
|
|
46
|
+
# Workbench's object outline colour in the owner's fidelity renders (FID_OUTLINE).
|
|
47
47
|
INK = np.array([0.07, 0.06, 0.05], dtype=np.float32)
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
def _ink(model, tri, zbuf, size, rgb, alpha):
|
|
51
|
-
"""The ink look (
|
|
51
|
+
"""The ink look (FID_OUTLINE, Workbench's object outline): a one-pixel line where
|
|
52
52
|
one object meets another or nothing, drawn on the FARTHER side — outside the silhouette,
|
|
53
53
|
and behind a nearer object."""
|
|
54
54
|
owner = np.where(tri >= 0, model.owner[np.maximum(tri, 0)], -1).reshape(size, size)
|
package/bench/handlers/views.py
CHANGED
|
@@ -23,10 +23,10 @@ VIEW_SETS = {
|
|
|
23
23
|
}
|
|
24
24
|
# `fidelity`: the model squared to its principal axes, from every side and three heights, in
|
|
25
25
|
# both orientations about its long axis (glTF axis signs are ambiguous) — the renders a set of
|
|
26
|
-
# reference views is scored against (funtools fidelity). Ported from the owner's
|
|
26
|
+
# reference views is scored against (funtools fidelity). Ported from the owner's fidelity tools
|
|
27
27
|
# (tools/fidelity/render_views.py with FID_ALIGN and FID_FLIP, as called by score_round.py): orthographic, 8 yaws x 3 heights x 2 orientations = 48 views.
|
|
28
28
|
FIDELITY_YAWS = (0, 45, 90, 135, 180, 225, 270, 315)
|
|
29
|
-
# 89, not 90: straight down leaves "up" undefined; the
|
|
29
|
+
# 89, not 90: straight down leaves "up" undefined; the owner's renders used 89 too.
|
|
30
30
|
FIDELITY_ELEVATIONS = (0, 25, 89)
|
|
31
31
|
FIDELITY_ORIENTATIONS = ("n", "f") # as squared; rolled 180 degrees about the long axis
|
|
32
32
|
FIDELITY_SIZE = 512
|
|
@@ -126,7 +126,7 @@ def _shape_points(model):
|
|
|
126
126
|
def principal_axes(model, flip=False, roll=False):
|
|
127
127
|
"""Rows: the model's longest axis (new X, length), smallest (new Y, depth), middle (new Z,
|
|
128
128
|
height), a right-handed frame; `flip` rolls it 180 degrees about the long axis, `roll` a
|
|
129
|
-
further 90 (
|
|
129
|
+
further 90 (FID_ROLL: a model deeper than it is tall squares onto its side, because
|
|
130
130
|
its middle axis is then not "up"). And the vertex centroid it turns about."""
|
|
131
131
|
c = model.pos.mean(axis=0)
|
|
132
132
|
_, v = np.linalg.eigh(np.cov((model.pos - c).T)) # ascending
|
|
@@ -142,11 +142,11 @@ def principal_axes(model, flip=False, roll=False):
|
|
|
142
142
|
|
|
143
143
|
|
|
144
144
|
def fidelity_cameras(model, align=True, roll=False):
|
|
145
|
-
"""The `fidelity` set: each camera is placed round the SQUARED model exactly as the
|
|
145
|
+
"""The `fidelity` set: each camera is placed round the SQUARED model exactly as the owner's
|
|
146
146
|
renders were (yaw 0 looks along +Y of the squared frame, up is its +Z), then turned back into
|
|
147
147
|
the model's own space, so the model itself is never moved.
|
|
148
148
|
|
|
149
|
-
`align=False` (
|
|
149
|
+
`align=False` (FID_ALIGN=0) keeps the model's own axes: for a model BUILT square to
|
|
150
150
|
them, which principal axes would tilt where its mass skews them (measured on the hand-built
|
|
151
151
|
Corer, 10 Oct 2026). Its two orientations are the same picture, so it is 24 views, not 48."""
|
|
152
152
|
out = []
|
|
@@ -158,7 +158,7 @@ def fidelity_cameras(model, align=True, roll=False):
|
|
|
158
158
|
sq = (model.pos - c) @ r.T
|
|
159
159
|
lo, hi = sq.min(axis=0), sq.max(axis=0)
|
|
160
160
|
centre_sq = (lo + hi) / 2
|
|
161
|
-
half = float(np.linalg.norm(hi - lo) / 2 * 1.1) #
|
|
161
|
+
half = float(np.linalg.norm(hi - lo) / 2 * 1.1) # as the owner's: ortho_scale = 2.2 x radius
|
|
162
162
|
for elev in FIDELITY_ELEVATIONS:
|
|
163
163
|
for yaw in FIDELITY_YAWS:
|
|
164
164
|
ay, ae = np.radians(yaw), np.radians(elev)
|
package/dist/cli.js
CHANGED
|
@@ -269,7 +269,7 @@ export const USAGE = `usage:
|
|
|
269
269
|
| progress ask "<question>" --kind taste|spend|scope --options a,b [--default a] [--timeout 10m]
|
|
270
270
|
| progress answer <Q> <option> ["words"] | progress wait [Q] [--for 15m] | progress report
|
|
271
271
|
[--dir game] [--json]
|
|
272
|
-
funtools feedback collect <folder…> [--out report.md] [--propose] [--html page.html] [--
|
|
272
|
+
funtools feedback collect <folder…> [--out report.md] [--propose] [--html page.html] [--json]
|
|
273
273
|
funtools feedback log "<what happened>" [--kind step|test|dead-end|lesson|decision|worked|didnt|owner]
|
|
274
274
|
[--metric name --before n --after n --unit u] [--evidence path] [--film path] [--sha commit]
|
|
275
275
|
[--test name] [--cost-usd n] [--minutes n] [--minutes-lost n] [--tool name] [--stage s]
|
|
@@ -413,10 +413,10 @@ export const USAGE = `usage:
|
|
|
413
413
|
(one table: Shader.WarmupAllShaders on URP, UnityEngine.Input on the Input System
|
|
414
414
|
only, -quit with -runTests…); a Shader.Find nothing references; GLBs glTFast cannot
|
|
415
415
|
decode (meshopt, Basis, WebP); ProjectSettings drifted from the project's own setup
|
|
416
|
-
method; the fixes
|
|
416
|
+
method; the fixes past builds repeated (48 kHz, Unity audio switched off,
|
|
417
417
|
mipmapped NPOT and uncompressed textures with their MB, .meta files an import rule
|
|
418
418
|
rewrites, a productGUID, metroPackageName or .gitattributes cloned from another project
|
|
419
|
-
on this Mac, which branch and commit each file:
|
|
419
|
+
on this Mac, which branch and commit each file: shared package compiles, Firebase on the
|
|
420
420
|
Simulator, ungated launch flags, EditorApplication.Exit outside batch mode, the
|
|
421
421
|
netstandard guard, IL2CPP numbers, Simulator UDIDs typed into scripts), each a warn or
|
|
422
422
|
a note with its fix but a build that plays no sound; then this Mac: the Editor and the
|
|
@@ -1192,9 +1192,8 @@ export const USAGE = `usage:
|
|
|
1192
1192
|
notes outrank any agent claim), what worked by its measured change (--before/--after, or
|
|
1193
1193
|
"34 -> 25.5 ms" in the words; a lesson that says it fixed something counts), each entry's
|
|
1194
1194
|
evidence checked to exist (a file, a commit, a test; else unverified), dead ends by the
|
|
1195
|
-
hours they burned, cost and time per game, and A/B records (.funtools/ab.jsonl
|
|
1196
|
-
|
|
1197
|
-
level design by 1.8 in 1 of 2". --propose drafts one kit edit per top recurring lesson;
|
|
1195
|
+
hours they burned, cost and time per game, and A/B records (.funtools/ab.jsonl) as "GDK
|
|
1196
|
+
lost level design by 1.8 in 1 of 2". --propose drafts one kit edit per top recurring lesson;
|
|
1198
1197
|
--html writes one page with filters. \`ab\` records an A/B; \`merged\` writes the merge
|
|
1199
1198
|
commit as a worked entry with the numbers the tools logged since its merge base (sim,
|
|
1200
1199
|
play, hook, life, profile and playtest log theirs as measure lines on their own)
|
|
@@ -1452,7 +1451,7 @@ export const USAGE = `usage:
|
|
|
1452
1451
|
and any name inside another (run / run_fast, idle / idle_long, walk / walkback),
|
|
1453
1452
|
repeated or missing: a lookup by name can play the wrong clip
|
|
1454
1453
|
exit 0 every name apart · 1 a collision · 2 no clips (not observed) · 3 error
|
|
1455
|
-
fidelity how closely a 3D model matches its reference views, 0-100 each (the owner's
|
|
1454
|
+
fidelity how closely a 3D model matches its reference views, 0-100 each (the owner's
|
|
1456
1455
|
scorer): silhouette 35%, palette 30% (ΔE), tonal structure 20%, ink lines 15%, each view
|
|
1457
1456
|
against its best of the bench's 48 fixed cameras (8 yaws × 3 heights × both ways up),
|
|
1458
1457
|
rendered on your own Blender 4.2+ (free) at the references' own size, or --renders <dir>.
|
|
@@ -1637,7 +1636,7 @@ export const SPECS = {
|
|
|
1637
1636
|
feedback: {
|
|
1638
1637
|
'--out': true, '--json': false, '--kind': true, '--cost-usd': true, '--minutes': true, '--evidence': true, '--dir': true,
|
|
1639
1638
|
'--metric': true, '--before': true, '--after': true, '--unit': true, '--sha': true, '--film': true, '--test': true, '--minutes-lost': true,
|
|
1640
|
-
'--tool': true, '--stage': true, '--verdict': true, '--screenshot': true, '--propose': false, '--html': true,
|
|
1639
|
+
'--tool': true, '--stage': true, '--verdict': true, '--screenshot': true, '--propose': false, '--html': true,
|
|
1641
1640
|
'--what': true, '--routes': true, '--overall': true, '--axes': true, '--winner': true, '--judges': true,
|
|
1642
1641
|
},
|
|
1643
1642
|
journal: { '--why': true, '--by': true, '--files': true, '--values': true, '--dir': true, '--json': false },
|
|
@@ -2377,7 +2376,7 @@ export async function main(argv, io = console) {
|
|
|
2377
2376
|
metric: str(flags['--metric']), before: str(flags['--before']), after: str(flags['--after']), unit: str(flags['--unit']),
|
|
2378
2377
|
sha: str(flags['--sha']), film: str(flags['--film']), test: str(flags['--test']), minutesLost: str(flags['--minutes-lost']),
|
|
2379
2378
|
tool: str(flags['--tool']), stage: str(flags['--stage']), verdict: str(flags['--verdict']), screenshot: str(flags['--screenshot']),
|
|
2380
|
-
propose: !!flags['--propose'], html: str(flags['--html']),
|
|
2379
|
+
propose: !!flags['--propose'], html: str(flags['--html']),
|
|
2381
2380
|
what: str(flags['--what']), routes: str(flags['--routes']), overall: str(flags['--overall']), axes: str(flags['--axes']),
|
|
2382
2381
|
winner: str(flags['--winner']), judges: str(flags['--judges']),
|
|
2383
2382
|
}, io);
|
|
@@ -2,7 +2,7 @@ import { appendFileSync, existsSync, mkdirSync, readdirSync, readFileSync, statS
|
|
|
2
2
|
import { basename, dirname, join, relative, resolve } from 'node:path';
|
|
3
3
|
import { spawnSync } from 'node:child_process';
|
|
4
4
|
import { EXIT } from "./verify.js";
|
|
5
|
-
import {
|
|
5
|
+
import { parseAb } from "../feedback/ab.js";
|
|
6
6
|
import { ledger, ledgerMarkdown, learnedOf, pipelineOwnerNotes, propose, proposalsMarkdown, rootOfLog } from "../feedback/learn.js";
|
|
7
7
|
import { feedbackPage } from "../feedback/page.js";
|
|
8
8
|
import { ui } from "../ui.js";
|
|
@@ -166,7 +166,7 @@ export function clauses(s) {
|
|
|
166
166
|
const parts = s.text.split(/;\s*|\.\s+|,\s+|\s*\(|\)\s*/).map((t) => t.trim()).filter((t) => t.length > 2);
|
|
167
167
|
return parts.length > 1 ? parts.map((text) => ({ ...s, text, quote: s.text })) : [s];
|
|
168
168
|
}
|
|
169
|
-
export function collect(dirs
|
|
169
|
+
export function collect(dirs) {
|
|
170
170
|
const roots = dirs.map((d) => resolve(d));
|
|
171
171
|
const files = [...new Set(roots.flatMap((d) => (statSync(d).isFile() ? [d] : findLogs(d))))].sort();
|
|
172
172
|
const shown = (f) => {
|
|
@@ -179,7 +179,7 @@ export function collect(dirs, opts = {}) {
|
|
|
179
179
|
const learned = [];
|
|
180
180
|
const learnedSeen = new Set();
|
|
181
181
|
const gameRoots = new Map();
|
|
182
|
-
const ab =
|
|
182
|
+
const ab = [];
|
|
183
183
|
const evCache = new Map();
|
|
184
184
|
for (const file of files) {
|
|
185
185
|
const g = gameOf(file);
|
|
@@ -378,7 +378,7 @@ export async function feedbackAb(opts, io = console, now = () => new Date()) {
|
|
|
378
378
|
const game = opts.text?.trim();
|
|
379
379
|
const routes = (opts.routes ?? '').split(',').map((r) => r.trim()).filter(Boolean);
|
|
380
380
|
if (!game || routes.length < 2) {
|
|
381
|
-
u.error('an A/B names the game and two routes', 'funtools feedback ab "
|
|
381
|
+
u.error('an A/B names the game and two routes', 'funtools feedback ab "My Game" --routes gdk,non-gdk --overall 7.0,8.0 --axes "story=7.0/8.7,fun=7.4/7.7" --winner non-gdk --judges "3 blind seats"');
|
|
382
382
|
return EXIT.error;
|
|
383
383
|
}
|
|
384
384
|
const overall = (opts.overall ?? '').split(',').map((x) => (x.trim() ? Number(x) : null));
|
|
@@ -471,7 +471,7 @@ export async function feedback(opts, io = console) {
|
|
|
471
471
|
u.error(`no such folder: ${missing.join(', ')}`, 'give the folders that hold the games');
|
|
472
472
|
return EXIT.error;
|
|
473
473
|
}
|
|
474
|
-
const c = collect(dirs
|
|
474
|
+
const c = collect(dirs);
|
|
475
475
|
const proposals = opts.propose || opts.html ? propose(c.ledger) : [];
|
|
476
476
|
if (opts.html) {
|
|
477
477
|
writeFileSync(opts.html, feedbackPage(c.ledger, c.rows, proposals));
|
package/dist/commands/init.js
CHANGED
|
@@ -45,7 +45,7 @@ const CHECKS = {
|
|
|
45
45
|
{ mechanic: 'a flare or the clock ends the round lost', verb: 'loseRound', field: 'losses', expect: 'increases', times: 1 },
|
|
46
46
|
],
|
|
47
47
|
};
|
|
48
|
-
const SDK_VERSION = '0.
|
|
48
|
+
const SDK_VERSION = '0.7.0';
|
|
49
49
|
const slug = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'game';
|
|
50
50
|
export async function renderTree(from, vars, rel = '', out = {}) {
|
|
51
51
|
for (const e of await readdir(join(from, rel), { withFileTypes: true })) {
|
package/dist/direct/read.js
CHANGED
|
@@ -17,7 +17,7 @@ export const READ_CAMERA_JS = `(() => { try {
|
|
|
17
17
|
let room = null;
|
|
18
18
|
try { const T3 = W.THREE; if (T3 && scene && d) { const rc = new T3.Raycaster(); const free = (dir) => { rc.set(p, dir); rc.far = 200; const hit = rc.intersectObjects(scene.children, true).find((h) => h.object && h.object.isMesh && h.object.visible); return hit ? hit.distance : null; };
|
|
19
19
|
// Behind: the frustum's centre and its four edges cast backwards, each hit projected on the view axis (a wall with a
|
|
20
|
-
// doorway on the axis still frames the shot, so the centre ray alone overstates the room;
|
|
20
|
+
// doorway on the axis still frames the shot, so the centre ray alone overstates the room; one game's vestibule).
|
|
21
21
|
const back = d.clone().negate(), up = new T3.Vector3(0, 1, 0), right = new T3.Vector3().crossVectors(d, up).normalize(), up2 = new T3.Vector3().crossVectors(right, d).normalize();
|
|
22
22
|
const tv = Math.tan(cam.fov * Math.PI / 360), th = tv * (cam.aspect || 1.78);
|
|
23
23
|
let behind = null;
|
|
@@ -14,7 +14,7 @@ export function checkInput(p) {
|
|
|
14
14
|
return p.settings ? [['note', 'input: no activeInputHandler in ProjectSettings.asset (Unity writes it on the next save)']] : [];
|
|
15
15
|
const mobile = ['ios', 'android'].filter((t) => p.targets.has(t)).map((t) => TARGET_NAME[t]);
|
|
16
16
|
if (h === '0' && mobile.length) {
|
|
17
|
-
return [['fail', `input: activeInputHandler is 0 (${INPUT_HANDLER['0']}) and the project builds for ${mobile.join(' and ')}: touch did not work in a player build
|
|
17
|
+
return [['fail', `input: activeInputHandler is 0 (${INPUT_HANDLER['0']}) and the project builds for ${mobile.join(' and ')}: touch did not work in a player build — set ${INPUT_FIX}`]];
|
|
18
18
|
}
|
|
19
19
|
const out = [['pass', `input: ${INPUT_HANDLER[h] ?? `activeInputHandler ${h}`} (activeInputHandler ${h})`]];
|
|
20
20
|
if ((h === '1' || h === '2') && !p.manifest['com.unity.inputsystem']) {
|
|
@@ -82,7 +82,7 @@ export function checkAudioListener(p) {
|
|
|
82
82
|
}
|
|
83
83
|
if (!sceneHears) {
|
|
84
84
|
for (const f of codeCams)
|
|
85
|
-
out.push(['warn', `AudioListener: ${f} makes a Camera in code and nothing adds an AudioListener — add one beside it (AddComponent<AudioListener>(), or Sfx.EnsureListener());
|
|
85
|
+
out.push(['warn', `AudioListener: ${f} makes a Camera in code and nothing adds an AudioListener — add one beside it (AddComponent<AudioListener>(), or Sfx.EnsureListener()); four of the studio's first games reached TestFlight silent`]);
|
|
86
86
|
}
|
|
87
87
|
return out.length ? out : [['pass', 'AudioListener: a scene has one']];
|
|
88
88
|
}
|
|
@@ -94,7 +94,7 @@ export const BANNED_APIS = [
|
|
|
94
94
|
pattern: /\bShader\s*\.\s*WarmupAllShaders\s*\(/,
|
|
95
95
|
scope: 'runtime',
|
|
96
96
|
status: (p) => (usesUrp(p) ? 'fail' : 'warn'),
|
|
97
|
-
why: 'it segfaults with URP keyword spaces (Unity 6,
|
|
97
|
+
why: 'it segfaults with URP keyword spaces (Unity 6, two games) and compiles every variant of every shader',
|
|
98
98
|
fix: 'warm a ShaderVariantCollection of the variants the game draws with (ShaderVariantCollection.WarmUp)',
|
|
99
99
|
},
|
|
100
100
|
{
|
|
@@ -114,7 +114,7 @@ export const BANNED_APIS = [
|
|
|
114
114
|
scope: 'runtime',
|
|
115
115
|
status: () => 'warn',
|
|
116
116
|
why: 'the Input System is not up at AfterAssembliesLoaded on iOS: hooking it there throws, and every input read after it throws too',
|
|
117
|
-
fix: 'hook input on first use or at BeforeSceneLoad (
|
|
117
|
+
fix: 'hook input on first use or at BeforeSceneLoad (a back-button reader that hooks on first read)',
|
|
118
118
|
},
|
|
119
119
|
{
|
|
120
120
|
id: 'bare-render-params',
|
|
@@ -371,7 +371,7 @@ export function checkSettingsDrift(p) {
|
|
|
371
371
|
drift.push(`${setting} saved as ${now}, the script pins ${list[0].wants}`);
|
|
372
372
|
}
|
|
373
373
|
if (drift.length) {
|
|
374
|
-
return [['warn', `settings drift: ProjectSettings.asset disagrees with ${main}${others}: ${drift.join('; ')} — run ${main} before every build (a build that skips it ships what the Editor last saved;
|
|
374
|
+
return [['warn', `settings drift: ProjectSettings.asset disagrees with ${main}${others}: ${drift.join('; ')} — run ${main} before every build (a build that skips it ships what the Editor last saved; one game's iOS graphics APIs flipped back to automatic three times)`]];
|
|
375
375
|
}
|
|
376
376
|
return [['pass', `settings: ${main}${others} sets PlayerSettings${compared ? `, and the saved ones agree (${compared} compared)` : ''} — build through it every time`]];
|
|
377
377
|
}
|
|
@@ -45,13 +45,13 @@ export function checkSampleRate(p, audio = audioSettings(p)) {
|
|
|
45
45
|
if (reset)
|
|
46
46
|
return [['pass', `audio: m_SampleRate is ${rate}, and ${reset.rel} sets 48000 through AudioSettings.Reset`]];
|
|
47
47
|
const what = rate === '0' ? "0, the device's rate (24 kHz on the iOS Simulator)" : `${rate} Hz`;
|
|
48
|
-
return [['warn', `audio: m_SampleRate is ${what}, not 48000:
|
|
48
|
+
return [['warn', `audio: m_SampleRate is ${what}, not 48000: one game's cues came out dull at 24 kHz until it pinned 48000, and 8 of 13 studio games still follow the device — ${SAMPLE_RATE_FIX}`]];
|
|
49
49
|
}
|
|
50
50
|
export function checkAudioDisabled(p, ix, audio = audioSettings(p)) {
|
|
51
51
|
if (scalar(audio, 'm_DisableAudio') !== '1')
|
|
52
52
|
return [];
|
|
53
53
|
const plays = ix.audio.length > 0 || p.code.some((f) => runtime(f) && /\bAudio(?:Source|Clip)\b/.test(f.code));
|
|
54
|
-
return [[plays ? 'fail' : 'warn', `audio: m_DisableAudio is 1, so the build plays no sound at all${plays ? `, and the game has ${ix.audio.length ? `${ix.audio.length} sound file(s)` : 'code that plays sound'}` : ''}:
|
|
54
|
+
return [[plays ? 'fail' : 'warn', `audio: m_DisableAudio is 1, so the build plays no sound at all${plays ? `, and the game has ${ix.audio.length ? `${ix.audio.length} sound file(s)` : 'code that plays sound'}` : ''}: one game inherited it from a template and only the upload script caught it — set m_DisableAudio: 0 in ProjectSettings/AudioManager.asset (Project Settings > Audio > Disable Unity Audio, off)`]];
|
|
55
55
|
}
|
|
56
56
|
const biggest = (xs) => [...xs].sort((x, y) => y.bytes - x.bytes);
|
|
57
57
|
const named = (xs, n = 3) => list(biggest(xs).map((x) => `${x.a.path} (${x.px.w}×${x.px.h}, ${fmtMb(x.bytes)})`), n);
|
|
@@ -81,7 +81,7 @@ export function checkNpotMips(p, ix, rules = []) {
|
|
|
81
81
|
const writers = hits.map((h) => rulesWriting(rules, 'texture', h.a.path, (w) => (w.key === 'nPOTScale' && w.value === '0') || (w.key === 'enableMipMap' && w.value === '1')));
|
|
82
82
|
const byRule = [...new Set(writers.flat())];
|
|
83
83
|
const where = !byRule.length ? 'in each .meta' : `in the import rule that sets them (${list(byRule, 2)}), or the next import puts them back${writers.some((w) => !w.length) ? ', and in the other .meta files' : ''}`;
|
|
84
|
-
return [['warn', `textures: ${hits.length} mipmapped texture(s) with a side that is not a power of two and Non-Power of 2 set to None: Unity leaves them uncompressed, RGBA32, without a word and even under an ASTC override (measured twice:
|
|
84
|
+
return [['warn', `textures: ${hits.length} mipmapped texture(s) with a side that is not a power of two and Non-Power of 2 set to None: Unity leaves them uncompressed, RGBA32, without a word and even under an ASTC override (measured twice: a splash screen and one game's character screens), about ${fmtMb(total(hits))}: ${named(hits)} — set Non-Power of 2 to ToNearest (nPOTScale: 1) or turn mipmaps off (enableMipMap: 0) ${where}; the splash alone cost 10.3 MB in every game that shipped it`]];
|
|
85
85
|
}
|
|
86
86
|
const ICON = /(^|\/)(icons?|appicons?)(\/|$)/i;
|
|
87
87
|
export function checkUncompressed(p, ix, rules = []) {
|
|
@@ -188,7 +188,7 @@ export function checkImportDrift(ix, rules) {
|
|
|
188
188
|
const keys = [...new Set(ds.map((d) => d.key))];
|
|
189
189
|
const eg = ds[0];
|
|
190
190
|
const file = rules.find((r) => r.name === rule)?.file;
|
|
191
|
-
out.push(['warn', `import rules: ${files.length} .meta file(s) disagree with ${rule}${file ? ` (${file})` : ''}, which rewrites them on the next import (${list(keys, 4)}): e.g. ${eg.asset.path}.meta has ${eg.key} ${shownValue(eg.key, eg.has)}, the rule writes ${eg.want.shown}${files.length > 1 ? `; also ${list(files.slice(1), 2)}` : ''} — reimport them (select the folder, Reimport; or AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate)) and commit the .meta files: until then a build ships whatever that Mac's Library last imported, and a fresh clone's import dirties the tree
|
|
191
|
+
out.push(['warn', `import rules: ${files.length} .meta file(s) disagree with ${rule}${file ? ` (${file})` : ''}, which rewrites them on the next import (${list(keys, 4)}): e.g. ${eg.asset.path}.meta has ${eg.key} ${shownValue(eg.key, eg.has)}, the rule writes ${eg.want.shown}${files.length > 1 ? `; also ${list(files.slice(1), 2)}` : ''} — reimport them (select the folder, Reimport; or AssetDatabase.ImportAsset(path, ImportAssetOptions.ForceUpdate)) and commit the .meta files: until then a build ships whatever that Mac's Library last imported, and a fresh clone's import dirties the tree`]);
|
|
192
192
|
}
|
|
193
193
|
return out;
|
|
194
194
|
}
|
|
@@ -205,7 +205,7 @@ export function checkTextureRoles(ix, rules) {
|
|
|
205
205
|
}
|
|
206
206
|
if (!coarse.length)
|
|
207
207
|
return [];
|
|
208
|
-
return [['warn', `textures: ${coarse.length} normal map(s) import as Default textures at ${coarse[0].fmt} (${list([...new Set(coarse.map((c) => c.rule))], 2)}): ${list(coarse.map((c) => c.a.path))} — a 6×6 block or coarser smears a normal map's detail; give __normal textures ASTC 4x4 or 5x5 in that rule
|
|
208
|
+
return [['warn', `textures: ${coarse.length} normal map(s) import as Default textures at ${coarse[0].fmt} (${list([...new Set(coarse.map((c) => c.rule))], 2)}): ${list(coarse.map((c) => c.a.path))} — a 6×6 block or coarser smears a normal map's detail; give __normal textures ASTC 4x4 or 5x5 in that rule`]];
|
|
209
209
|
}
|
|
210
210
|
export function gitCommonDir(dir) {
|
|
211
211
|
const root = gitRoot(dir);
|
|
@@ -281,7 +281,7 @@ export function checkClonedIdentity(p, others) {
|
|
|
281
281
|
if (me.guid && /^[0-9a-f]{32}$/i.test(me.guid)) {
|
|
282
282
|
const dupes = rest.filter((o) => o.guid === me.guid && !sameGame(me, o));
|
|
283
283
|
if (dupes.length)
|
|
284
|
-
out.push(['warn', `identity: productGUID ${me.guid} is also ${list(dupes.map(label), 2)}'s: one project was cloned from the other (
|
|
284
|
+
out.push(['warn', `identity: productGUID ${me.guid} is also ${list(dupes.map(label), 2)}'s: one project was cloned from the other (one game carried its sibling's), so Unity's services and caches take the two for one project — ${GUID_FIX}`]);
|
|
285
285
|
else if (rest.length)
|
|
286
286
|
out.push(['pass', `identity: productGUID is this project's own (${rest.length} other Unity project(s) on this Mac read)`]);
|
|
287
287
|
}
|
|
@@ -317,15 +317,6 @@ export function checkClonedIdentity(p, others) {
|
|
|
317
317
|
}
|
|
318
318
|
return out;
|
|
319
319
|
}
|
|
320
|
-
export const KNOWN_FIXES = [
|
|
321
|
-
{
|
|
322
|
-
pkg: 'com.joydle.core',
|
|
323
|
-
file: 'Runtime/IapService.cs',
|
|
324
|
-
marker: /\bgranted\s*\.\s*Add\s*\(/,
|
|
325
|
-
usedBy: /\bIapService\b/,
|
|
326
|
-
what: "the 7 Oct IAP double-grant fix (f205a0c6: an interrupted or Ask-to-Buy purchase could be granted twice; it shipped in 14 Dawg Ball TestFlight builds before main had it)",
|
|
327
|
-
},
|
|
328
|
-
];
|
|
329
320
|
export function checkStudioPackages(p, run) {
|
|
330
321
|
const out = [];
|
|
331
322
|
const ownRepo = gitRoot(p.dir);
|
|
@@ -376,13 +367,6 @@ export function checkStudioPackages(p, run) {
|
|
|
376
367
|
}
|
|
377
368
|
else
|
|
378
369
|
out.push(['note', says]);
|
|
379
|
-
for (const fix of KNOWN_FIXES) {
|
|
380
|
-
if (fix.pkg !== name || !p.code.some((f) => fix.usedBy.test(f.code)))
|
|
381
|
-
continue;
|
|
382
|
-
const code = read(join(abs, fix.file));
|
|
383
|
-
if (code && !fix.marker.test(code))
|
|
384
|
-
out.push(['warn', `studio package ${label} at ${at} predates ${fix.what} — bring that checkout to main (${home(root)}), then rebuild`]);
|
|
385
|
-
}
|
|
386
370
|
}
|
|
387
371
|
return out;
|
|
388
372
|
}
|
|
@@ -400,12 +384,12 @@ export function checkFirebaseSimulator(p) {
|
|
|
400
384
|
const out = [];
|
|
401
385
|
const names = list(firebase, 2);
|
|
402
386
|
if (!stub)
|
|
403
|
-
out.push(['warn', `Firebase on the Simulator: ${names} in an iOS game, and nothing stubs it for a Simulator build: Firebase's C++ libraries (libFirebaseCpp*.a) carry no arm64 Simulator slice and the iOS 26 Simulator runs arm64 only, so the link fails
|
|
387
|
+
out.push(['warn', `Firebase on the Simulator: ${names} in an iOS game, and nothing stubs it for a Simulator build: Firebase's C++ libraries (libFirebaseCpp*.a) carry no arm64 Simulator slice and the iOS 26 Simulator runs arm64 only, so the link fails — add an IPostprocessBuildWithReport that, for SimulatorSDK builds only, drops them from UnityFramework and links stubs in their place (an Editor script such as Assets/_Game/Editor/SimFirebase.cs)`]);
|
|
404
388
|
if (!guard)
|
|
405
|
-
out.push(['warn', `Firebase on the Simulator: nothing reads SIMULATOR_UDID, so a Simulator run calls the stubbed SDK and throws TypeInitializationException (the Simulator reports a real model, iPhone18,1, so a model check never matches) — skip Firebase and mute telemetry when SIMULATOR_UDID is set
|
|
389
|
+
out.push(['warn', `Firebase on the Simulator: nothing reads SIMULATOR_UDID, so a Simulator run calls the stubbed SDK and throws TypeInitializationException (the Simulator reports a real model, iPhone18,1, so a model check never matches) — skip Firebase and mute telemetry when SIMULATOR_UDID is set`]);
|
|
406
390
|
return out;
|
|
407
391
|
}
|
|
408
|
-
const GATE = /\bisDebugBuild\b|\bDEVELOPMENT_BUILD\b|\
|
|
392
|
+
const GATE = /\bisDebugBuild\b|\bDEVELOPMENT_BUILD\b|\b[A-Z][A-Z0-9]*_TEST_ARGS\b/;
|
|
409
393
|
const READS_ARGS = /\bLaunchArgs\s*\.\s*Get\s*\(|\bGetCommandLineArgs\s*\(/g;
|
|
410
394
|
const BUILD_SWITCH = /^\s*#\s*(?:el)?if\b(?![^\n]*\bUNITY_(?:IOS|ANDROID|STANDALONE\w*|WEBGL|TVOS|VISIONOS|WSA\w*|SWITCH|PS\d|GAMECORE\w*)\b[^\n]*$)[^\n]*\b[A-Z][A-Z0-9_]{2,}\b/m;
|
|
411
395
|
export function gateNames(files) {
|
|
@@ -451,12 +435,12 @@ export function checkLaunchArgs(p) {
|
|
|
451
435
|
const open = readers.filter((f) => !gated(f.code)).flatMap((f) => { const r = reads(f); return r.length ? [`${f.rel}:${lineOf(f.code, r[0].index)}`] : []; });
|
|
452
436
|
if (!open.length)
|
|
453
437
|
return [['pass', `launch flags: every reader is behind a development-build gate (${readers.length} file(s))`]];
|
|
454
|
-
const fix = "read every flag through one gated reader, `if (!Debug.isDebugBuild && !Application.isEditor) return none;`
|
|
455
|
-
const what = `launch flags: ${open.length} player file(s) read the launch arguments with no development-build gate (isDebugBuild, DEVELOPMENT_BUILD,
|
|
438
|
+
const fix = "read every flag through one gated reader, `if (!Debug.isDebugBuild && !Application.isEditor) return none;`";
|
|
439
|
+
const what = `launch flags: ${open.length} player file(s) read the launch arguments with no development-build gate (isDebugBuild, DEVELOPMENT_BUILD, a *_TEST_ARGS define, or a flag built on one): ${list(open)}`;
|
|
456
440
|
const desktop = ['mac', 'windows'].filter((t) => p.targets.has(t));
|
|
457
441
|
if (desktop.length)
|
|
458
|
-
return [['warn', `${what} — the ${desktop.map((t) => (t === 'mac' ? 'Mac' : 'Windows')).join(' and ')} build honours them for anyone who starts it with a flag (three release builds honoured unlock flags:
|
|
459
|
-
return [['note', `${what} — harmless while the game ships only for phones (a store build there starts with no arguments, and
|
|
442
|
+
return [['warn', `${what} — the ${desktop.map((t) => (t === 'mac' ? 'Mac' : 'Windows')).join(' and ')} build honours them for anyone who starts it with a flag (three release builds honoured unlock flags: -setcoins, -unlocked, -unlockall); ${fix}`]];
|
|
443
|
+
return [['note', `${what} — harmless while the game ships only for phones (a store build there starts with no arguments, and Android's intent flags should be read only in development builds), live the day it ships for Mac or Windows; ${fix}`]];
|
|
460
444
|
}
|
|
461
445
|
const EXIT = /\bEditorApplication\s*\.\s*Exit\s*\(/g;
|
|
462
446
|
const BATCH = /\bisBatchMode\b|\binBatchMode\b/;
|
|
@@ -519,7 +503,7 @@ export function checkNetstandard(p) {
|
|
|
519
503
|
if (ns)
|
|
520
504
|
return [['pass', `engine-free code: ${tests[0].folder} runs it on .NET and ${ns.csproj} compiles it against netstandard, Unity's API`]];
|
|
521
505
|
const tfm = /<TargetFrameworks?>([^<]+)</i.exec(tests[0].text)?.[1] ?? '.NET';
|
|
522
|
-
return [['note', `engine-free code: ${tests[0].folder} runs it on ${tfm} only, where an API Unity lacks still compiles — add a CoreNetStandard~ project that compiles the same files for netstandard2.1 (
|
|
506
|
+
return [['note', `engine-free code: ${tests[0].folder} runs it on ${tfm} only, where an API Unity lacks still compiles — add a CoreNetStandard~ project that compiles the same files for netstandard2.1 (CoreNetStandard~/CoreNetStandard.csproj; 6 of 13 studio games have one)`]];
|
|
523
507
|
}
|
|
524
508
|
const PARSES = /\b(?:double|float|decimal|Double|Single)\s*\.\s*(?:Try)?Parse\s*\(|\bConvert\s*\.\s*To(?:Double|Single)\s*\(/;
|
|
525
509
|
const PRINTS = /\.ToString\s*\(\s*"(?:R|G17)"/;
|
|
@@ -543,7 +527,7 @@ export function checkIl2cppNumbers(p) {
|
|
|
543
527
|
});
|
|
544
528
|
if (!hits.length)
|
|
545
529
|
return [];
|
|
546
|
-
return [['note', `numbers: the project replays goldens, and ${hits.length} player file(s) parse or print doubles with the runtime's own routines (${list(hits)}): under IL2CPP double.Parse misread 446 of 100,000 doubles and "R" printed 17 digits where 16 read back (
|
|
530
|
+
return [['note', `numbers: the project replays goldens, and ${hits.length} player file(s) parse or print doubles with the runtime's own routines (${list(hits)}): under IL2CPP double.Parse misread 446 of 100,000 doubles and "R" printed 17 digits where 16 read back (one game, twice), so a golden that passes in the Editor can differ in the player — replay one golden in a development player, or parse and print exactly (a decimal parser and printer of the game's own)`]];
|
|
547
531
|
}
|
|
548
532
|
const UDID = /\b[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}\b/;
|
|
549
533
|
const SIM_CONTEXT = /sim|udid|device|\bDEV\b|xcrun|booted/i;
|
|
@@ -577,9 +561,9 @@ export function checkHardcodedSimulator(p) {
|
|
|
577
561
|
}
|
|
578
562
|
if (!hits.length)
|
|
579
563
|
return [];
|
|
580
|
-
return [['warn', `Simulator UDID typed into ${list(hits)}: every agent on this Mac then drives that one Simulator, and a run shut down under another killed it three times
|
|
564
|
+
return [['warn', `Simulator UDID typed into ${list(hits)}: every agent on this Mac then drives that one Simulator, and a run shut down under another killed it three times — lease one per run: \`funtools sim lease\` prints a fresh udid, \`funtools sim release <udid>\` gives it back (skill funpixel-unity-game, references/agent-ops.md)`]];
|
|
581
565
|
}
|
|
582
|
-
export const HISTORY_HEADING = "the studio's history · fixes
|
|
566
|
+
export const HISTORY_HEADING = "the studio's history · fixes its games' logs repeated";
|
|
583
567
|
export function historyChecks(p, host) {
|
|
584
568
|
const audio = audioSettings(p);
|
|
585
569
|
const ix = assetIndex(p.dir);
|
package/dist/feedback/ab.js
CHANGED
|
@@ -1,43 +1,3 @@
|
|
|
1
|
-
export const AB_SEED = [
|
|
2
|
-
{
|
|
3
|
-
id: 'gallery-heist-gdd-1', game: 'Gallery Heist', at: '2026-10-01', what: 'the GDD written by each route from one brief',
|
|
4
|
-
judges: '3 blind seats, one rubric', winner: 'non-gdk',
|
|
5
|
-
variants: [
|
|
6
|
-
{ route: 'gdk', label: 'GDK (lane F kit)', overall: 7.0, axes: { clarity: 8.4, feasibility: 7.2, 'level design': null, story: null, fun: null, phone: null }, seats_won: 0 },
|
|
7
|
-
{ route: 'non-gdk', label: 'non-GDK (hand brief)', overall: 8.0, axes: { clarity: 8.1, feasibility: 6.4, 'level design': null, story: null, fun: null, phone: null }, seats_won: 3 },
|
|
8
|
-
],
|
|
9
|
-
better: { 'level design': 'non-gdk by 1.8', story: 'non-gdk by 1.7', fun: 'non-gdk by 1.2', phone: 'non-gdk by 1.0' },
|
|
10
|
-
evidence: ['the studio\'s A/B notes, 1 Oct 2026: the second A/B, Gallery Heist'],
|
|
11
|
-
note: 'Top gaps: places that differ, a world that answers the core verb, a first-person phone pack, judging what the player holds, targets before code.',
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
id: 'gallery-heist-gdd-2', game: 'Gallery Heist', at: '2026-10-01', what: 'the GDD re-run with the lane H kit (invent first, studio pitch), same seats and rubric, order reshuffled',
|
|
15
|
-
judges: '3 blind seats, one rubric', winner: 'gdk-h',
|
|
16
|
-
variants: [
|
|
17
|
-
{ route: 'gdk-h', label: 'GDK (lane H kit)', overall: 8.07, axes: { clarity: 8.2, feasibility: 7.53, 'level design': 8.47, story: 8.1, fun: 7.9, phone: 8.03 }, seats_won: 2 },
|
|
18
|
-
{ route: 'gdk', label: 'GDK (lane F kit, re-judged)', overall: 7.37, axes: { clarity: 7.63, feasibility: 7.77, 'level design': 7.77, story: 7.03, fun: 7.4, phone: 7.43 }, seats_won: 0 },
|
|
19
|
-
{ route: 'non-gdk', label: 'non-GDK (hand brief)', overall: 7.9, axes: { clarity: 7.2, feasibility: 7.3, 'level design': 8.07, story: 8.67, fun: 7.7, phone: 7.37 }, seats_won: 1 },
|
|
20
|
-
],
|
|
21
|
-
evidence: ['the studio\'s A/B notes, 1 Oct 2026: the GDD re-run with the newer kit'],
|
|
22
|
-
note: 'The story seat still picked the non-GDK (its paintings are "alive"; ours is "systemic").',
|
|
23
|
-
},
|
|
24
|
-
{
|
|
25
|
-
id: 'blue-freight-plan', game: 'Blue Freight', at: '2026-10-01', what: 'the plan made by each route (GDK agent vs the owner session by hand)',
|
|
26
|
-
judges: 'the owner and the greenlight panel, in words', winner: 'split',
|
|
27
|
-
variants: [{ route: 'gdk', label: 'GDK plan' }, { route: 'non-gdk', label: 'hand plan (owner session)' }],
|
|
28
|
-
better: { mechanics: 'gdk', story: 'gdk', 'physics numbers': 'gdk', world: 'non-gdk', consistency: 'non-gdk', 'places pictured': 'non-gdk' },
|
|
29
|
-
evidence: ['the studio\'s A/B notes, 1 Oct 2026: what the hand-made Blue Freight plan did well'],
|
|
30
|
-
note: 'Confound: the hand plan had the owner\'s whole context; the GDK plan one fresh agent.',
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
id: 'blue-freight-build', game: 'Blue Freight', at: '2026-10-01', what: 'the playable builds, round 2, played by the owner',
|
|
34
|
-
judges: 'the owner, playing', winner: 'split',
|
|
35
|
-
variants: [{ route: 'gdk', label: 'GDK build' }, { route: 'non-gdk', label: 'owner build' }],
|
|
36
|
-
better: { 'composition and light': 'gdk', life: 'non-gdk', texture: 'non-gdk', challenge: 'neither', placement: 'neither' },
|
|
37
|
-
evidence: ['the studio\'s A/B notes, 1 Oct 2026: the owner played both builds'],
|
|
38
|
-
note: 'Both: "no challenges at all"; the GDK build: misplaces, collisions, static people. The kit opened zero skills in five sessions.',
|
|
39
|
-
},
|
|
40
|
-
];
|
|
41
1
|
export function axisLosses(records, route = 'gdk') {
|
|
42
2
|
const rows = new Map();
|
|
43
3
|
const row = (axis) => rows.get(axis) ?? { route, axis, lost: 0, of: 0, by: [], words: 0 };
|
package/dist/gen/unity.js
CHANGED
|
@@ -127,8 +127,8 @@ export function toWav(file, run = realRun) {
|
|
|
127
127
|
export const IMPORT_RULE_SOURCE = `${RULE_MARK} (v1). Import settings for what it writes under
|
|
128
128
|
// ${UNITY_ROOT}/, set once, when Unity first imports a file (no .meta yet): from then on the settings are the
|
|
129
129
|
// project's, kept in the .meta Unity writes, and a change you make in the Inspector stays. One exception: a normal
|
|
130
|
-
// map is kept a NormalMap on every import, because a rule that imports every model texture as Default (
|
|
131
|
-
//
|
|
130
|
+
// map is kept a NormalMap on every import, because a rule that imports every model texture as Default (a
|
|
131
|
+
// texture-budget rule) would turn it back. funtools rewrites this file while this first line stays; delete the
|
|
132
132
|
// line to keep your own edits, or the file to stop it.
|
|
133
133
|
#if UNITY_EDITOR
|
|
134
134
|
using System.Text.RegularExpressions;
|
|
@@ -145,7 +145,7 @@ namespace Funpixel.Generated.EditorTools
|
|
|
145
145
|
static readonly Regex Normal = new Regex(@"(^|[_\\-. ])(nor|normal|nrm)(_gl|_dx)?($|[_\\-. ]|\\d)", RegexOptions.IgnoreCase);
|
|
146
146
|
static readonly Regex Data = new Regex(@"(^|[_\\-. ])(rough|roughness|metal|metallic|ao|occlusion|height|disp|displacement|mask|arm|orm)($|[_\\-. ]|\\d)", RegexOptions.IgnoreCase);
|
|
147
147
|
|
|
148
|
-
// After the project's own rules (
|
|
148
|
+
// After the project's own rules (a texture-budget rule runs at 0), so these settings win on first import.
|
|
149
149
|
public override int GetPostprocessOrder() => 100;
|
|
150
150
|
|
|
151
151
|
static bool Ours(string path) => path.Replace('\\\\', '/').StartsWith(Root, System.StringComparison.Ordinal);
|
package/dist/mcp/server.js
CHANGED
|
@@ -8,6 +8,7 @@ import { COMPOSE_DIR } from "../compose/contract.js";
|
|
|
8
8
|
import { ADS_BRIEF, ADS_OUT } from "../compose/variations.js";
|
|
9
9
|
import { hostedFromApi } from "./hosted.js";
|
|
10
10
|
import { localIds, withModels } from "./models.js";
|
|
11
|
+
import { currentVersion } from "../update.js";
|
|
11
12
|
export const PROTOCOL = '2025-06-18';
|
|
12
13
|
const MAX_IMAGE_BYTES = 1_500_000;
|
|
13
14
|
const MAX_IMAGES = 4;
|
|
@@ -284,7 +285,7 @@ export function createServer(o) {
|
|
|
284
285
|
try {
|
|
285
286
|
if (method === 'initialize') {
|
|
286
287
|
const asked = msg.params?.protocolVersion;
|
|
287
|
-
return reply({ protocolVersion: typeof asked === 'string' ? asked : PROTOCOL, capabilities: { tools: { listChanged: true } }, serverInfo: { name: 'funtools', version:
|
|
288
|
+
return reply({ protocolVersion: typeof asked === 'string' ? asked : PROTOCOL, capabilities: { tools: { listChanged: true } }, serverInfo: { name: 'funtools', version: currentVersion() }, instructions: 'The Funpixel game kit. Call `flow` at the start of every turn: it names the one next step and the tool for it. Pass the game folder as `dir` (an absolute path) on every call: the server does not start in it. The hosted Funpixel tools are here too (generation of pictures, sound, music, video and 3D models, and the rest); they run on the account `funtools login` signed in, and a call that cannot run says why and what to run.' });
|
|
288
289
|
}
|
|
289
290
|
if (method === 'ping')
|
|
290
291
|
return reply({});
|
|
@@ -15,7 +15,7 @@ export const PANEL_DEFAULT = 7.3;
|
|
|
15
15
|
export const CATALOGUE = {
|
|
16
16
|
pitch: {
|
|
17
17
|
title: 'Invent and pitch',
|
|
18
|
-
why: 'a game whose answers are generic loses to one that invented something (
|
|
18
|
+
why: 'a game whose answers are generic loses to one that invented something (an A/B, 3 of 3 seats)',
|
|
19
19
|
gates: [{ kind: 'gdd', headings: ['The invention'] }, { kind: 'studio' }, { kind: 'worth' }],
|
|
20
20
|
rules: [
|
|
21
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.',
|
|
@@ -70,20 +70,20 @@ export const CATALOGUE = {
|
|
|
70
70
|
},
|
|
71
71
|
'first-look': {
|
|
72
72
|
title: 'First look',
|
|
73
|
-
why: 'identity drifts between frames unless it is locked first (
|
|
73
|
+
why: 'identity drifts between frames unless it is locked first (one game: 7 of 7 redraws on-model with reference sheets)',
|
|
74
74
|
gates: [{ kind: 'refs', min: 1 }, { kind: 'targets', min: 4 }, { kind: 'kit' }, { kind: 'set' }],
|
|
75
75
|
rules: [
|
|
76
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
77
|
'Reference sheets (identity lock) BEFORE moment frames; every recurring design drawn with its references and one verbatim style block.',
|
|
78
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
|
|
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
80
|
'A picture of every place; no two places alike in shape, material, era and light.',
|
|
81
81
|
'The HUD mockup drawn over a target frame.',
|
|
82
82
|
],
|
|
83
83
|
},
|
|
84
84
|
'core-test': {
|
|
85
85
|
title: 'Core test (A1): the game bites',
|
|
86
|
-
why: 'both
|
|
86
|
+
why: 'both builds of one game spent their rounds on looks and the challenge never bit ("no challenges at all")',
|
|
87
87
|
gates: [{ kind: 'tests' }, { kind: 'sim' }],
|
|
88
88
|
rules: [
|
|
89
89
|
`The GDD's named bots play the REAL level (\`${T} sim\`): an engine-free, fixed-step, seeded sim, plus a replay test.`,
|
|
@@ -118,7 +118,7 @@ export const CATALOGUE = {
|
|
|
118
118
|
},
|
|
119
119
|
expand: {
|
|
120
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 (
|
|
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
122
|
gates: [{ kind: 'rooms' }],
|
|
123
123
|
rules: [
|
|
124
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\`).`,
|
|
@@ -161,7 +161,7 @@ export const CATALOGUE = {
|
|
|
161
161
|
},
|
|
162
162
|
'blind-play': {
|
|
163
163
|
title: 'Blind play from the title',
|
|
164
|
-
why: 'blind players from the title found the blockers no panel could
|
|
164
|
+
why: 'blind players from the title found the blockers no panel could',
|
|
165
165
|
gates: [{ kind: 'play' }, { kind: 'sim' }],
|
|
166
166
|
rules: [
|
|
167
167
|
`A blind player from the title, no instructions (\`${T} play\`): a stall counts as blocking.`,
|
package/dist/playtest/moments.js
CHANGED
|
@@ -22,7 +22,7 @@ export function momentsMd(ms) {
|
|
|
22
22
|
}
|
|
23
23
|
const unreached = ms.filter((m) => m.staged?.reached === false);
|
|
24
24
|
if (unreached.length)
|
|
25
|
-
out.push('', `Staged frames the played route never reached: ${unreached.map((m) => `${m.moment} (\`${m.staged.frame}\`)`).join('; ')}. A frame that looks right only when staged is a finding (
|
|
25
|
+
out.push('', `Staged frames the played route never reached: ${unreached.map((m) => `${m.moment} (\`${m.staged.frame}\`)`).join('; ')}. A frame that looks right only when staged is a finding (one game's diver: showcase art in its lane, "a few coral points" in play).`);
|
|
26
26
|
out.push('');
|
|
27
27
|
return out;
|
|
28
28
|
}
|
package/dist/playtest/report.js
CHANGED
|
@@ -26,7 +26,7 @@ function stepMd(s, i) {
|
|
|
26
26
|
export function evidenceMd(e) {
|
|
27
27
|
if (!e || (!e.same.length && !e.logged.length))
|
|
28
28
|
return [];
|
|
29
|
-
const out = ['## Look at the captures first', '', 'The scores below are only as good as the frames the seats saw. Open these before trusting any number (
|
|
29
|
+
const out = ['## Look at the captures first', '', 'The scores below are only as good as the frames the seats saw. Open these before trusting any number (one game scored 4.9 on views stuck at the opening shot, 6.55 once they reached their beats).', ''];
|
|
30
30
|
for (const g of e.same)
|
|
31
31
|
out.push(`- Same picture on desktop: ${g.map((v) => `\`${v}\``).join(', ')}. Declared views that look alike usually mean a view never reached its beat.`);
|
|
32
32
|
for (const l of e.logged.slice(0, 4))
|