@auraindustry/aurajs 0.0.7 → 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.
Files changed (334) hide show
  1. package/README.md +98 -2
  2. package/benchmarks/perf-thresholds.json +54 -0
  3. package/package.json +4 -7
  4. package/src/asset-pack.mjs +8 -1
  5. package/src/authored-project.mjs +1449 -0
  6. package/src/authored-runtime.mjs +2016 -0
  7. package/src/authoring/avatar-animation-graph.mjs +648 -0
  8. package/src/bin-integrity.mjs +272 -0
  9. package/src/build-contract/assets.mjs +130 -0
  10. package/src/build-contract/capabilities.mjs +116 -0
  11. package/src/build-contract/constants.mjs +6 -0
  12. package/src/build-contract/helpers.mjs +44 -0
  13. package/src/build-contract/web-templates.mjs +5993 -0
  14. package/src/build-contract.mjs +27 -2910
  15. package/src/bundler.mjs +188 -55
  16. package/src/cli.mjs +4840 -1512
  17. package/src/commands/project-authoring.mjs +454 -0
  18. package/src/config.mjs +44 -0
  19. package/src/conformance/cases/app-and-ui-runtime-cases.mjs +3309 -0
  20. package/src/conformance/cases/core-runtime-cases.mjs +1431 -0
  21. package/src/conformance/cases/index.mjs +11 -0
  22. package/src/conformance/cases/scene3d-and-media-cases.mjs +2094 -0
  23. package/src/conformance/cases/systems-and-gameplay-cases.mjs +1776 -0
  24. package/src/conformance/shared.mjs +27 -0
  25. package/src/conformance-runner.mjs +25 -13
  26. package/src/conformance.mjs +619 -4020
  27. package/src/cutscene.mjs +362 -5
  28. package/src/dev-cli-action.mjs +249 -0
  29. package/src/dev-cli-inspect.mjs +92 -0
  30. package/src/dev-cli-state.mjs +80 -0
  31. package/src/external-asset-cache.mjs +587 -0
  32. package/src/external-asset-policy.mjs +217 -0
  33. package/src/external-package-surface.mjs +206 -0
  34. package/src/game-action-runtime.mjs +869 -0
  35. package/src/game-state-runtime.mjs +206 -6
  36. package/src/headless-action.mjs +186 -0
  37. package/src/headless-test/runtime-animation.mjs +1173 -0
  38. package/src/headless-test/runtime-coordinator.mjs +1514 -0
  39. package/src/headless-test/runtime-primitives.mjs +320 -0
  40. package/src/headless-test/runtime-world.mjs +2253 -0
  41. package/src/headless-test.mjs +392 -4298
  42. package/src/host-binary.mjs +342 -14
  43. package/src/icon-discovery.mjs +64 -0
  44. package/src/make-catalog.mjs +109 -0
  45. package/src/make.mjs +197 -0
  46. package/src/package-integrity.mjs +586 -0
  47. package/src/perf-benchmark.mjs +353 -0
  48. package/src/postinstall.mjs +5 -5
  49. package/src/prefabs/index.mjs +34 -0
  50. package/src/prefabs/scene-serialization.mjs +184 -0
  51. package/src/project-importer.mjs +620 -0
  52. package/src/project-registry.mjs +24 -0
  53. package/src/publish-command.mjs +195 -0
  54. package/src/publish-env-example.mjs +83 -0
  55. package/src/publish-validation.mjs +708 -0
  56. package/src/retro/assets/compile.mjs +232 -0
  57. package/src/retro/backend-gba/authoring.mjs +1029 -0
  58. package/src/retro/backend-gba/rom.mjs +363 -0
  59. package/src/retro/backend-gbc/rom.mjs +85 -0
  60. package/src/retro/build.mjs +278 -0
  61. package/src/retro/cli/commands.mjs +292 -0
  62. package/src/retro/cli/templates.mjs +84 -0
  63. package/src/retro/diagnostics/catalog.mjs +110 -0
  64. package/src/retro/diagnostics/emit.mjs +72 -0
  65. package/src/retro/emulator/case-overlay.mjs +64 -0
  66. package/src/retro/emulator/discovery.mjs +158 -0
  67. package/src/retro/emulator/macos-case-overlay.swift +220 -0
  68. package/src/retro/emulator/profiles.mjs +146 -0
  69. package/src/retro/emulator/runner.mjs +289 -0
  70. package/src/retro/frontend/load-project.mjs +98 -0
  71. package/src/retro/index.mjs +30 -0
  72. package/src/retro/ir/build-ir.mjs +108 -0
  73. package/src/retro/runtime-gba/contract.mjs +151 -0
  74. package/src/retro/runtime-gbc/contract.mjs +117 -0
  75. package/src/retro/shared/span.mjs +26 -0
  76. package/src/retro/shared/targets.mjs +64 -0
  77. package/src/retro/validator/check-project.mjs +114 -0
  78. package/src/runtime-hotspot-audit.mjs +707 -0
  79. package/src/scaffold/config.mjs +1000 -0
  80. package/src/scaffold/fs.mjs +56 -0
  81. package/src/scaffold/layout.mjs +318 -0
  82. package/src/scaffold/project-docs.mjs +439 -0
  83. package/src/scaffold.mjs +93 -596
  84. package/src/scene-composition/index.mjs +326 -0
  85. package/src/scene-composition/runtime.mjs +751 -0
  86. package/src/self-hosted-assets.mjs +604 -0
  87. package/src/session-client.mjs +750 -0
  88. package/src/session-native-launcher.mjs +74 -0
  89. package/src/session-protocol.mjs +75 -0
  90. package/src/session-runtime.mjs +321 -0
  91. package/src/session-server.mjs +360 -0
  92. package/src/shader-kits/index.mjs +773 -0
  93. package/src/starter-content-registry.mjs +292 -0
  94. package/src/state-artifacts.mjs +662 -24
  95. package/src/state-dev-reload.mjs +99 -2
  96. package/src/terminal-ui.mjs +245 -0
  97. package/src/web-conformance.mjs +219 -0
  98. package/templates/create/2d/config/gameplay/shooter.config.js +26 -0
  99. package/templates/create/2d/content/gameplay/waves.json +26 -0
  100. package/templates/create/2d/content/registries/.gitkeep +1 -0
  101. package/templates/create/2d/docs/design/.gitkeep +1 -0
  102. package/templates/create/2d/docs/design/loop.md +5 -0
  103. package/templates/create/2d/prefabs/enemies.prefab.js +90 -0
  104. package/templates/create/2d/prefabs/enemy-basic.prefab.js +18 -0
  105. package/templates/create/2d/prefabs/player.prefab.js +36 -0
  106. package/templates/create/2d/prefabs/projectiles.prefab.js +35 -0
  107. package/templates/create/2d/scenes/boot.scene.js +12 -0
  108. package/templates/create/2d/scenes/gameplay.scene.js +230 -0
  109. package/templates/create/2d/scenes/menu.scene.js +9 -0
  110. package/templates/create/2d/src/main.js +6 -185
  111. package/templates/create/2d/src/runtime/app.js +49 -0
  112. package/templates/create/2d/src/runtime/capabilities.js +35 -0
  113. package/templates/create/2d/ui/hud.screen.js +40 -0
  114. package/templates/create/2d/ui/pause.screen.js +149 -0
  115. package/templates/create/2d/ui/settings.screen.js +347 -0
  116. package/templates/create/2d/ui/title.screen.js +13 -0
  117. package/templates/create/2d-adventure/aura.config.json +28 -0
  118. package/templates/create/2d-adventure/config/gameplay/adventure.config.js +14 -0
  119. package/templates/create/2d-adventure/content/gameplay/world.js +46 -0
  120. package/templates/create/2d-adventure/content/registries/.gitkeep +1 -0
  121. package/templates/create/2d-adventure/docs/design/loop.md +5 -0
  122. package/templates/create/2d-adventure/prefabs/player.prefab.js +54 -0
  123. package/templates/create/2d-adventure/prefabs/relic.prefab.js +38 -0
  124. package/templates/create/2d-adventure/prefabs/world.prefab.js +125 -0
  125. package/templates/create/2d-adventure/scenes/gameplay.scene.js +256 -0
  126. package/templates/create/2d-adventure/src/runtime/capabilities.js +34 -0
  127. package/templates/create/2d-adventure/ui/hud.screen.js +60 -0
  128. package/templates/create/2d-survivor/config/gameplay/survivor.config.js +33 -0
  129. package/templates/create/2d-survivor/content/gameplay/spawn-zones.json +29 -0
  130. package/templates/create/2d-survivor/content/registries/.gitkeep +1 -0
  131. package/templates/create/2d-survivor/docs/design/.gitkeep +1 -0
  132. package/templates/create/2d-survivor/docs/design/loop.md +5 -0
  133. package/templates/create/2d-survivor/prefabs/enemies.prefab.js +178 -0
  134. package/templates/create/2d-survivor/prefabs/enemy-swarm.prefab.js +18 -0
  135. package/templates/create/2d-survivor/prefabs/player.prefab.js +42 -0
  136. package/templates/create/2d-survivor/prefabs/projectiles.prefab.js +56 -0
  137. package/templates/create/2d-survivor/scenes/boot.scene.js +12 -0
  138. package/templates/create/2d-survivor/scenes/gameplay.scene.js +314 -0
  139. package/templates/create/2d-survivor/scenes/menu.scene.js +9 -0
  140. package/templates/create/2d-survivor/src/main.js +5 -332
  141. package/templates/create/2d-survivor/src/runtime/app.js +49 -0
  142. package/templates/create/2d-survivor/src/runtime/capabilities.js +35 -0
  143. package/templates/create/2d-survivor/ui/hud.screen.js +45 -0
  144. package/templates/create/2d-survivor/ui/title.screen.js +13 -0
  145. package/templates/create/3d/assets/models/starter-avatar.gltf +184 -0
  146. package/templates/create/3d/config/gameplay/.gitkeep +1 -0
  147. package/templates/create/3d/content/gameplay/checkpoints.json +33 -0
  148. package/templates/create/3d/content/gameplay/course.js +40 -0
  149. package/templates/create/3d/content/registries/.gitkeep +1 -0
  150. package/templates/create/3d/docs/design/.gitkeep +1 -0
  151. package/templates/create/3d/docs/design/loop.md +5 -0
  152. package/templates/create/3d/prefabs/checkpoint.prefab.js +15 -0
  153. package/templates/create/3d/prefabs/player.prefab.js +204 -0
  154. package/templates/create/3d/prefabs/world.prefab.js +112 -0
  155. package/templates/create/3d/scenes/boot.scene.js +12 -0
  156. package/templates/create/3d/scenes/checkpoint.scene.js +9 -0
  157. package/templates/create/3d/scenes/gameplay.scene.js +292 -0
  158. package/templates/create/3d/src/main.js +6 -295
  159. package/templates/create/3d/src/runtime/app.js +49 -0
  160. package/templates/create/3d/src/runtime/capabilities.js +53 -0
  161. package/templates/create/3d/src/runtime/materials.js +34 -0
  162. package/templates/create/3d/src/runtime/state.js +39 -0
  163. package/templates/create/3d/ui/hud.screen.js +75 -0
  164. package/templates/create/3d/ui/pause.screen.js +166 -0
  165. package/templates/create/3d/ui/settings.screen.js +387 -0
  166. package/templates/create/3d-adventure/assets/models/starter-avatar.gltf +184 -0
  167. package/templates/create/3d-adventure/aura.config.json +28 -0
  168. package/templates/create/3d-adventure/config/gameplay/adventure.config.js +9 -0
  169. package/templates/create/3d-adventure/content/gameplay/course.js +62 -0
  170. package/templates/create/3d-adventure/content/registries/.gitkeep +1 -0
  171. package/templates/create/3d-adventure/docs/design/loop.md +5 -0
  172. package/templates/create/3d-adventure/prefabs/player.prefab.js +168 -0
  173. package/templates/create/3d-adventure/prefabs/relic.prefab.js +35 -0
  174. package/templates/create/3d-adventure/prefabs/world.prefab.js +119 -0
  175. package/templates/create/3d-adventure/scenes/gameplay.scene.js +358 -0
  176. package/templates/create/3d-adventure/src/runtime/capabilities.js +56 -0
  177. package/templates/create/3d-adventure/src/runtime/materials.js +39 -0
  178. package/templates/create/3d-adventure/src/runtime/state.js +31 -0
  179. package/templates/create/3d-adventure/ui/hud.screen.js +70 -0
  180. package/templates/create/3d-adventure/ui/pause.screen.js +437 -0
  181. package/templates/create/3d-collectathon/assets/models/starter-avatar.gltf +184 -0
  182. package/templates/create/3d-collectathon/config/gameplay/.gitkeep +1 -0
  183. package/templates/create/3d-collectathon/content/gameplay/collectibles.json +26 -0
  184. package/templates/create/3d-collectathon/content/gameplay/course.js +46 -0
  185. package/templates/create/3d-collectathon/content/registries/.gitkeep +1 -0
  186. package/templates/create/3d-collectathon/docs/design/.gitkeep +1 -0
  187. package/templates/create/3d-collectathon/docs/design/loop.md +5 -0
  188. package/templates/create/3d-collectathon/prefabs/collectible.prefab.js +15 -0
  189. package/templates/create/3d-collectathon/prefabs/player.prefab.js +207 -0
  190. package/templates/create/3d-collectathon/prefabs/world.prefab.js +112 -0
  191. package/templates/create/3d-collectathon/scenes/boot.scene.js +12 -0
  192. package/templates/create/3d-collectathon/scenes/checkpoint.scene.js +9 -0
  193. package/templates/create/3d-collectathon/scenes/gameplay.scene.js +200 -0
  194. package/templates/create/3d-collectathon/src/main.js +5 -355
  195. package/templates/create/3d-collectathon/src/runtime/app.js +49 -0
  196. package/templates/create/3d-collectathon/src/runtime/capabilities.js +53 -0
  197. package/templates/create/3d-collectathon/src/runtime/materials.js +34 -0
  198. package/templates/create/3d-collectathon/src/runtime/state.js +27 -0
  199. package/templates/create/3d-collectathon/ui/hud.screen.js +66 -0
  200. package/templates/create/3d-collectathon/ui/pause.screen.js +13 -0
  201. package/templates/create/blank/config/gameplay/.gitkeep +1 -0
  202. package/templates/create/blank/content/gameplay/.gitkeep +1 -0
  203. package/templates/create/blank/content/registries/.gitkeep +1 -0
  204. package/templates/create/blank/docs/design/.gitkeep +1 -0
  205. package/templates/create/blank/docs/design/loop.md +5 -0
  206. package/templates/create/blank/prefabs/.gitkeep +1 -0
  207. package/templates/create/blank/scenes/.gitkeep +1 -0
  208. package/templates/create/blank/src/runtime/.gitkeep +1 -0
  209. package/templates/create/blank/ui/.gitkeep +1 -0
  210. package/templates/create/deckbuilder-2d/assets/audio/.gitkeep +1 -0
  211. package/templates/create/deckbuilder-2d/assets/fonts/.gitkeep +1 -0
  212. package/templates/create/deckbuilder-2d/assets/sprites/.gitkeep +1 -0
  213. package/templates/create/deckbuilder-2d/assets/starter/README.md +11 -0
  214. package/templates/create/deckbuilder-2d/assets/ui/.gitkeep +1 -0
  215. package/templates/create/deckbuilder-2d/aura.config.json +28 -0
  216. package/templates/create/deckbuilder-2d/config/gameplay/deckbuilder.config.js +26 -0
  217. package/templates/create/deckbuilder-2d/content/cards/guard.card.js +19 -0
  218. package/templates/create/deckbuilder-2d/content/cards/spark.card.js +20 -0
  219. package/templates/create/deckbuilder-2d/content/cards/starter.deck.js +69 -0
  220. package/templates/create/deckbuilder-2d/content/cards/strike.card.js +19 -0
  221. package/templates/create/deckbuilder-2d/content/cards/survey.card.js +20 -0
  222. package/templates/create/deckbuilder-2d/content/encounters/training-battle.encounter.js +14 -0
  223. package/templates/create/deckbuilder-2d/content/encounters/training-battle.js +65 -0
  224. package/templates/create/deckbuilder-2d/content/enemies/training-automaton.enemy.js +48 -0
  225. package/templates/create/deckbuilder-2d/content/gameplay/.gitkeep +1 -0
  226. package/templates/create/deckbuilder-2d/content/registries/cards.registry.js +26 -0
  227. package/templates/create/deckbuilder-2d/content/registries/encounters.registry.js +20 -0
  228. package/templates/create/deckbuilder-2d/content/registries/enemies.registry.js +20 -0
  229. package/templates/create/deckbuilder-2d/content/registries/relics.registry.js +20 -0
  230. package/templates/create/deckbuilder-2d/content/relics/ember-charm.relic.js +18 -0
  231. package/templates/create/deckbuilder-2d/docs/design/loop.md +12 -0
  232. package/templates/create/deckbuilder-2d/prefabs/.gitkeep +1 -0
  233. package/templates/create/deckbuilder-2d/scenes/boot.scene.js +84 -0
  234. package/templates/create/deckbuilder-2d/scenes/gameplay.scene.js +641 -0
  235. package/templates/create/deckbuilder-2d/src/components/.gitkeep +1 -0
  236. package/templates/create/deckbuilder-2d/src/main.js +17 -0
  237. package/templates/create/deckbuilder-2d/src/runtime/capabilities.js +22 -0
  238. package/templates/create/deckbuilder-2d/src/shared/.gitkeep +1 -0
  239. package/templates/create/deckbuilder-2d/src/systems/.gitkeep +1 -0
  240. package/templates/create/deckbuilder-2d/tests/smoke/.gitkeep +1 -0
  241. package/templates/create/deckbuilder-2d/ui/hud.screen.js +80 -0
  242. package/templates/create/deckbuilder-2d/ui/pause.screen.js +146 -0
  243. package/templates/create/deckbuilder-2d/ui/settings.screen.js +342 -0
  244. package/templates/create/local-multiplayer/aura.config.json +41 -0
  245. package/templates/create/local-multiplayer/config/gameplay/local-multiplayer.config.js +26 -0
  246. package/templates/create/local-multiplayer/content/gameplay/room-layout.js +13 -0
  247. package/templates/create/local-multiplayer/content/registries/.gitkeep +1 -0
  248. package/templates/create/local-multiplayer/docs/design/loop.md +16 -0
  249. package/templates/create/local-multiplayer/prefabs/player.prefab.js +99 -0
  250. package/templates/create/local-multiplayer/scenes/boot.scene.js +12 -0
  251. package/templates/create/local-multiplayer/scenes/gameplay.scene.js +472 -0
  252. package/templates/create/local-multiplayer/src/main.js +17 -0
  253. package/templates/create/local-multiplayer/src/runtime/capabilities.js +28 -0
  254. package/templates/create/local-multiplayer/ui/hud.screen.js +65 -0
  255. package/templates/create/shared/src/runtime/project-inspector.js +105 -0
  256. package/templates/create/shared/src/runtime/scene-flow.js +290 -0
  257. package/templates/create/shared/src/runtime/screen-shell.js +222 -0
  258. package/templates/create/shared/src/runtime/ui-forms.js +209 -0
  259. package/templates/create/shared/src/runtime/ui-settings.js +237 -0
  260. package/templates/create/shared/src/runtime/ui-theme.js +352 -0
  261. package/templates/create/shared/src/starter-utils/adventure-objectives.js +102 -0
  262. package/templates/create/shared/src/starter-utils/animation-2d.js +337 -0
  263. package/templates/create/shared/src/starter-utils/avatar-3d.js +404 -0
  264. package/templates/create/shared/src/starter-utils/combat-feedback-2d.js +320 -0
  265. package/templates/create/shared/src/starter-utils/core.js +39 -3
  266. package/templates/create/shared/src/starter-utils/index.js +8 -2
  267. package/templates/create/shared/src/starter-utils/platformer-3d.js +34 -3
  268. package/templates/create/shared/src/starter-utils/triggers.js +662 -0
  269. package/templates/create/shared/src/starter-utils/tween-2d.js +615 -0
  270. package/templates/create/video-cutscene/assets/video/.gitkeep +0 -0
  271. package/templates/create/video-cutscene/aura.config.json +28 -0
  272. package/templates/create/video-cutscene/config/gameplay/.gitkeep +0 -0
  273. package/templates/create/video-cutscene/content/gameplay/.gitkeep +0 -0
  274. package/templates/create/video-cutscene/content/registries/.gitkeep +0 -0
  275. package/templates/create/video-cutscene/docs/design/loop.md +22 -0
  276. package/templates/create/video-cutscene/prefabs/.gitkeep +0 -0
  277. package/templates/create/video-cutscene/scenes/boot.scene.js +11 -0
  278. package/templates/create/video-cutscene/scenes/cutscene.scene.js +113 -0
  279. package/templates/create/video-cutscene/scenes/gameplay.scene.js +50 -0
  280. package/templates/create/video-cutscene/src/main.js +17 -0
  281. package/templates/create/video-cutscene/src/runtime/app.js +52 -0
  282. package/templates/create/video-cutscene/src/runtime/capabilities.js +35 -0
  283. package/templates/create/video-cutscene/src/runtime/state.js +13 -0
  284. package/templates/create/video-cutscene/ui/.gitkeep +0 -0
  285. package/templates/create-bin/play.js +1192 -0
  286. package/templates/make/README.md +46 -0
  287. package/templates/make/catalog.json +51 -0
  288. package/templates/make/component/files/{{MAKE_NAME}}.component.js +20 -0
  289. package/templates/make/component/manifest.json +9 -0
  290. package/templates/make/data/files/{{MAKE_NAME}}.json +14 -0
  291. package/templates/make/data/manifest.json +9 -0
  292. package/templates/make/material/files/{{MAKE_NAME}}.material.json +17 -0
  293. package/templates/make/material/manifest.json +9 -0
  294. package/templates/make/prefab/files/{{MAKE_NAME}}.prefab.js +20 -0
  295. package/templates/make/prefab/manifest.json +9 -0
  296. package/templates/make/scene/files/{{MAKE_NAME}}.scene.js +31 -0
  297. package/templates/make/scene/manifest.json +9 -0
  298. package/templates/make/shader/files/{{MAKE_NAME}}.shader.js +23 -0
  299. package/templates/make/shader/manifest.json +9 -0
  300. package/templates/make/system/files/{{MAKE_NAME}}.system.js +15 -0
  301. package/templates/make/system/manifest.json +9 -0
  302. package/templates/make/ui-screen/files/{{MAKE_NAME}}.screen.js +16 -0
  303. package/templates/make/ui-screen/files/{{MAKE_NAME}}.screen.json +23 -0
  304. package/templates/make/ui-screen/manifest.json +10 -0
  305. package/templates/make-starters/deckbuilder-2d/card/files/{{MAKE_NAME}}.card.js +22 -0
  306. package/templates/make-starters/deckbuilder-2d/card/manifest.json +9 -0
  307. package/templates/make-starters/deckbuilder-2d/catalog.json +34 -0
  308. package/templates/make-starters/deckbuilder-2d/encounter/files/{{MAKE_NAME}}.encounter.js +18 -0
  309. package/templates/make-starters/deckbuilder-2d/encounter/manifest.json +9 -0
  310. package/templates/make-starters/deckbuilder-2d/enemy/files/{{MAKE_NAME}}.enemy.js +28 -0
  311. package/templates/make-starters/deckbuilder-2d/enemy/manifest.json +9 -0
  312. package/templates/make-starters/deckbuilder-2d/relic/files/{{MAKE_NAME}}.relic.js +23 -0
  313. package/templates/make-starters/deckbuilder-2d/relic/manifest.json +9 -0
  314. package/templates/retro/platformer/README.md +10 -0
  315. package/templates/retro/platformer/assets/retro/assets.json +91 -0
  316. package/templates/retro/platformer/aura.config.json +7 -0
  317. package/templates/retro/platformer/package.json +5 -0
  318. package/templates/retro/platformer/src/main.js +40 -0
  319. package/templates/retro/puzzle-grid/README.md +10 -0
  320. package/templates/retro/puzzle-grid/assets/retro/assets.json +90 -0
  321. package/templates/retro/puzzle-grid/aura.config.json +7 -0
  322. package/templates/retro/puzzle-grid/package.json +5 -0
  323. package/templates/retro/puzzle-grid/src/main.js +29 -0
  324. package/templates/retro/tactics-grid/README.md +10 -0
  325. package/templates/retro/tactics-grid/assets/retro/assets.json +90 -0
  326. package/templates/retro/tactics-grid/aura.config.json +7 -0
  327. package/templates/retro/tactics-grid/package.json +5 -0
  328. package/templates/retro/tactics-grid/src/main.js +35 -0
  329. package/templates/retro/topdown-adventure/README.md +10 -0
  330. package/templates/retro/topdown-adventure/assets/retro/assets.json +95 -0
  331. package/templates/retro/topdown-adventure/aura.config.json +7 -0
  332. package/templates/retro/topdown-adventure/package.json +5 -0
  333. package/templates/retro/topdown-adventure/src/main.js +29 -0
  334. package/templates/skills/aurajs/SKILL.md +61 -5
@@ -0,0 +1,454 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { resolve } from 'node:path';
3
+
4
+ import {
5
+ scaffold,
6
+ scaffoldGame,
7
+ listCreateTemplates,
8
+ listCreateTemplateAliasHints,
9
+ normalizeCreateTemplate,
10
+ } from '../scaffold.mjs';
11
+ import { importThreeJsProject, parseFromArgs } from '../project-importer.mjs';
12
+ import { generateProjectFiles, listMakeKinds, listProjectMakeCatalog, listProjectMakeKinds } from '../make.mjs';
13
+ import {
14
+ CANONICAL_PREFAB_ROLES,
15
+ runProjectCheck,
16
+ runProjectExplain,
17
+ } from '../authored-project.mjs';
18
+ import {
19
+ canPromptInteractively,
20
+ printBanner,
21
+ printSection,
22
+ promptInput,
23
+ promptSelect,
24
+ } from '../terminal-ui.mjs';
25
+
26
+ export const CREATE_TEMPLATE_OPTION_LIST = listCreateTemplates().join('|');
27
+ export const CREATE_TEMPLATE_ALIAS_HINT_LIST = listCreateTemplateAliasHints().join(', ');
28
+ export const CREATE_USAGE = `aura create <name> [--template <${CREATE_TEMPLATE_OPTION_LIST}>] [--skip-install]`;
29
+ export const FROM_USAGE = 'aura from <source-path> --source threejs [--out <path>] [--name <name>] [--scene <path>] [--skip-install]';
30
+ export const MAKE_KIND_OPTION_LIST = listMakeKinds().join('|');
31
+ export const PREFAB_ROLE_OPTION_LIST = CANONICAL_PREFAB_ROLES.join('|');
32
+ export const MAKE_USAGE = `aura make <${MAKE_KIND_OPTION_LIST}> <name> [--role <${PREFAB_ROLE_OPTION_LIST}>]`;
33
+ export const MAKE_SUPPORTED_KINDS_HELP_TEXT = listMakeKinds().join(', ');
34
+
35
+ function raiseCliError(errorHandler, message) {
36
+ if (typeof errorHandler === 'function') {
37
+ errorHandler(message);
38
+ return;
39
+ }
40
+ throw new Error(message);
41
+ }
42
+
43
+ function handleProjectAuthoringError(errorHandler, err) {
44
+ raiseCliError(errorHandler, err instanceof Error ? err.message : String(err));
45
+ }
46
+
47
+ export function parseCreateArgs(args) {
48
+ const allowedTemplates = new Set(listCreateTemplates());
49
+ let name = null;
50
+ let template = '2d-adventure';
51
+ let skipInstall = false;
52
+
53
+ for (let i = 0; i < args.length; i += 1) {
54
+ const arg = args[i];
55
+ if (arg === '--template') {
56
+ if (!args[i + 1]) {
57
+ throw new Error('Missing value for --template.');
58
+ }
59
+ template = String(args[i + 1]).toLowerCase();
60
+ i += 1;
61
+ continue;
62
+ }
63
+ if (arg.startsWith('--template=')) {
64
+ template = arg.slice('--template='.length).toLowerCase();
65
+ continue;
66
+ }
67
+ if (arg === '--skip-install' || arg === '--no-install') {
68
+ skipInstall = true;
69
+ continue;
70
+ }
71
+ if (arg.startsWith('--')) {
72
+ throw new Error(`Unknown option for create: ${arg}`);
73
+ }
74
+ if (name !== null) {
75
+ throw new Error(`Unexpected extra argument "${arg}". Usage: ${CREATE_USAGE}`);
76
+ }
77
+ name = arg;
78
+ }
79
+
80
+ const normalizedTemplate = normalizeCreateTemplate(template);
81
+ if (!normalizedTemplate || !allowedTemplates.has(normalizedTemplate)) {
82
+ throw new Error(`Invalid --template "${template}". Supported templates: ${[...allowedTemplates].join(', ')} (aliases: ${CREATE_TEMPLATE_ALIAS_HINT_LIST}).`);
83
+ }
84
+
85
+ return { name, template: normalizedTemplate, skipInstall };
86
+ }
87
+
88
+ export function parseMakeArgs(args, { cwd = process.cwd() } = {}) {
89
+ let allowedKinds = null;
90
+ try {
91
+ allowedKinds = new Set(listProjectMakeKinds({ cwd }));
92
+ } catch {
93
+ allowedKinds = new Set(listMakeKinds());
94
+ }
95
+ let kind = null;
96
+ let name = null;
97
+ let role = null;
98
+
99
+ for (let i = 0; i < args.length; i += 1) {
100
+ const arg = args[i];
101
+ if (arg === '--role') {
102
+ const value = args[i + 1];
103
+ if (!value || value.startsWith('--')) {
104
+ throw new Error(`Missing value for --role. Usage: ${MAKE_USAGE}`);
105
+ }
106
+ role = value;
107
+ i += 1;
108
+ continue;
109
+ }
110
+ if (arg.startsWith('--role=')) {
111
+ role = arg.slice('--role='.length);
112
+ continue;
113
+ }
114
+ if (arg.startsWith('--')) {
115
+ throw new Error(`Unknown option for make: ${arg}`);
116
+ }
117
+ if (kind === null) {
118
+ kind = arg;
119
+ continue;
120
+ }
121
+ if (name === null) {
122
+ name = arg;
123
+ continue;
124
+ }
125
+ throw new Error(`Unexpected extra argument "${arg}". Usage: ${MAKE_USAGE}`);
126
+ }
127
+
128
+ if (!kind) {
129
+ throw new Error(`Missing file kind. Usage: ${MAKE_USAGE}`);
130
+ }
131
+ if (!allowedKinds.has(kind)) {
132
+ throw new Error(`Invalid make kind "${kind}". Supported kinds: ${[...allowedKinds].join(', ')}.`);
133
+ }
134
+ if (!name) {
135
+ throw new Error(`Missing file name. Usage: ${MAKE_USAGE}`);
136
+ }
137
+ if (role !== null && kind !== 'prefab') {
138
+ throw new Error('`--role` is only supported for `aura make prefab`.');
139
+ }
140
+
141
+ return { kind, name, role };
142
+ }
143
+
144
+ function toMakeKindLabel(entry) {
145
+ const baseLabel = String(entry?.id || '')
146
+ .split('-')
147
+ .filter(Boolean)
148
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
149
+ .join(' ');
150
+ if (entry?.owner === 'core') {
151
+ return baseLabel;
152
+ }
153
+ return `${baseLabel} [${entry.owner}]`;
154
+ }
155
+
156
+ export async function promptForMakeArgs({
157
+ cwd = process.cwd(),
158
+ catalogRoot = null,
159
+ promptSelectImpl = promptSelect,
160
+ promptInputImpl = promptInput,
161
+ printBannerImpl = printBanner,
162
+ printSectionImpl = printSection,
163
+ } = {}) {
164
+ const catalog = listProjectMakeCatalog({ cwd, catalogRoot });
165
+ if (!Array.isArray(catalog) || catalog.length === 0) {
166
+ throw new Error('No make kinds are available for the current AuraJS project.');
167
+ }
168
+
169
+ const defaultKind = catalog.some((entry) => entry.id === 'scene')
170
+ ? 'scene'
171
+ : catalog[0].id;
172
+
173
+ printBannerImpl('MAKE');
174
+ printSectionImpl('AuraJS Make', 'Choose what to generate in the current project.');
175
+
176
+ const kind = await promptSelectImpl(
177
+ ' What do you want to make?',
178
+ catalog.map((entry) => ({
179
+ value: entry.id,
180
+ label: toMakeKindLabel(entry),
181
+ })),
182
+ defaultKind,
183
+ );
184
+
185
+ let name = '';
186
+ while (!name) {
187
+ name = await promptInputImpl(' What should it be called');
188
+ if (!name) {
189
+ console.log(' Name is required.');
190
+ }
191
+ }
192
+
193
+ return parseMakeArgs([kind, name], { cwd });
194
+ }
195
+
196
+ export function parseSimpleJsonFlag(args, commandName) {
197
+ let json = false;
198
+ for (const arg of args) {
199
+ if (arg === '--json') {
200
+ json = true;
201
+ continue;
202
+ }
203
+ if (arg.startsWith('--')) {
204
+ throw new Error(`Unknown option for ${commandName}: ${arg}`);
205
+ }
206
+ throw new Error(`Unexpected extra argument "${arg}". Usage: aura ${commandName} [--json]`);
207
+ }
208
+ return { json };
209
+ }
210
+
211
+ export async function cmdInit(args, { error } = {}) {
212
+ const name = args[0];
213
+ if (!name) {
214
+ raiseCliError(error, 'Missing project name. Usage: aura init <name>');
215
+ }
216
+
217
+ if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
218
+ raiseCliError(error, 'Project name must contain only letters, numbers, hyphens, and underscores.');
219
+ }
220
+
221
+ const dest = resolve(process.cwd(), name);
222
+
223
+ try {
224
+ printBanner('CREATE');
225
+ printSection('AuraJS Create', `Scaffolding ${name}...`);
226
+ const result = scaffold(name, dest);
227
+ console.log(`\n Created "${name}" at ${dest}`);
228
+ console.log('');
229
+ for (const file of result.files) {
230
+ console.log(` ${file}`);
231
+ }
232
+ console.log('');
233
+ console.log(' Get started:');
234
+ console.log(` cd ${name}`);
235
+ console.log(' aura dev');
236
+ console.log('');
237
+ console.log(' Docs:');
238
+ console.log(' https://www.aurajs.gg/docs');
239
+ console.log('');
240
+ console.log(' Agent skills:');
241
+ console.log(' cd <your-codebase>');
242
+ console.log(' npx -y skills add Aura-Industry/auramaxx');
243
+ console.log('');
244
+ } catch (err) {
245
+ handleProjectAuthoringError(error, err);
246
+ }
247
+ }
248
+
249
+ export async function cmdCreate(args, { error } = {}) {
250
+ const parsed = parseCreateArgs(args);
251
+ if (!parsed.name) {
252
+ raiseCliError(error, `Missing project name. Usage: ${CREATE_USAGE}`);
253
+ }
254
+
255
+ const name = parsed.name;
256
+ if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
257
+ raiseCliError(error, 'Project name must contain only letters, numbers, hyphens, and underscores.');
258
+ }
259
+
260
+ const dest = resolve(process.cwd(), name);
261
+
262
+ try {
263
+ printBanner('CREATE');
264
+ printSection('AuraJS Create', `Scaffolding ${name}...`);
265
+ const result = scaffoldGame({
266
+ name,
267
+ dest,
268
+ template: parsed.template,
269
+ });
270
+
271
+ console.log(`\n Created "${name}" at ${dest}`);
272
+ console.log(` Template: ${result.template}`);
273
+ console.log('');
274
+ for (const file of result.files) {
275
+ console.log(` ${file}`);
276
+ }
277
+ console.log('');
278
+
279
+ if (parsed.skipInstall) {
280
+ console.log(' Skipped npm install (--skip-install).');
281
+ console.log('');
282
+ } else {
283
+ console.log(' Installing dependencies...');
284
+ const install = spawnSync('npm', ['install'], {
285
+ cwd: dest,
286
+ stdio: 'inherit',
287
+ });
288
+ if (install.error || install.status !== 0) {
289
+ console.log(' npm install did not complete successfully. Run it manually in the project directory.');
290
+ }
291
+ console.log('');
292
+ }
293
+
294
+ console.log(' Get started:');
295
+ console.log(` cd ${name}`);
296
+ if (result.runtimeFamily === 'retro') {
297
+ console.log(' npm run retro:check');
298
+ console.log(' npm run build:gbc');
299
+ } else {
300
+ console.log(' npm run dev');
301
+ console.log('');
302
+ console.log(' Optional packaged local run:');
303
+ console.log(' npm run play');
304
+ }
305
+ console.log('');
306
+ console.log(' Docs:');
307
+ console.log(' https://www.aurajs.gg/docs');
308
+ console.log('');
309
+ console.log(' Agent skills:');
310
+ console.log(' cd <your-codebase>');
311
+ console.log(' npx -y skills add Aura-Industry/auramaxx');
312
+ console.log('');
313
+ } catch (err) {
314
+ handleProjectAuthoringError(error, err);
315
+ }
316
+ }
317
+
318
+ export async function cmdFrom(args, { error } = {}) {
319
+ let parsed;
320
+ try {
321
+ parsed = parseFromArgs(args);
322
+ } catch (err) {
323
+ raiseCliError(error, err instanceof Error ? err.message : String(err));
324
+ return;
325
+ }
326
+
327
+ try {
328
+ const result = importThreeJsProject({
329
+ sourceRoot: parsed.sourcePath,
330
+ outputPath: parsed.outputPath,
331
+ projectName: parsed.projectName,
332
+ scenePath: parsed.scenePath,
333
+ });
334
+
335
+ console.log(`\n Imported "${parsed.sourcePath}" into ${result.outputRoot}`);
336
+ console.log(' Source type: threejs');
337
+ console.log(` Project name: ${result.projectName}`);
338
+ if (result.report.sceneImport.outputScenePath) {
339
+ console.log(` Scene: ${result.report.sceneImport.outputScenePath}`);
340
+ } else {
341
+ console.log(' Scene: none detected');
342
+ }
343
+ console.log(` Report: ${result.reportPath}`);
344
+ console.log('');
345
+
346
+ if (parsed.skipInstall) {
347
+ console.log(' Skipped npm install (--skip-install).');
348
+ console.log('');
349
+ } else {
350
+ console.log(' Installing dependencies...');
351
+ const install = spawnSync('npm', ['install'], {
352
+ cwd: result.outputRoot,
353
+ stdio: 'inherit',
354
+ });
355
+ if (install.error || install.status !== 0) {
356
+ console.log(' npm install did not complete successfully. Run it manually in the generated project directory.');
357
+ }
358
+ console.log('');
359
+ }
360
+
361
+ console.log(' Next:');
362
+ console.log(` cd ${result.outputRoot}`);
363
+ console.log(' npm run dev');
364
+ console.log('');
365
+ } catch (err) {
366
+ handleProjectAuthoringError(error, err);
367
+ }
368
+ }
369
+
370
+ export async function cmdMake(args, { error } = {}) {
371
+ try {
372
+ if (args[0] === 'list') {
373
+ const parsed = parseSimpleJsonFlag(args.slice(1), 'make list');
374
+ const catalog = listProjectMakeCatalog({ cwd: process.cwd() });
375
+ if (parsed.json) {
376
+ process.stdout.write(`${JSON.stringify({
377
+ schema: 'aurajs.make-catalog.v1',
378
+ projectRoot: process.cwd(),
379
+ kinds: catalog.map((entry) => ({
380
+ id: entry.id,
381
+ owner: entry.owner,
382
+ scope: entry.scope,
383
+ })),
384
+ }, null, 2)}\n`);
385
+ return;
386
+ }
387
+ console.log('');
388
+ console.log(' Available make kinds');
389
+ console.log('');
390
+ for (const entry of catalog) {
391
+ const ownerLabel = entry.owner === 'core' ? 'core' : entry.owner;
392
+ console.log(` ${entry.id} [${ownerLabel}]`);
393
+ }
394
+ console.log('');
395
+ return;
396
+ }
397
+ const parsed = args.length === 0 && canPromptInteractively()
398
+ ? await promptForMakeArgs({ cwd: process.cwd() })
399
+ : parseMakeArgs(args, { cwd: process.cwd() });
400
+ const result = await generateProjectFiles({
401
+ cwd: process.cwd(),
402
+ kind: parsed.kind,
403
+ name: parsed.name,
404
+ role: parsed.role,
405
+ });
406
+
407
+ console.log('');
408
+ console.log(` Created ${result.kind} "${result.title}"`);
409
+ console.log('');
410
+ for (const file of result.files) {
411
+ console.log(` ${file}`);
412
+ }
413
+ if (result.registration?.changed) {
414
+ console.log('');
415
+ console.log(' Updated authored registry');
416
+ console.log('');
417
+ console.log(` ${result.registration.registryPath}`);
418
+ console.log(` ${result.registration.sceneRegistryPath}`);
419
+ }
420
+ console.log('');
421
+ } catch (err) {
422
+ handleProjectAuthoringError(error, err);
423
+ }
424
+ }
425
+
426
+ export async function cmdExplain(args, { error } = {}) {
427
+ try {
428
+ const parsed = parseSimpleJsonFlag(args, 'explain');
429
+ const result = await runProjectExplain({
430
+ projectRoot: process.cwd(),
431
+ json: parsed.json,
432
+ });
433
+ process.stdout.write(result.text);
434
+ } catch (err) {
435
+ handleProjectAuthoringError(error, err);
436
+ }
437
+ }
438
+
439
+ export async function cmdCheck(args, { error } = {}) {
440
+ try {
441
+ const parsed = parseSimpleJsonFlag(args, 'check');
442
+ const result = await runProjectCheck({
443
+ projectRoot: process.cwd(),
444
+ json: parsed.json,
445
+ });
446
+ const writer = result.exitCode === 0 ? process.stdout : process.stderr;
447
+ writer.write(result.text);
448
+ if (result.exitCode !== 0) {
449
+ process.exit(result.exitCode);
450
+ }
451
+ } catch (err) {
452
+ handleProjectAuthoringError(error, err);
453
+ }
454
+ }
package/src/config.mjs CHANGED
@@ -168,6 +168,18 @@ const SCHEMA = {
168
168
  multiplayer: { type: 'boolean', default: false },
169
169
  steam: { type: 'boolean', default: false },
170
170
  },
171
+ multiplayer: {
172
+ roomCode: { type: 'string', default: null, validate: multiplayerRoomCode },
173
+ roomName: { type: 'string', default: null, validate: nonEmptyString },
174
+ mode: { type: 'enum', default: 'local', values: ['local', 'auto', 'internet', 'relay'] },
175
+ relay: { type: 'string', default: null, validate: nonEmptyString },
176
+ coordinatorUrl: { type: 'string', default: null, validate: nonEmptyString },
177
+ relayUrl: { type: 'string', default: null, validate: nonEmptyString },
178
+ launcherBaseUrl: { type: 'string', default: null, validate: absoluteHttpUrl },
179
+ showDiagnostics: { type: 'boolean', default: false },
180
+ chatEnabled: { type: 'boolean', default: false },
181
+ chatHistoryLimit: { type: 'number', default: 6, validate: positiveInteger },
182
+ },
171
183
  };
172
184
 
173
185
  // ---------------------------------------------------------------------------
@@ -215,6 +227,38 @@ function relativeAssetLikePath(value, path) {
215
227
  return null;
216
228
  }
217
229
 
230
+ function nonEmptyString(value, path) {
231
+ const normalized = String(value || '').trim();
232
+ if (normalized.length === 0) {
233
+ return `${path} must be a non-empty string`;
234
+ }
235
+ return null;
236
+ }
237
+
238
+ function absoluteHttpUrl(value, path) {
239
+ const normalized = String(value || '').trim();
240
+ if (normalized.length === 0) {
241
+ return `${path} must be a non-empty string`;
242
+ }
243
+ try {
244
+ const parsed = new URL(normalized);
245
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
246
+ return `${path} must use http:// or https://, got: ${JSON.stringify(value)}`;
247
+ }
248
+ return null;
249
+ } catch {
250
+ return `${path} must be an absolute http:// or https:// URL, got: ${JSON.stringify(value)}`;
251
+ }
252
+ }
253
+
254
+ function multiplayerRoomCode(value, path) {
255
+ const normalized = String(value || '').trim();
256
+ if (!/^[A-Za-z0-9]{4,8}$/.test(normalized)) {
257
+ return `${path} must be 4-8 letters or digits, got: ${JSON.stringify(value)}`;
258
+ }
259
+ return null;
260
+ }
261
+
218
262
  // ---------------------------------------------------------------------------
219
263
  // Core validation + defaults
220
264
  // ---------------------------------------------------------------------------