spriteforge 0.1.1__tar.gz
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.
- spriteforge-0.1.1/LICENSE +27 -0
- spriteforge-0.1.1/PKG-INFO +364 -0
- spriteforge-0.1.1/README.md +320 -0
- spriteforge-0.1.1/pyproject.toml +55 -0
- spriteforge-0.1.1/setup.cfg +4 -0
- spriteforge-0.1.1/src/spriteforge/__init__.py +1 -0
- spriteforge-0.1.1/src/spriteforge/__main__.py +3 -0
- spriteforge-0.1.1/src/spriteforge/agents/__init__.py +0 -0
- spriteforge-0.1.1/src/spriteforge/agents/assets.py +109 -0
- spriteforge-0.1.1/src/spriteforge/agents/cancellation.py +12 -0
- spriteforge-0.1.1/src/spriteforge/agents/director.py +50 -0
- spriteforge-0.1.1/src/spriteforge/agents/models.py +63 -0
- spriteforge-0.1.1/src/spriteforge/agents/roles/art-director.md +15 -0
- spriteforge-0.1.1/src/spriteforge/agents/roles/art-reviewer.md +14 -0
- spriteforge-0.1.1/src/spriteforge/agents/roles/director.md +14 -0
- spriteforge-0.1.1/src/spriteforge/agents/roles/game-designer.md +15 -0
- spriteforge-0.1.1/src/spriteforge/agents/roles/level-tile-designer.md +16 -0
- spriteforge-0.1.1/src/spriteforge/agents/roles/librarian.md +13 -0
- spriteforge-0.1.1/src/spriteforge/agents/roles/menu-designer.md +15 -0
- spriteforge-0.1.1/src/spriteforge/agents/roles/pixel-artist.md +14 -0
- spriteforge-0.1.1/src/spriteforge/agents/roles/programmer.md +14 -0
- spriteforge-0.1.1/src/spriteforge/agents/roles/qa-playtester.md +13 -0
- spriteforge-0.1.1/src/spriteforge/agents/roles/sound-director.md +14 -0
- spriteforge-0.1.1/src/spriteforge/agents/roles.py +39 -0
- spriteforge-0.1.1/src/spriteforge/agents/router.py +233 -0
- spriteforge-0.1.1/src/spriteforge/agents/router_eval.py +145 -0
- spriteforge-0.1.1/src/spriteforge/agents/routing_state.py +133 -0
- spriteforge-0.1.1/src/spriteforge/agents/runtime.py +430 -0
- spriteforge-0.1.1/src/spriteforge/agents/workflow.py +389 -0
- spriteforge-0.1.1/src/spriteforge/app/__init__.py +0 -0
- spriteforge-0.1.1/src/spriteforge/app/agents_view.py +248 -0
- spriteforge-0.1.1/src/spriteforge/app/chat.py +114 -0
- spriteforge-0.1.1/src/spriteforge/app/extensions.py +115 -0
- spriteforge-0.1.1/src/spriteforge/app/index.html +279 -0
- spriteforge-0.1.1/src/spriteforge/app/local_only.py +49 -0
- spriteforge-0.1.1/src/spriteforge/app/server.py +358 -0
- spriteforge-0.1.1/src/spriteforge/app/static/assets/index-L2s1wlcp.css +1 -0
- spriteforge-0.1.1/src/spriteforge/app/static/assets/index-aBfzgLQl.js +71 -0
- spriteforge-0.1.1/src/spriteforge/app/static/assets/press-start-2p-latin-400-normal-BKfmdmKK.woff +0 -0
- spriteforge-0.1.1/src/spriteforge/app/static/assets/press-start-2p-latin-400-normal-xj9lRvVs.woff2 +0 -0
- spriteforge-0.1.1/src/spriteforge/app/static/index.html +13 -0
- spriteforge-0.1.1/src/spriteforge/app/static/press-start-2p-LICENSE.txt +93 -0
- spriteforge-0.1.1/src/spriteforge/app/studio.py +278 -0
- spriteforge-0.1.1/src/spriteforge/app/workers.py +73 -0
- spriteforge-0.1.1/src/spriteforge/cli.py +241 -0
- spriteforge-0.1.1/src/spriteforge/config.py +193 -0
- spriteforge-0.1.1/src/spriteforge/config.yaml +157 -0
- spriteforge-0.1.1/src/spriteforge/core/__init__.py +0 -0
- spriteforge-0.1.1/src/spriteforge/core/acting.py +16 -0
- spriteforge-0.1.1/src/spriteforge/core/cost.py +236 -0
- spriteforge-0.1.1/src/spriteforge/core/credentials.py +24 -0
- spriteforge-0.1.1/src/spriteforge/core/demo.py +79 -0
- spriteforge-0.1.1/src/spriteforge/core/forms.py +20 -0
- spriteforge-0.1.1/src/spriteforge/core/gates.py +175 -0
- spriteforge-0.1.1/src/spriteforge/core/security.py +42 -0
- spriteforge-0.1.1/src/spriteforge/core/state.py +222 -0
- spriteforge-0.1.1/src/spriteforge/core/team.py +15 -0
- spriteforge-0.1.1/src/spriteforge/core/usage.py +68 -0
- spriteforge-0.1.1/src/spriteforge/game/__init__.py +0 -0
- spriteforge-0.1.1/src/spriteforge/game/actors.py +377 -0
- spriteforge-0.1.1/src/spriteforge/game/agent_tools.py +178 -0
- spriteforge-0.1.1/src/spriteforge/game/art.py +2097 -0
- spriteforge-0.1.1/src/spriteforge/game/art_checks.py +190 -0
- spriteforge-0.1.1/src/spriteforge/game/art_review.py +518 -0
- spriteforge-0.1.1/src/spriteforge/game/build.py +134 -0
- spriteforge-0.1.1/src/spriteforge/game/bundle.py +1178 -0
- spriteforge-0.1.1/src/spriteforge/game/cli.py +119 -0
- spriteforge-0.1.1/src/spriteforge/game/codegen.py +433 -0
- spriteforge-0.1.1/src/spriteforge/game/codeinfo.py +154 -0
- spriteforge-0.1.1/src/spriteforge/game/dbsource.py +137 -0
- spriteforge-0.1.1/src/spriteforge/game/design.py +342 -0
- spriteforge-0.1.1/src/spriteforge/game/export.py +62 -0
- spriteforge-0.1.1/src/spriteforge/game/gamedb.py +191 -0
- spriteforge-0.1.1/src/spriteforge/game/image_cache.py +61 -0
- spriteforge-0.1.1/src/spriteforge/game/lessons.py +259 -0
- spriteforge-0.1.1/src/spriteforge/game/level_gen.py +118 -0
- spriteforge-0.1.1/src/spriteforge/game/level_preview.py +97 -0
- spriteforge-0.1.1/src/spriteforge/game/levels.py +934 -0
- spriteforge-0.1.1/src/spriteforge/game/loops.py +38 -0
- spriteforge-0.1.1/src/spriteforge/game/menus.py +712 -0
- spriteforge-0.1.1/src/spriteforge/game/mock_game.js +109 -0
- spriteforge-0.1.1/src/spriteforge/game/mock_platformer.js +58 -0
- spriteforge-0.1.1/src/spriteforge/game/motion.py +881 -0
- spriteforge-0.1.1/src/spriteforge/game/pipeline.py +1768 -0
- spriteforge-0.1.1/src/spriteforge/game/plan.py +502 -0
- spriteforge-0.1.1/src/spriteforge/game/playtest.py +318 -0
- spriteforge-0.1.1/src/spriteforge/game/qa.py +664 -0
- spriteforge-0.1.1/src/spriteforge/game/qa_checks.py +223 -0
- spriteforge-0.1.1/src/spriteforge/game/qa_runtime.py +565 -0
- spriteforge-0.1.1/src/spriteforge/game/reach.py +807 -0
- spriteforge-0.1.1/src/spriteforge/game/record.py +138 -0
- spriteforge-0.1.1/src/spriteforge/game/research.py +262 -0
- spriteforge-0.1.1/src/spriteforge/game/revision.py +225 -0
- spriteforge-0.1.1/src/spriteforge/game/sdk/API.md +104 -0
- spriteforge-0.1.1/src/spriteforge/game/sdk/FLOW.md +19 -0
- spriteforge-0.1.1/src/spriteforge/game/sdk/LEVELS.md +65 -0
- spriteforge-0.1.1/src/spriteforge/game/sdk/sf.js +418 -0
- spriteforge-0.1.1/src/spriteforge/game/sdk/sfflow.js +442 -0
- spriteforge-0.1.1/src/spriteforge/game/sdk/sflevel.js +683 -0
- spriteforge-0.1.1/src/spriteforge/game/sdk/sfsound-editor.js +225 -0
- spriteforge-0.1.1/src/spriteforge/game/sdk/sfsound.js +260 -0
- spriteforge-0.1.1/src/spriteforge/game/sdk/sounds.html +67 -0
- spriteforge-0.1.1/src/spriteforge/game/sounds.py +793 -0
- spriteforge-0.1.1/src/spriteforge/game/story.py +188 -0
- spriteforge-0.1.1/src/spriteforge/game/structure.py +98 -0
- spriteforge-0.1.1/src/spriteforge/game/team_reports.py +394 -0
- spriteforge-0.1.1/src/spriteforge/game/tilesets.py +70 -0
- spriteforge-0.1.1/src/spriteforge/game/title_art.py +186 -0
- spriteforge-0.1.1/src/spriteforge/genres/__init__.py +0 -0
- spriteforge-0.1.1/src/spriteforge/library/__init__.py +15 -0
- spriteforge-0.1.1/src/spriteforge/library/cli.py +126 -0
- spriteforge-0.1.1/src/spriteforge/library/describe.py +242 -0
- spriteforge-0.1.1/src/spriteforge/library/looks.py +154 -0
- spriteforge-0.1.1/src/spriteforge/library/models.py +79 -0
- spriteforge-0.1.1/src/spriteforge/library/store.py +422 -0
- spriteforge-0.1.1/src/spriteforge/library/tilesets/README.md +32 -0
- spriteforge-0.1.1/src/spriteforge/library/tilesets/gandalf-seasons.json +111 -0
- spriteforge-0.1.1/src/spriteforge/library/tilesets/pixel-crawler-dungeon.json +66 -0
- spriteforge-0.1.1/src/spriteforge/mcp/__init__.py +0 -0
- spriteforge-0.1.1/src/spriteforge/mcp/cli.py +58 -0
- spriteforge-0.1.1/src/spriteforge/mcp/client.py +57 -0
- spriteforge-0.1.1/src/spriteforge/mcp/filesystem_read.py +32 -0
- spriteforge-0.1.1/src/spriteforge/mcp/gamedb.py +56 -0
- spriteforge-0.1.1/src/spriteforge/mcp/library.py +179 -0
- spriteforge-0.1.1/src/spriteforge/mcp/memory.py +37 -0
- spriteforge-0.1.1/src/spriteforge/mcp/pixel_tools.py +145 -0
- spriteforge-0.1.1/src/spriteforge/mcp/registry.py +145 -0
- spriteforge-0.1.1/src/spriteforge/mcp/service.py +224 -0
- spriteforge-0.1.1/src/spriteforge/mcp/templates/context7.json +6 -0
- spriteforge-0.1.1/src/spriteforge/mcp/templates/fetch.json +6 -0
- spriteforge-0.1.1/src/spriteforge/mcp/templates/filesystem-read.json +6 -0
- spriteforge-0.1.1/src/spriteforge/mcp/templates/pixel-tools.json +6 -0
- spriteforge-0.1.1/src/spriteforge/memory/README.md +10 -0
- spriteforge-0.1.1/src/spriteforge/memory/__init__.py +0 -0
- spriteforge-0.1.1/src/spriteforge/memory/cli.py +131 -0
- spriteforge-0.1.1/src/spriteforge/memory/okf/__init__.py +1 -0
- spriteforge-0.1.1/src/spriteforge/memory/okf/catalog.py +331 -0
- spriteforge-0.1.1/src/spriteforge/memory/okf/codec.py +63 -0
- spriteforge-0.1.1/src/spriteforge/memory/okf/git.py +104 -0
- spriteforge-0.1.1/src/spriteforge/memory/okf/indexes.py +50 -0
- spriteforge-0.1.1/src/spriteforge/memory/okf/models.py +114 -0
- spriteforge-0.1.1/src/spriteforge/memory/okf/search.py +53 -0
- spriteforge-0.1.1/src/spriteforge/memory/okf/seed.py +81 -0
- spriteforge-0.1.1/src/spriteforge/memory/okf/seeds/genres.yaml +121 -0
- spriteforge-0.1.1/src/spriteforge/memory/okf/seeds/other.yaml +150 -0
- spriteforge-0.1.1/src/spriteforge/memory/okf/store.py +402 -0
- spriteforge-0.1.1/src/spriteforge/memory/okf/validate.py +115 -0
- spriteforge-0.1.1/src/spriteforge/pixel/__init__.py +17 -0
- spriteforge-0.1.1/src/spriteforge/pixel/atlas.py +110 -0
- spriteforge-0.1.1/src/spriteforge/pixel/grid.py +174 -0
- spriteforge-0.1.1/src/spriteforge/pixel/palette.py +156 -0
- spriteforge-0.1.1/src/spriteforge/pixel/palettes/dungeon.json +9 -0
- spriteforge-0.1.1/src/spriteforge/pixel/postprocess.py +170 -0
- spriteforge-0.1.1/src/spriteforge/pixel/preview.py +40 -0
- spriteforge-0.1.1/src/spriteforge/pixel/schemas.py +139 -0
- spriteforge-0.1.1/src/spriteforge/pixel/source.py +237 -0
- spriteforge-0.1.1/src/spriteforge/pixel/terrain.py +48 -0
- spriteforge-0.1.1/src/spriteforge/pixel/validate.py +138 -0
- spriteforge-0.1.1/src/spriteforge/prompts/anim_frame.txt +1 -0
- spriteforge-0.1.1/src/spriteforge/prompts/character.txt +1 -0
- spriteforge-0.1.1/src/spriteforge/prompts/item.txt +1 -0
- spriteforge-0.1.1/src/spriteforge/prompts/tile.txt +1 -0
- spriteforge-0.1.1/src/spriteforge/prompts/ui.txt +1 -0
- spriteforge-0.1.1/src/spriteforge/providers/__init__.py +0 -0
- spriteforge-0.1.1/src/spriteforge/providers/base.py +97 -0
- spriteforge-0.1.1/src/spriteforge/providers/http.py +38 -0
- spriteforge-0.1.1/src/spriteforge/providers/mock.py +111 -0
- spriteforge-0.1.1/src/spriteforge/providers/muse_image.py +60 -0
- spriteforge-0.1.1/src/spriteforge/providers/muse_search.py +91 -0
- spriteforge-0.1.1/src/spriteforge/providers/muse_spark.py +66 -0
- spriteforge-0.1.1/src/spriteforge/skills/__init__.py +0 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/LICENSE-awesome-gamedev-agent-skills.txt +201 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/NOTICE-awesome-gamedev-agent-skills.txt +15 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/THIRD_PARTY.md +21 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/audio-design/SKILL.md +190 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/game-feel/SKILL.md +174 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/game-ui-ux/SKILL.md +167 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/level-design/SKILL.md +169 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/phaser-arcade-physics/SKILL.md +17 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/physics-tuning/SKILL.md +164 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/pixel-art-prompting/SKILL.md +12 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/platformer/SKILL.md +153 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/puzzle/SKILL.md +143 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/sprite-animation-frames/SKILL.md +11 -0
- spriteforge-0.1.1/src/spriteforge/skills/builtin/tileset-design/SKILL.md +10 -0
- spriteforge-0.1.1/src/spriteforge/skills/catalog.py +200 -0
- spriteforge-0.1.1/src/spriteforge/skills/cli.py +41 -0
- spriteforge-0.1.1/src/spriteforge/stages/__init__.py +0 -0
- spriteforge-0.1.1/src/spriteforge/stages/asset_context.py +301 -0
- spriteforge-0.1.1/src/spriteforge/stages/asset_models.py +192 -0
- spriteforge-0.1.1/src/spriteforge/stages/asset_render.py +366 -0
- spriteforge-0.1.1/src/spriteforge/stages/asset_review.py +140 -0
- spriteforge-0.1.1/src/spriteforge/stages/asset_store.py +94 -0
- spriteforge-0.1.1/src/spriteforge/stages/chat_changes.py +236 -0
- spriteforge-0.1.1/src/spriteforge/stages/concept.py +42 -0
- spriteforge-0.1.1/src/spriteforge/stages/game.py +1699 -0
- spriteforge-0.1.1/src/spriteforge/stages/game_confirm.py +112 -0
- spriteforge-0.1.1/src/spriteforge/stages/game_final.py +220 -0
- spriteforge-0.1.1/src/spriteforge/stages/game_record.py +246 -0
- spriteforge-0.1.1/src/spriteforge/stages/gameplay.py +218 -0
- spriteforge-0.1.1/src/spriteforge/stages/intake.py +372 -0
- spriteforge-0.1.1/src/spriteforge/stages/preview_assets.py +212 -0
- spriteforge-0.1.1/src/spriteforge/stages/preview_models.py +167 -0
- spriteforge-0.1.1/src/spriteforge/stages/preview_render.py +169 -0
- spriteforge-0.1.1/src/spriteforge/stages/preview_repair.py +61 -0
- spriteforge-0.1.1/src/spriteforge/stages/preview_review.py +169 -0
- spriteforge-0.1.1/src/spriteforge/stages/production.py +170 -0
- spriteforge-0.1.1/src/spriteforge/stages/references.py +105 -0
- spriteforge-0.1.1/src/spriteforge/stages/rewind.py +128 -0
- spriteforge-0.1.1/src/spriteforge/stages/workflow.py +440 -0
- spriteforge-0.1.1/src/spriteforge/templates/phaser/audit.js +45 -0
- spriteforge-0.1.1/src/spriteforge/templates/phaser/font.png +0 -0
- spriteforge-0.1.1/src/spriteforge/templates/phaser/font.xml +1 -0
- spriteforge-0.1.1/src/spriteforge/templates/phaser/preview.html +9 -0
- spriteforge-0.1.1/src/spriteforge/templates/phaser/room.js +49 -0
- spriteforge-0.1.1/src/spriteforge/templates/phaser/vendor/LICENSE.md +20 -0
- spriteforge-0.1.1/src/spriteforge/templates/phaser/vendor/phaser.min.js +1 -0
- spriteforge-0.1.1/src/spriteforge.egg-info/PKG-INFO +364 -0
- spriteforge-0.1.1/src/spriteforge.egg-info/SOURCES.txt +281 -0
- spriteforge-0.1.1/src/spriteforge.egg-info/dependency_links.txt +1 -0
- spriteforge-0.1.1/src/spriteforge.egg-info/entry_points.txt +2 -0
- spriteforge-0.1.1/src/spriteforge.egg-info/requires.txt +18 -0
- spriteforge-0.1.1/src/spriteforge.egg-info/top_level.txt +1 -0
- spriteforge-0.1.1/tests/test_agent_runtime.py +248 -0
- spriteforge-0.1.1/tests/test_agent_tools.py +151 -0
- spriteforge-0.1.1/tests/test_agent_ui.py +127 -0
- spriteforge-0.1.1/tests/test_art_parallel.py +216 -0
- spriteforge-0.1.1/tests/test_art_review.py +424 -0
- spriteforge-0.1.1/tests/test_art_spec.py +443 -0
- spriteforge-0.1.1/tests/test_asset_production.py +324 -0
- spriteforge-0.1.1/tests/test_asset_ui.py +116 -0
- spriteforge-0.1.1/tests/test_bundle_levels.py +20 -0
- spriteforge-0.1.1/tests/test_catalog.py +43 -0
- spriteforge-0.1.1/tests/test_chat_changes.py +149 -0
- spriteforge-0.1.1/tests/test_codegen_patch.py +276 -0
- spriteforge-0.1.1/tests/test_credentials.py +44 -0
- spriteforge-0.1.1/tests/test_endless.py +69 -0
- spriteforge-0.1.1/tests/test_extensions.py +262 -0
- spriteforge-0.1.1/tests/test_extensions_ui.py +127 -0
- spriteforge-0.1.1/tests/test_foundation.py +165 -0
- spriteforge-0.1.1/tests/test_free_pixel_tools.py +86 -0
- spriteforge-0.1.1/tests/test_game_complete.py +292 -0
- spriteforge-0.1.1/tests/test_game_confirm.py +79 -0
- spriteforge-0.1.1/tests/test_game_db.py +309 -0
- spriteforge-0.1.1/tests/test_game_flow.py +355 -0
- spriteforge-0.1.1/tests/test_game_make.py +411 -0
- spriteforge-0.1.1/tests/test_game_plan.py +388 -0
- spriteforge-0.1.1/tests/test_game_sdk.py +113 -0
- spriteforge-0.1.1/tests/test_game_stage.py +401 -0
- spriteforge-0.1.1/tests/test_gameplay_preview.py +288 -0
- spriteforge-0.1.1/tests/test_hud_check.py +73 -0
- spriteforge-0.1.1/tests/test_intake_concept.py +220 -0
- spriteforge-0.1.1/tests/test_intake_ui.py +133 -0
- spriteforge-0.1.1/tests/test_level_backdrop.py +97 -0
- spriteforge-0.1.1/tests/test_levels.py +640 -0
- spriteforge-0.1.1/tests/test_levers.py +107 -0
- spriteforge-0.1.1/tests/test_library.py +86 -0
- spriteforge-0.1.1/tests/test_library_describe.py +294 -0
- spriteforge-0.1.1/tests/test_library_mcp.py +153 -0
- spriteforge-0.1.1/tests/test_memory_mcp.py +42 -0
- spriteforge-0.1.1/tests/test_memory_okf.py +384 -0
- spriteforge-0.1.1/tests/test_menus.py +302 -0
- spriteforge-0.1.1/tests/test_motion.py +505 -0
- spriteforge-0.1.1/tests/test_pixel_atlas_preview.py +75 -0
- spriteforge-0.1.1/tests/test_pixel_native.py +174 -0
- spriteforge-0.1.1/tests/test_pixel_outline_guard.py +37 -0
- spriteforge-0.1.1/tests/test_pixel_palette.py +58 -0
- spriteforge-0.1.1/tests/test_pixel_process.py +153 -0
- spriteforge-0.1.1/tests/test_pixel_source.py +186 -0
- spriteforge-0.1.1/tests/test_pixel_validate.py +107 -0
- spriteforge-0.1.1/tests/test_preview_routing.py +56 -0
- spriteforge-0.1.1/tests/test_process_resume.py +79 -0
- spriteforge-0.1.1/tests/test_providers.py +182 -0
- spriteforge-0.1.1/tests/test_qa_checks.py +199 -0
- spriteforge-0.1.1/tests/test_qa_tests.py +229 -0
- spriteforge-0.1.1/tests/test_references.py +127 -0
- spriteforge-0.1.1/tests/test_rewind.py +316 -0
- spriteforge-0.1.1/tests/test_router.py +290 -0
- spriteforge-0.1.1/tests/test_sounds.py +315 -0
- spriteforge-0.1.1/tests/test_studio.py +307 -0
- spriteforge-0.1.1/tests/test_studio_api.py +230 -0
- spriteforge-0.1.1/tests/test_team_reports.py +90 -0
- spriteforge-0.1.1/tests/test_usage_accounting.py +142 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 reviver134
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
|
23
|
+
Third-party components bundled in this repository keep their own licenses:
|
|
24
|
+
Phaser 3 (MIT, src/spriteforge/templates/phaser/vendor/), the Press Start 2P font
|
|
25
|
+
(SIL OFL 1.1, ui/public/press-start-2p-LICENSE.txt), the vendored game-development
|
|
26
|
+
skills (Apache-2.0, src/spriteforge/skills/builtin/THIRD_PARTY.md) and the CC0 art
|
|
27
|
+
packs in assets/library/.
|
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: spriteforge
|
|
3
|
+
Version: 0.1.1
|
|
4
|
+
Summary: Describe a game in a sentence: Muse-powered AI agents build a playable pixel-art browser game, and you approve every step.
|
|
5
|
+
Author: reviver134
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/reviver134/spriteforge
|
|
8
|
+
Project-URL: Source, https://github.com/reviver134/spriteforge
|
|
9
|
+
Project-URL: Issues, https://github.com/reviver134/spriteforge/issues
|
|
10
|
+
Project-URL: Changelog, https://github.com/reviver134/spriteforge/releases
|
|
11
|
+
Keywords: game-development,pixel-art,phaser,ai-agents,multi-agent,llm,mcp,procedural-generation
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Environment :: Web Environment
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Topic :: Games/Entertainment
|
|
21
|
+
Classifier: Topic :: Multimedia :: Graphics
|
|
22
|
+
Classifier: Topic :: Software Development :: Code Generators
|
|
23
|
+
Requires-Python: >=3.11
|
|
24
|
+
Description-Content-Type: text/markdown
|
|
25
|
+
License-File: LICENSE
|
|
26
|
+
Requires-Dist: pillow>=10
|
|
27
|
+
Requires-Dist: numpy>=1.26
|
|
28
|
+
Requires-Dist: pydantic>=2
|
|
29
|
+
Requires-Dist: httpx>=0.27
|
|
30
|
+
Requires-Dist: typer>=0.12
|
|
31
|
+
Requires-Dist: fastapi>=0.115
|
|
32
|
+
Requires-Dist: uvicorn>=0.31.1
|
|
33
|
+
Requires-Dist: pyyaml>=6
|
|
34
|
+
Requires-Dist: python-dotenv>=1
|
|
35
|
+
Requires-Dist: mcp<2,>=1.28
|
|
36
|
+
Requires-Dist: sse-starlette<3,>=1.6.1
|
|
37
|
+
Requires-Dist: jsonschema>=4
|
|
38
|
+
Requires-Dist: playwright>=1.48
|
|
39
|
+
Provides-Extra: dev
|
|
40
|
+
Requires-Dist: pytest>=8; extra == "dev"
|
|
41
|
+
Requires-Dist: ruff>=0.9; extra == "dev"
|
|
42
|
+
Requires-Dist: playwright>=1.48; extra == "dev"
|
|
43
|
+
Dynamic: license-file
|
|
44
|
+
|
|
45
|
+
# SpriteForge
|
|
46
|
+
|
|
47
|
+
**Describe a game in a sentence. A team of AI agents builds a playable 2D pixel-art browser
|
|
48
|
+
game, and you approve every step.**
|
|
49
|
+
|
|
50
|
+

|
|
51
|
+
|
|
52
|
+
SpriteForge runs on your own machine. **Muse Spark** plans, designs, writes and repairs the
|
|
53
|
+
game; **Muse Image** draws and revises its art. Eleven role-based agents carry the game from
|
|
54
|
+
brief to finished build and pause at five human gates. Each finished game teaches the harness:
|
|
55
|
+
its lessons go to a local, auditable knowledge base that later builds read once you promote
|
|
56
|
+
them.
|
|
57
|
+
|
|
58
|
+
Built for the Meta Global AI Developer Hackathon (Oct 26 - Nov 4, 2026).
|
|
59
|
+
|
|
60
|
+
## Highlights
|
|
61
|
+
|
|
62
|
+
- **A studio, not a prompt box.** A chat-first local UI shows the agents in the order they
|
|
63
|
+
work. Chat with any of them, give them reference images, or stop a run and send it back to
|
|
64
|
+
an earlier step.
|
|
65
|
+
- **You decide, the agents work.** Five gates: brief, design, menus, playtest, final. Feedback
|
|
66
|
+
in plain words goes only to the agent it is about, and after a playtest the Director shows
|
|
67
|
+
its plan for your feedback before anything is rebuilt.
|
|
68
|
+
- **Real games.** Full-HD (1920x1080) Phaser 3 games with menus, saved progress, synthesised
|
|
69
|
+
sound and a sound editor, exported as a static site with their own pytest + Playwright
|
|
70
|
+
tests. Side-view games get levels written as data and proven clearable by code.
|
|
71
|
+
- **Code checks what models write.** Palettes, sprite grids, tile seams, level reachability,
|
|
72
|
+
menu flow and jump physics are checked deterministically, and a bot plays every level
|
|
73
|
+
before you do.
|
|
74
|
+
- **Costs you can see.** Every Muse call is metered in a durable ledger, and each agent has its
|
|
75
|
+
own $10 allowance.
|
|
76
|
+
- **Runs offline.** Mock providers stand in for Muse, so the whole pipeline and its 525 tests
|
|
77
|
+
run without a key.
|
|
78
|
+
|
|
79
|
+

|
|
80
|
+
|
|
81
|
+
## Games made with SpriteForge
|
|
82
|
+
|
|
83
|
+
Each started as one sentence, went through all five gates, and was played and approved by a
|
|
84
|
+
human. Every sprite, tile and title picture is Muse Image art or CC0/free-to-use library art.
|
|
85
|
+
|
|
86
|
+
| | Game | Genre | Builds | Muse cost |
|
|
87
|
+
| --- | --- | --- | --- | --- |
|
|
88
|
+
|  | **Stormlight Keeper**: climb a storm-battered lighthouse and relight its lamps before the ship hits the rocks | Side-scrolling platformer | 3 | $1.77 |
|
|
89
|
+
|  | **Pale Shores: Three-Isle Hold**: command small squads against Viking landings across three islands | Real-time island defence | 10 | $4.89 |
|
|
90
|
+
|  | **Tiny Kingdom Defense**: build basic, splash and slow towers along a winding path for six waves | Tower defense | 3 | $1.66 |
|
|
91
|
+
|
|
92
|
+
Gameplay clips: [Stormlight Keeper](https://github.com/reviver134/spriteforge/blob/master/docs/media/stormlight-keeper.gif) ·
|
|
93
|
+
[Pale Shores](https://github.com/reviver134/spriteforge/blob/master/docs/media/pale-shores.gif) ·
|
|
94
|
+
[Tiny Kingdom Defense](https://github.com/reviver134/spriteforge/blob/master/docs/media/tiny-kingdom-defense.gif)
|
|
95
|
+
|
|
96
|
+
The builds count feedback rounds: Pale Shores took ten because a human playtest found the squads
|
|
97
|
+
too weak to win, twice, and each round went back through the Director's plan. Two harness
|
|
98
|
+
checks came out of these games: a HUD check (texts drawn over each other or off the screen fail
|
|
99
|
+
the playtest) and a tile check (a ground tile drawn as an object on a background is redrawn).
|
|
100
|
+
|
|
101
|
+
## How a game gets made
|
|
102
|
+
|
|
103
|
+
```mermaid
|
|
104
|
+
flowchart LR
|
|
105
|
+
idea(["Your idea"]) --> G1["G1 Brief"] --> G2["G2 Design"] --> G3["G3 Menus"] --> G4["G4 Playtest"]
|
|
106
|
+
G4 -->|feedback| plan["The Director's plan"]
|
|
107
|
+
plan -->|you approve it| redo["Only the affected agents redo their part"]
|
|
108
|
+
redo --> G4
|
|
109
|
+
G4 -->|approve| G5["G5 Final"] --> kb[("Knowledge base")]
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
| Gate | You see | What happens before it |
|
|
113
|
+
| --- | --- | --- |
|
|
114
|
+
| **G1 Brief** | A short questionnaire for your genre | The Director picks one of 11 genre kits and the questions that matter for it |
|
|
115
|
+
| **G2 Design** | Research, the game plan, the design (and a story, if you asked), every agent's task list | The Game Designer studies similar games with Muse Spark web search, writes a numbered plan that code checks, then the design |
|
|
116
|
+
| **G3 Menus** | Every screen of the game and its title art | The Menu Designer writes the menus as data; Muse Image draws the title art |
|
|
117
|
+
| **G4 Playtest** | A play link, the art sheet, animations, the build report, each agent's report | Art comes from the local library or Muse Image; for a side-view game the Level/Tile Designer writes levels that code proves clearable; the Programmer writes Phaser code against a small SDK; a bot plays every level; the QA Playtester's tests run with real key presses; failures go back for repairs; the Art Reviewer (Spark vision) checks the art in the running game |
|
|
118
|
+
| **G5 Final** | The whole game, its cost, and the Librarian's lessons | Approval exports the game and its full record |
|
|
119
|
+
|
|
120
|
+
At any gate, write feedback in plain words ("the slime should jump higher", "the splash is too
|
|
121
|
+
loud"). The Director splits it into design, art, code, level, menu, sound, story and QA changes
|
|
122
|
+
and routes each to its agent; only that part is redone. At G4 and G5 its reading is shown
|
|
123
|
+
first, as a plan: submit it empty to approve, or type what the Director got wrong and it plans
|
|
124
|
+
again. Nothing is built until you approve.
|
|
125
|
+
|
|
126
|
+
In the studio you can also:
|
|
127
|
+
|
|
128
|
+
- **chat with any agent:** a question is answered from that agent's own work; a change is filed
|
|
129
|
+
into its part of the next revision;
|
|
130
|
+
- **go back:** changing work that is already done stops the agent working now and rewinds the
|
|
131
|
+
run to the step the change is about (calls already paid for are kept and cached);
|
|
132
|
+
- **give references:** images for one agent or for all of them (Spark sees them; the art
|
|
133
|
+
agents' references steer Muse Image's style);
|
|
134
|
+
- **apply an Art Reviewer suggestion** with one click, or send feedback for one level only.
|
|
135
|
+
|
|
136
|
+
## How SpriteForge uses Muse
|
|
137
|
+
|
|
138
|
+
| Agent | Muse | Its job |
|
|
139
|
+
| --- | --- | --- |
|
|
140
|
+
| Director | Spark | Picks a genre and the brief's questions; turns your feedback into a plan of changes per agent |
|
|
141
|
+
| Game Designer | Spark, web search | Studies similar games online; writes the game plan, the design and, on request, a story |
|
|
142
|
+
| Level/Tile Designer | Spark, web search | Studies the level design of similar games; writes each level as data |
|
|
143
|
+
| Art Director | Spark | Picks library art; writes every entity's animation rows, forms and effects |
|
|
144
|
+
| Pixel Artist | Muse Image | Draws sprite sheets (a row of frames per animation), the title background and an emblem |
|
|
145
|
+
| Menu Designer | Spark | Writes every menu screen as data |
|
|
146
|
+
| Sound Director | Spark | Picks a synthesised sound for every moment of the game |
|
|
147
|
+
| Programmer | Spark | Writes the Phaser 3 game against a small SDK, then repairs it from what failed |
|
|
148
|
+
| QA Playtester | Spark | Writes tests played with real key presses, and code checks for each game |
|
|
149
|
+
| Art Reviewer | Spark vision, Muse Image edits | Reviews the art in screenshots of the running game and fixes blocking issues |
|
|
150
|
+
| Librarian | Spark | Writes the lessons each finished game teaches; describes library art (vision) |
|
|
151
|
+
|
|
152
|
+
The Muse features the harness relies on, each verified with live calls (the notes are in
|
|
153
|
+
`src/spriteforge/config.yaml`):
|
|
154
|
+
|
|
155
|
+
- strict `json_schema` output for every design, plan, level, menu and code file set;
|
|
156
|
+
- `reasoning_effort` per task: low for routing, high for design and code, max for the art
|
|
157
|
+
review;
|
|
158
|
+
- prompt caching: prompts lead with their stable part and send a `prompt_cache_key` per task;
|
|
159
|
+
- web search through the Responses API, with every URL the research cites checked against the
|
|
160
|
+
pages the search returned;
|
|
161
|
+
- vision: screenshots of the running game, library art and your reference images;
|
|
162
|
+
- Muse Image generations and edits at the high setting, with reference images and a
|
|
163
|
+
content-addressed cache, so an identical request is never paid for twice;
|
|
164
|
+
- tool use: in a live build, agents call their granted MCP tools and load skills before they
|
|
165
|
+
answer.
|
|
166
|
+
|
|
167
|
+
## Principles
|
|
168
|
+
|
|
169
|
+
- **Models propose; code enforces.** Palettes, sprite sizes, tile seams, jump physics, menu
|
|
170
|
+
reachability and QA tests are checked by code, not trusted.
|
|
171
|
+
- **Accepted art is locked.** Muse Image has no seed, so approved assets are never regenerated
|
|
172
|
+
unless you ask for a change to them.
|
|
173
|
+
- **Caps stop loops, not you.** Each agent may spend $10 (`budget.max_agent_cost`) since your
|
|
174
|
+
last action; its loops (repairs, redraws, review rounds) go on while they improve, until that
|
|
175
|
+
is used up. Work you ask for always starts. `spriteforge report RUN_ID` shows calls, tokens
|
|
176
|
+
and cost.
|
|
177
|
+
- **Local-first.** All data stays in a workspace folder. The API key is read from the
|
|
178
|
+
environment and scrubbed from logs, memory and exports.
|
|
179
|
+
- **Auditable learning.** Knowledge is plain Markdown in a git repo (OKF format). Lessons the
|
|
180
|
+
agents write stay "generated" until a human promotes them.
|
|
181
|
+
- **Extensible.** Agent roles are Markdown files; skills (SKILL.md folders) and MCP servers are
|
|
182
|
+
granted per agent.
|
|
183
|
+
|
|
184
|
+
## Quick start
|
|
185
|
+
|
|
186
|
+
Requires Python 3.11+. Node.js is optional (used to syntax-check generated code).
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
pip install spriteforge
|
|
190
|
+
python -m playwright install chromium
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
To work on SpriteForge itself, install from a clone instead (this also gets you the tests and
|
|
194
|
+
the CC0 art packs in `assets/library/`):
|
|
195
|
+
|
|
196
|
+
```bash
|
|
197
|
+
git clone https://github.com/reviver134/spriteforge.git && cd spriteforge
|
|
198
|
+
python -m venv .venv && . .venv/bin/activate # Windows: .venv\Scripts\activate
|
|
199
|
+
pip install -e ".[dev]"
|
|
200
|
+
python -m playwright install chromium
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Installed with pip, the art library lives in `~/spriteforge-workspace/library` (or the folder
|
|
204
|
+
`SPRITEFORGE_LIBRARY` names) and starts empty: add packs with `spriteforge library add`, or let
|
|
205
|
+
Muse Image draw everything.
|
|
206
|
+
|
|
207
|
+
**Offline (no key):**
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
python -m spriteforge start --agents --mock --workspace workspace
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
**Live with Muse:** put your key in the environment or in a `.env` file in the folder you start
|
|
214
|
+
from (in a clone, `.env` is gitignored), then start without `--mock`:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
echo META_API_KEY=your-key > .env
|
|
218
|
+
python -m spriteforge start --agents --workspace workspace --goal "a slime that squishes through a cave"
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
The studio opens at <http://127.0.0.1:8765> (the previous UI stays at `/classic`), and
|
|
222
|
+
`python -m spriteforge` on its own opens it for every project in the workspace: describe a new
|
|
223
|
+
game there (without a key it offers the offline mock), and several projects can run at once.
|
|
224
|
+
It serves localhost only and refuses cross-site requests. Stop the process at any gate and pick
|
|
225
|
+
up later:
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
python -m spriteforge runs --workspace workspace
|
|
229
|
+
python -m spriteforge resume RUN_ID --workspace workspace
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**Without the UI:** design, art, code, playtest and repair in one command:
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
python -m spriteforge game make "a 10 minute top-down survival game" --out out/survival
|
|
236
|
+
python -m spriteforge game make "a slime arena" --out out/slime --mock
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
## What you get
|
|
240
|
+
|
|
241
|
+
Each run lives in `workspace/runs/RUN_ID/`. A finished game (`game/vN/`) is a static Phaser 3
|
|
242
|
+
site with no build step: open `index.html` over any static server, or host it anywhere.
|
|
243
|
+
|
|
244
|
+
- `export.zip`: the build, its QA tests (`pytest build/tests`) and its full record.
|
|
245
|
+
- `sounds.html`: a sound editor. All sound is synthesised in the browser (no audio files).
|
|
246
|
+
- `game/db/`: the game's record as an OKF bundle (design, entities, art, code, QA, builds,
|
|
247
|
+
your decisions), readable by agents through read-only MCP tools
|
|
248
|
+
(`spriteforge game db mcp workspace/runs/RUN_ID`).
|
|
249
|
+
|
|
250
|
+
In the game: arrows/WASD and Enter, Escape pauses, M toggles sound. `?play=1` skips the title,
|
|
251
|
+
`?reset=1` clears saved progress.
|
|
252
|
+
|
|
253
|
+
## Knowledge, skills and tools
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
python -m spriteforge memory --help # search, validate, promote lessons
|
|
257
|
+
python -m spriteforge memory promote lessons/<id> --by you # let later games use a lesson
|
|
258
|
+
python -m spriteforge skills --help # add SKILL.md folders, grant per agent
|
|
259
|
+
python -m spriteforge mcp --help # add MCP servers, grant per agent
|
|
260
|
+
python -m spriteforge library --help # local art packs with license tracking
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
Agent roles are Markdown files in `src/spriteforge/agents/roles/`; built-in skills are in
|
|
264
|
+
`src/spriteforge/skills/builtin/`, including seven open-source game-development skills (level
|
|
265
|
+
design, platformer, puzzle, game feel, physics tuning, audio design, game UI/UX; Apache-2.0)
|
|
266
|
+
granted to the agents they suit.
|
|
267
|
+
|
|
268
|
+
In a live build each agent may look things up before it answers (up to `game.tool_rounds`
|
|
269
|
+
rounds): the built-in MCP tools its role grants (`library.*` for the art library, `game_db.*`
|
|
270
|
+
for the game's record), its skills (`load_skill`), and your MCP tools granted to it that you
|
|
271
|
+
set to run without confirmation. Each lookup shows in the agent's chat. `game.agent_tools:
|
|
272
|
+
false` turns this off (one call per answer).
|
|
273
|
+
|
|
274
|
+
MCP server templates are in `src/spriteforge/mcp/templates/`. The official fetch server lets
|
|
275
|
+
agents read public web pages (needs `uv`; it refuses private and local addresses):
|
|
276
|
+
|
|
277
|
+
```bash
|
|
278
|
+
python -m spriteforge mcp add fetch src/spriteforge/mcp/templates/fetch.json
|
|
279
|
+
python -m spriteforge mcp inspect fetch
|
|
280
|
+
python -m spriteforge mcp enable fetch --role "Level/Tile Designer"
|
|
281
|
+
python -m spriteforge mcp policy fetch fetch --no-confirm # builds use only tools that do not ask
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
The Context7 server gives the Programmer the Phaser 3.90 documentation (needs Node.js; the
|
|
285
|
+
questions go to context7.com; an optional free `CONTEXT7_API_KEY` raises its limits):
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
python -m spriteforge mcp add context7 src/spriteforge/mcp/templates/context7.json
|
|
289
|
+
python -m spriteforge mcp inspect context7
|
|
290
|
+
python -m spriteforge mcp enable context7 --role Programmer
|
|
291
|
+
python -m spriteforge mcp policy context7 resolve-library-id --no-confirm
|
|
292
|
+
python -m spriteforge mcp policy context7 query-docs --no-confirm
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
`python -m spriteforge mcp disable NAME` takes a server away again.
|
|
296
|
+
|
|
297
|
+
## Configuration
|
|
298
|
+
|
|
299
|
+
`src/spriteforge/config.yaml` (or your own file with `--config`) holds the endpoints, the model
|
|
300
|
+
ids (`muse-spark-1.3`, `muse-image-1.0`), the reasoning effort per task and these switches:
|
|
301
|
+
|
|
302
|
+
| Key | Default | What it does |
|
|
303
|
+
| --- | --- | --- |
|
|
304
|
+
| `budget.max_agent_cost` | `10` | USD each agent may spend since your last action |
|
|
305
|
+
| `game.patience` | `2` | An agent's loop stops after this many tries in a row without improvement |
|
|
306
|
+
| `game.screen_scale` | `6` | 320x180 design pixels times this: 6 is 1920x1080, 4 is 1280x720 |
|
|
307
|
+
| `game.image_reasoning` | `high` | Muse Image's setting for every first draw |
|
|
308
|
+
| `game.review` | `true` | The Art Reviewer checks the art before G4 |
|
|
309
|
+
| `game.agent_tools` | `true` | Agents may call MCP tools and load skills in a live build |
|
|
310
|
+
| `game.hud_check` | `true` | The bot playtest fails a build whose HUD texts cover each other or run off the screen |
|
|
311
|
+
|
|
312
|
+
## Project layout
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
src/spriteforge/
|
|
316
|
+
agents/ role prompts (Markdown), router, agent runtime
|
|
317
|
+
app/ FastAPI server, the built studio (static/) and the classic page
|
|
318
|
+
core/ state (SQLite), gates, cost ledger, secret scrubbing
|
|
319
|
+
providers/ Muse Spark, Muse Image, web search, and mock providers
|
|
320
|
+
stages/ the gated workflow: brief, design, menus, playtest, final, rewind
|
|
321
|
+
game/ design, levels, art, code generation, the game SDK, menus, sounds, QA, export
|
|
322
|
+
pixel/ deterministic pixel tools: grid detection, palettes, seams, atlases
|
|
323
|
+
memory/ OKF knowledge base
|
|
324
|
+
library/ local art packs with license tracking
|
|
325
|
+
skills/ SKILL.md folders granted per agent
|
|
326
|
+
mcp/ MCP servers and templates granted per agent
|
|
327
|
+
ui/ the React studio (Vite, TypeScript); its build is committed to app/static/
|
|
328
|
+
tests/ pytest + Playwright, offline
|
|
329
|
+
docs/ engineering notes: levels, QA code checks, the Sound Director, the studio
|
|
330
|
+
tools/ live-run, font and art-library helpers
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
## Tests
|
|
334
|
+
|
|
335
|
+
```bash
|
|
336
|
+
python -m pytest -q
|
|
337
|
+
```
|
|
338
|
+
|
|
339
|
+
The tests use mock providers and make no network calls; the browser tests need the Chromium
|
|
340
|
+
installed above.
|
|
341
|
+
|
|
342
|
+
## Developing the studio UI
|
|
343
|
+
|
|
344
|
+
The React studio lives in `ui/` (Vite, React 18, TypeScript). Its build is committed to
|
|
345
|
+
`src/spriteforge/app/static/`, so running SpriteForge never needs Node.
|
|
346
|
+
|
|
347
|
+
```bash
|
|
348
|
+
cd ui && npm ci
|
|
349
|
+
npm run dev # http://localhost:5173, proxies /api to a running `python -m spriteforge`
|
|
350
|
+
npm run build # type-checks, then rewrites src/spriteforge/app/static/
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
## License
|
|
354
|
+
|
|
355
|
+
SpriteForge is released under the [MIT License](https://github.com/reviver134/spriteforge/blob/master/LICENSE). Bundled third-party parts keep their
|
|
356
|
+
own licenses:
|
|
357
|
+
|
|
358
|
+
- Phaser 3.90.0 (MIT) in `src/spriteforge/templates/phaser/vendor/`;
|
|
359
|
+
- the Press Start 2P font (SIL OFL 1.1, license next to it) in the studio build;
|
|
360
|
+
- seven skills from [awesome-gamedev-agent-skills](https://github.com/gamedev-skills/awesome-gamedev-agent-skills)
|
|
361
|
+
(Apache-2.0, see `src/spriteforge/skills/builtin/THIRD_PARTY.md`);
|
|
362
|
+
- art packs in `assets/library/`, tracked by license: only packs verified as redistributable
|
|
363
|
+
(CC0 here) are committed; the rest stay on your machine and are listed in
|
|
364
|
+
`assets/library/.gitignore`.
|