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.
Files changed (283) hide show
  1. spriteforge-0.1.1/LICENSE +27 -0
  2. spriteforge-0.1.1/PKG-INFO +364 -0
  3. spriteforge-0.1.1/README.md +320 -0
  4. spriteforge-0.1.1/pyproject.toml +55 -0
  5. spriteforge-0.1.1/setup.cfg +4 -0
  6. spriteforge-0.1.1/src/spriteforge/__init__.py +1 -0
  7. spriteforge-0.1.1/src/spriteforge/__main__.py +3 -0
  8. spriteforge-0.1.1/src/spriteforge/agents/__init__.py +0 -0
  9. spriteforge-0.1.1/src/spriteforge/agents/assets.py +109 -0
  10. spriteforge-0.1.1/src/spriteforge/agents/cancellation.py +12 -0
  11. spriteforge-0.1.1/src/spriteforge/agents/director.py +50 -0
  12. spriteforge-0.1.1/src/spriteforge/agents/models.py +63 -0
  13. spriteforge-0.1.1/src/spriteforge/agents/roles/art-director.md +15 -0
  14. spriteforge-0.1.1/src/spriteforge/agents/roles/art-reviewer.md +14 -0
  15. spriteforge-0.1.1/src/spriteforge/agents/roles/director.md +14 -0
  16. spriteforge-0.1.1/src/spriteforge/agents/roles/game-designer.md +15 -0
  17. spriteforge-0.1.1/src/spriteforge/agents/roles/level-tile-designer.md +16 -0
  18. spriteforge-0.1.1/src/spriteforge/agents/roles/librarian.md +13 -0
  19. spriteforge-0.1.1/src/spriteforge/agents/roles/menu-designer.md +15 -0
  20. spriteforge-0.1.1/src/spriteforge/agents/roles/pixel-artist.md +14 -0
  21. spriteforge-0.1.1/src/spriteforge/agents/roles/programmer.md +14 -0
  22. spriteforge-0.1.1/src/spriteforge/agents/roles/qa-playtester.md +13 -0
  23. spriteforge-0.1.1/src/spriteforge/agents/roles/sound-director.md +14 -0
  24. spriteforge-0.1.1/src/spriteforge/agents/roles.py +39 -0
  25. spriteforge-0.1.1/src/spriteforge/agents/router.py +233 -0
  26. spriteforge-0.1.1/src/spriteforge/agents/router_eval.py +145 -0
  27. spriteforge-0.1.1/src/spriteforge/agents/routing_state.py +133 -0
  28. spriteforge-0.1.1/src/spriteforge/agents/runtime.py +430 -0
  29. spriteforge-0.1.1/src/spriteforge/agents/workflow.py +389 -0
  30. spriteforge-0.1.1/src/spriteforge/app/__init__.py +0 -0
  31. spriteforge-0.1.1/src/spriteforge/app/agents_view.py +248 -0
  32. spriteforge-0.1.1/src/spriteforge/app/chat.py +114 -0
  33. spriteforge-0.1.1/src/spriteforge/app/extensions.py +115 -0
  34. spriteforge-0.1.1/src/spriteforge/app/index.html +279 -0
  35. spriteforge-0.1.1/src/spriteforge/app/local_only.py +49 -0
  36. spriteforge-0.1.1/src/spriteforge/app/server.py +358 -0
  37. spriteforge-0.1.1/src/spriteforge/app/static/assets/index-L2s1wlcp.css +1 -0
  38. spriteforge-0.1.1/src/spriteforge/app/static/assets/index-aBfzgLQl.js +71 -0
  39. spriteforge-0.1.1/src/spriteforge/app/static/assets/press-start-2p-latin-400-normal-BKfmdmKK.woff +0 -0
  40. spriteforge-0.1.1/src/spriteforge/app/static/assets/press-start-2p-latin-400-normal-xj9lRvVs.woff2 +0 -0
  41. spriteforge-0.1.1/src/spriteforge/app/static/index.html +13 -0
  42. spriteforge-0.1.1/src/spriteforge/app/static/press-start-2p-LICENSE.txt +93 -0
  43. spriteforge-0.1.1/src/spriteforge/app/studio.py +278 -0
  44. spriteforge-0.1.1/src/spriteforge/app/workers.py +73 -0
  45. spriteforge-0.1.1/src/spriteforge/cli.py +241 -0
  46. spriteforge-0.1.1/src/spriteforge/config.py +193 -0
  47. spriteforge-0.1.1/src/spriteforge/config.yaml +157 -0
  48. spriteforge-0.1.1/src/spriteforge/core/__init__.py +0 -0
  49. spriteforge-0.1.1/src/spriteforge/core/acting.py +16 -0
  50. spriteforge-0.1.1/src/spriteforge/core/cost.py +236 -0
  51. spriteforge-0.1.1/src/spriteforge/core/credentials.py +24 -0
  52. spriteforge-0.1.1/src/spriteforge/core/demo.py +79 -0
  53. spriteforge-0.1.1/src/spriteforge/core/forms.py +20 -0
  54. spriteforge-0.1.1/src/spriteforge/core/gates.py +175 -0
  55. spriteforge-0.1.1/src/spriteforge/core/security.py +42 -0
  56. spriteforge-0.1.1/src/spriteforge/core/state.py +222 -0
  57. spriteforge-0.1.1/src/spriteforge/core/team.py +15 -0
  58. spriteforge-0.1.1/src/spriteforge/core/usage.py +68 -0
  59. spriteforge-0.1.1/src/spriteforge/game/__init__.py +0 -0
  60. spriteforge-0.1.1/src/spriteforge/game/actors.py +377 -0
  61. spriteforge-0.1.1/src/spriteforge/game/agent_tools.py +178 -0
  62. spriteforge-0.1.1/src/spriteforge/game/art.py +2097 -0
  63. spriteforge-0.1.1/src/spriteforge/game/art_checks.py +190 -0
  64. spriteforge-0.1.1/src/spriteforge/game/art_review.py +518 -0
  65. spriteforge-0.1.1/src/spriteforge/game/build.py +134 -0
  66. spriteforge-0.1.1/src/spriteforge/game/bundle.py +1178 -0
  67. spriteforge-0.1.1/src/spriteforge/game/cli.py +119 -0
  68. spriteforge-0.1.1/src/spriteforge/game/codegen.py +433 -0
  69. spriteforge-0.1.1/src/spriteforge/game/codeinfo.py +154 -0
  70. spriteforge-0.1.1/src/spriteforge/game/dbsource.py +137 -0
  71. spriteforge-0.1.1/src/spriteforge/game/design.py +342 -0
  72. spriteforge-0.1.1/src/spriteforge/game/export.py +62 -0
  73. spriteforge-0.1.1/src/spriteforge/game/gamedb.py +191 -0
  74. spriteforge-0.1.1/src/spriteforge/game/image_cache.py +61 -0
  75. spriteforge-0.1.1/src/spriteforge/game/lessons.py +259 -0
  76. spriteforge-0.1.1/src/spriteforge/game/level_gen.py +118 -0
  77. spriteforge-0.1.1/src/spriteforge/game/level_preview.py +97 -0
  78. spriteforge-0.1.1/src/spriteforge/game/levels.py +934 -0
  79. spriteforge-0.1.1/src/spriteforge/game/loops.py +38 -0
  80. spriteforge-0.1.1/src/spriteforge/game/menus.py +712 -0
  81. spriteforge-0.1.1/src/spriteforge/game/mock_game.js +109 -0
  82. spriteforge-0.1.1/src/spriteforge/game/mock_platformer.js +58 -0
  83. spriteforge-0.1.1/src/spriteforge/game/motion.py +881 -0
  84. spriteforge-0.1.1/src/spriteforge/game/pipeline.py +1768 -0
  85. spriteforge-0.1.1/src/spriteforge/game/plan.py +502 -0
  86. spriteforge-0.1.1/src/spriteforge/game/playtest.py +318 -0
  87. spriteforge-0.1.1/src/spriteforge/game/qa.py +664 -0
  88. spriteforge-0.1.1/src/spriteforge/game/qa_checks.py +223 -0
  89. spriteforge-0.1.1/src/spriteforge/game/qa_runtime.py +565 -0
  90. spriteforge-0.1.1/src/spriteforge/game/reach.py +807 -0
  91. spriteforge-0.1.1/src/spriteforge/game/record.py +138 -0
  92. spriteforge-0.1.1/src/spriteforge/game/research.py +262 -0
  93. spriteforge-0.1.1/src/spriteforge/game/revision.py +225 -0
  94. spriteforge-0.1.1/src/spriteforge/game/sdk/API.md +104 -0
  95. spriteforge-0.1.1/src/spriteforge/game/sdk/FLOW.md +19 -0
  96. spriteforge-0.1.1/src/spriteforge/game/sdk/LEVELS.md +65 -0
  97. spriteforge-0.1.1/src/spriteforge/game/sdk/sf.js +418 -0
  98. spriteforge-0.1.1/src/spriteforge/game/sdk/sfflow.js +442 -0
  99. spriteforge-0.1.1/src/spriteforge/game/sdk/sflevel.js +683 -0
  100. spriteforge-0.1.1/src/spriteforge/game/sdk/sfsound-editor.js +225 -0
  101. spriteforge-0.1.1/src/spriteforge/game/sdk/sfsound.js +260 -0
  102. spriteforge-0.1.1/src/spriteforge/game/sdk/sounds.html +67 -0
  103. spriteforge-0.1.1/src/spriteforge/game/sounds.py +793 -0
  104. spriteforge-0.1.1/src/spriteforge/game/story.py +188 -0
  105. spriteforge-0.1.1/src/spriteforge/game/structure.py +98 -0
  106. spriteforge-0.1.1/src/spriteforge/game/team_reports.py +394 -0
  107. spriteforge-0.1.1/src/spriteforge/game/tilesets.py +70 -0
  108. spriteforge-0.1.1/src/spriteforge/game/title_art.py +186 -0
  109. spriteforge-0.1.1/src/spriteforge/genres/__init__.py +0 -0
  110. spriteforge-0.1.1/src/spriteforge/library/__init__.py +15 -0
  111. spriteforge-0.1.1/src/spriteforge/library/cli.py +126 -0
  112. spriteforge-0.1.1/src/spriteforge/library/describe.py +242 -0
  113. spriteforge-0.1.1/src/spriteforge/library/looks.py +154 -0
  114. spriteforge-0.1.1/src/spriteforge/library/models.py +79 -0
  115. spriteforge-0.1.1/src/spriteforge/library/store.py +422 -0
  116. spriteforge-0.1.1/src/spriteforge/library/tilesets/README.md +32 -0
  117. spriteforge-0.1.1/src/spriteforge/library/tilesets/gandalf-seasons.json +111 -0
  118. spriteforge-0.1.1/src/spriteforge/library/tilesets/pixel-crawler-dungeon.json +66 -0
  119. spriteforge-0.1.1/src/spriteforge/mcp/__init__.py +0 -0
  120. spriteforge-0.1.1/src/spriteforge/mcp/cli.py +58 -0
  121. spriteforge-0.1.1/src/spriteforge/mcp/client.py +57 -0
  122. spriteforge-0.1.1/src/spriteforge/mcp/filesystem_read.py +32 -0
  123. spriteforge-0.1.1/src/spriteforge/mcp/gamedb.py +56 -0
  124. spriteforge-0.1.1/src/spriteforge/mcp/library.py +179 -0
  125. spriteforge-0.1.1/src/spriteforge/mcp/memory.py +37 -0
  126. spriteforge-0.1.1/src/spriteforge/mcp/pixel_tools.py +145 -0
  127. spriteforge-0.1.1/src/spriteforge/mcp/registry.py +145 -0
  128. spriteforge-0.1.1/src/spriteforge/mcp/service.py +224 -0
  129. spriteforge-0.1.1/src/spriteforge/mcp/templates/context7.json +6 -0
  130. spriteforge-0.1.1/src/spriteforge/mcp/templates/fetch.json +6 -0
  131. spriteforge-0.1.1/src/spriteforge/mcp/templates/filesystem-read.json +6 -0
  132. spriteforge-0.1.1/src/spriteforge/mcp/templates/pixel-tools.json +6 -0
  133. spriteforge-0.1.1/src/spriteforge/memory/README.md +10 -0
  134. spriteforge-0.1.1/src/spriteforge/memory/__init__.py +0 -0
  135. spriteforge-0.1.1/src/spriteforge/memory/cli.py +131 -0
  136. spriteforge-0.1.1/src/spriteforge/memory/okf/__init__.py +1 -0
  137. spriteforge-0.1.1/src/spriteforge/memory/okf/catalog.py +331 -0
  138. spriteforge-0.1.1/src/spriteforge/memory/okf/codec.py +63 -0
  139. spriteforge-0.1.1/src/spriteforge/memory/okf/git.py +104 -0
  140. spriteforge-0.1.1/src/spriteforge/memory/okf/indexes.py +50 -0
  141. spriteforge-0.1.1/src/spriteforge/memory/okf/models.py +114 -0
  142. spriteforge-0.1.1/src/spriteforge/memory/okf/search.py +53 -0
  143. spriteforge-0.1.1/src/spriteforge/memory/okf/seed.py +81 -0
  144. spriteforge-0.1.1/src/spriteforge/memory/okf/seeds/genres.yaml +121 -0
  145. spriteforge-0.1.1/src/spriteforge/memory/okf/seeds/other.yaml +150 -0
  146. spriteforge-0.1.1/src/spriteforge/memory/okf/store.py +402 -0
  147. spriteforge-0.1.1/src/spriteforge/memory/okf/validate.py +115 -0
  148. spriteforge-0.1.1/src/spriteforge/pixel/__init__.py +17 -0
  149. spriteforge-0.1.1/src/spriteforge/pixel/atlas.py +110 -0
  150. spriteforge-0.1.1/src/spriteforge/pixel/grid.py +174 -0
  151. spriteforge-0.1.1/src/spriteforge/pixel/palette.py +156 -0
  152. spriteforge-0.1.1/src/spriteforge/pixel/palettes/dungeon.json +9 -0
  153. spriteforge-0.1.1/src/spriteforge/pixel/postprocess.py +170 -0
  154. spriteforge-0.1.1/src/spriteforge/pixel/preview.py +40 -0
  155. spriteforge-0.1.1/src/spriteforge/pixel/schemas.py +139 -0
  156. spriteforge-0.1.1/src/spriteforge/pixel/source.py +237 -0
  157. spriteforge-0.1.1/src/spriteforge/pixel/terrain.py +48 -0
  158. spriteforge-0.1.1/src/spriteforge/pixel/validate.py +138 -0
  159. spriteforge-0.1.1/src/spriteforge/prompts/anim_frame.txt +1 -0
  160. spriteforge-0.1.1/src/spriteforge/prompts/character.txt +1 -0
  161. spriteforge-0.1.1/src/spriteforge/prompts/item.txt +1 -0
  162. spriteforge-0.1.1/src/spriteforge/prompts/tile.txt +1 -0
  163. spriteforge-0.1.1/src/spriteforge/prompts/ui.txt +1 -0
  164. spriteforge-0.1.1/src/spriteforge/providers/__init__.py +0 -0
  165. spriteforge-0.1.1/src/spriteforge/providers/base.py +97 -0
  166. spriteforge-0.1.1/src/spriteforge/providers/http.py +38 -0
  167. spriteforge-0.1.1/src/spriteforge/providers/mock.py +111 -0
  168. spriteforge-0.1.1/src/spriteforge/providers/muse_image.py +60 -0
  169. spriteforge-0.1.1/src/spriteforge/providers/muse_search.py +91 -0
  170. spriteforge-0.1.1/src/spriteforge/providers/muse_spark.py +66 -0
  171. spriteforge-0.1.1/src/spriteforge/skills/__init__.py +0 -0
  172. spriteforge-0.1.1/src/spriteforge/skills/builtin/LICENSE-awesome-gamedev-agent-skills.txt +201 -0
  173. spriteforge-0.1.1/src/spriteforge/skills/builtin/NOTICE-awesome-gamedev-agent-skills.txt +15 -0
  174. spriteforge-0.1.1/src/spriteforge/skills/builtin/THIRD_PARTY.md +21 -0
  175. spriteforge-0.1.1/src/spriteforge/skills/builtin/audio-design/SKILL.md +190 -0
  176. spriteforge-0.1.1/src/spriteforge/skills/builtin/game-feel/SKILL.md +174 -0
  177. spriteforge-0.1.1/src/spriteforge/skills/builtin/game-ui-ux/SKILL.md +167 -0
  178. spriteforge-0.1.1/src/spriteforge/skills/builtin/level-design/SKILL.md +169 -0
  179. spriteforge-0.1.1/src/spriteforge/skills/builtin/phaser-arcade-physics/SKILL.md +17 -0
  180. spriteforge-0.1.1/src/spriteforge/skills/builtin/physics-tuning/SKILL.md +164 -0
  181. spriteforge-0.1.1/src/spriteforge/skills/builtin/pixel-art-prompting/SKILL.md +12 -0
  182. spriteforge-0.1.1/src/spriteforge/skills/builtin/platformer/SKILL.md +153 -0
  183. spriteforge-0.1.1/src/spriteforge/skills/builtin/puzzle/SKILL.md +143 -0
  184. spriteforge-0.1.1/src/spriteforge/skills/builtin/sprite-animation-frames/SKILL.md +11 -0
  185. spriteforge-0.1.1/src/spriteforge/skills/builtin/tileset-design/SKILL.md +10 -0
  186. spriteforge-0.1.1/src/spriteforge/skills/catalog.py +200 -0
  187. spriteforge-0.1.1/src/spriteforge/skills/cli.py +41 -0
  188. spriteforge-0.1.1/src/spriteforge/stages/__init__.py +0 -0
  189. spriteforge-0.1.1/src/spriteforge/stages/asset_context.py +301 -0
  190. spriteforge-0.1.1/src/spriteforge/stages/asset_models.py +192 -0
  191. spriteforge-0.1.1/src/spriteforge/stages/asset_render.py +366 -0
  192. spriteforge-0.1.1/src/spriteforge/stages/asset_review.py +140 -0
  193. spriteforge-0.1.1/src/spriteforge/stages/asset_store.py +94 -0
  194. spriteforge-0.1.1/src/spriteforge/stages/chat_changes.py +236 -0
  195. spriteforge-0.1.1/src/spriteforge/stages/concept.py +42 -0
  196. spriteforge-0.1.1/src/spriteforge/stages/game.py +1699 -0
  197. spriteforge-0.1.1/src/spriteforge/stages/game_confirm.py +112 -0
  198. spriteforge-0.1.1/src/spriteforge/stages/game_final.py +220 -0
  199. spriteforge-0.1.1/src/spriteforge/stages/game_record.py +246 -0
  200. spriteforge-0.1.1/src/spriteforge/stages/gameplay.py +218 -0
  201. spriteforge-0.1.1/src/spriteforge/stages/intake.py +372 -0
  202. spriteforge-0.1.1/src/spriteforge/stages/preview_assets.py +212 -0
  203. spriteforge-0.1.1/src/spriteforge/stages/preview_models.py +167 -0
  204. spriteforge-0.1.1/src/spriteforge/stages/preview_render.py +169 -0
  205. spriteforge-0.1.1/src/spriteforge/stages/preview_repair.py +61 -0
  206. spriteforge-0.1.1/src/spriteforge/stages/preview_review.py +169 -0
  207. spriteforge-0.1.1/src/spriteforge/stages/production.py +170 -0
  208. spriteforge-0.1.1/src/spriteforge/stages/references.py +105 -0
  209. spriteforge-0.1.1/src/spriteforge/stages/rewind.py +128 -0
  210. spriteforge-0.1.1/src/spriteforge/stages/workflow.py +440 -0
  211. spriteforge-0.1.1/src/spriteforge/templates/phaser/audit.js +45 -0
  212. spriteforge-0.1.1/src/spriteforge/templates/phaser/font.png +0 -0
  213. spriteforge-0.1.1/src/spriteforge/templates/phaser/font.xml +1 -0
  214. spriteforge-0.1.1/src/spriteforge/templates/phaser/preview.html +9 -0
  215. spriteforge-0.1.1/src/spriteforge/templates/phaser/room.js +49 -0
  216. spriteforge-0.1.1/src/spriteforge/templates/phaser/vendor/LICENSE.md +20 -0
  217. spriteforge-0.1.1/src/spriteforge/templates/phaser/vendor/phaser.min.js +1 -0
  218. spriteforge-0.1.1/src/spriteforge.egg-info/PKG-INFO +364 -0
  219. spriteforge-0.1.1/src/spriteforge.egg-info/SOURCES.txt +281 -0
  220. spriteforge-0.1.1/src/spriteforge.egg-info/dependency_links.txt +1 -0
  221. spriteforge-0.1.1/src/spriteforge.egg-info/entry_points.txt +2 -0
  222. spriteforge-0.1.1/src/spriteforge.egg-info/requires.txt +18 -0
  223. spriteforge-0.1.1/src/spriteforge.egg-info/top_level.txt +1 -0
  224. spriteforge-0.1.1/tests/test_agent_runtime.py +248 -0
  225. spriteforge-0.1.1/tests/test_agent_tools.py +151 -0
  226. spriteforge-0.1.1/tests/test_agent_ui.py +127 -0
  227. spriteforge-0.1.1/tests/test_art_parallel.py +216 -0
  228. spriteforge-0.1.1/tests/test_art_review.py +424 -0
  229. spriteforge-0.1.1/tests/test_art_spec.py +443 -0
  230. spriteforge-0.1.1/tests/test_asset_production.py +324 -0
  231. spriteforge-0.1.1/tests/test_asset_ui.py +116 -0
  232. spriteforge-0.1.1/tests/test_bundle_levels.py +20 -0
  233. spriteforge-0.1.1/tests/test_catalog.py +43 -0
  234. spriteforge-0.1.1/tests/test_chat_changes.py +149 -0
  235. spriteforge-0.1.1/tests/test_codegen_patch.py +276 -0
  236. spriteforge-0.1.1/tests/test_credentials.py +44 -0
  237. spriteforge-0.1.1/tests/test_endless.py +69 -0
  238. spriteforge-0.1.1/tests/test_extensions.py +262 -0
  239. spriteforge-0.1.1/tests/test_extensions_ui.py +127 -0
  240. spriteforge-0.1.1/tests/test_foundation.py +165 -0
  241. spriteforge-0.1.1/tests/test_free_pixel_tools.py +86 -0
  242. spriteforge-0.1.1/tests/test_game_complete.py +292 -0
  243. spriteforge-0.1.1/tests/test_game_confirm.py +79 -0
  244. spriteforge-0.1.1/tests/test_game_db.py +309 -0
  245. spriteforge-0.1.1/tests/test_game_flow.py +355 -0
  246. spriteforge-0.1.1/tests/test_game_make.py +411 -0
  247. spriteforge-0.1.1/tests/test_game_plan.py +388 -0
  248. spriteforge-0.1.1/tests/test_game_sdk.py +113 -0
  249. spriteforge-0.1.1/tests/test_game_stage.py +401 -0
  250. spriteforge-0.1.1/tests/test_gameplay_preview.py +288 -0
  251. spriteforge-0.1.1/tests/test_hud_check.py +73 -0
  252. spriteforge-0.1.1/tests/test_intake_concept.py +220 -0
  253. spriteforge-0.1.1/tests/test_intake_ui.py +133 -0
  254. spriteforge-0.1.1/tests/test_level_backdrop.py +97 -0
  255. spriteforge-0.1.1/tests/test_levels.py +640 -0
  256. spriteforge-0.1.1/tests/test_levers.py +107 -0
  257. spriteforge-0.1.1/tests/test_library.py +86 -0
  258. spriteforge-0.1.1/tests/test_library_describe.py +294 -0
  259. spriteforge-0.1.1/tests/test_library_mcp.py +153 -0
  260. spriteforge-0.1.1/tests/test_memory_mcp.py +42 -0
  261. spriteforge-0.1.1/tests/test_memory_okf.py +384 -0
  262. spriteforge-0.1.1/tests/test_menus.py +302 -0
  263. spriteforge-0.1.1/tests/test_motion.py +505 -0
  264. spriteforge-0.1.1/tests/test_pixel_atlas_preview.py +75 -0
  265. spriteforge-0.1.1/tests/test_pixel_native.py +174 -0
  266. spriteforge-0.1.1/tests/test_pixel_outline_guard.py +37 -0
  267. spriteforge-0.1.1/tests/test_pixel_palette.py +58 -0
  268. spriteforge-0.1.1/tests/test_pixel_process.py +153 -0
  269. spriteforge-0.1.1/tests/test_pixel_source.py +186 -0
  270. spriteforge-0.1.1/tests/test_pixel_validate.py +107 -0
  271. spriteforge-0.1.1/tests/test_preview_routing.py +56 -0
  272. spriteforge-0.1.1/tests/test_process_resume.py +79 -0
  273. spriteforge-0.1.1/tests/test_providers.py +182 -0
  274. spriteforge-0.1.1/tests/test_qa_checks.py +199 -0
  275. spriteforge-0.1.1/tests/test_qa_tests.py +229 -0
  276. spriteforge-0.1.1/tests/test_references.py +127 -0
  277. spriteforge-0.1.1/tests/test_rewind.py +316 -0
  278. spriteforge-0.1.1/tests/test_router.py +290 -0
  279. spriteforge-0.1.1/tests/test_sounds.py +315 -0
  280. spriteforge-0.1.1/tests/test_studio.py +307 -0
  281. spriteforge-0.1.1/tests/test_studio_api.py +230 -0
  282. spriteforge-0.1.1/tests/test_team_reports.py +90 -0
  283. 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
+ ![Stormlight Keeper, a platformer SpriteForge built](https://raw.githubusercontent.com/reviver134/spriteforge/master/docs/media/stormlight-keeper.gif)
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
+ ![The studio: agents on the left, the run in the middle, costs on the right](https://raw.githubusercontent.com/reviver134/spriteforge/master/docs/media/studio.png)
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
+ | ![](https://raw.githubusercontent.com/reviver134/spriteforge/master/docs/media/stormlight-keeper-1.png) | **Stormlight Keeper**: climb a storm-battered lighthouse and relight its lamps before the ship hits the rocks | Side-scrolling platformer | 3 | $1.77 |
89
+ | ![](https://raw.githubusercontent.com/reviver134/spriteforge/master/docs/media/pale-shores-2.png) | **Pale Shores: Three-Isle Hold**: command small squads against Viking landings across three islands | Real-time island defence | 10 | $4.89 |
90
+ | ![](https://raw.githubusercontent.com/reviver134/spriteforge/master/docs/media/tiny-kingdom-defense-2.png) | **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`.