@auraindustry/aurajs 0.0.6 → 0.1.0

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 +103 -7
  2. package/benchmarks/perf-thresholds.json +54 -0
  3. package/package.json +4 -7
  4. package/src/asset-pack.mjs +5 -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 +4825 -1512
  17. package/src/commands/project-authoring.mjs +434 -0
  18. package/src/config.mjs +27 -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 +438 -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 +40 -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 +14 -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 +443 -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 +60 -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 +1187 -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,707 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
4
+ import { dirname, resolve } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+
7
+ export const SCHEMA_VERSION = 'aurajs.runtime-hotspot-audit.v1';
8
+ export const DEFAULT_HOTSPOT_BUDGETS = Object.freeze([
9
+ Object.freeze({
10
+ path: 'src/rust-host/src/renderer.rs',
11
+ owner: 'renderer-facade',
12
+ maxLines: 1200,
13
+ reason: 'top-level renderer should stay a thin facade over draw2d/draw3d/support modules and split test owners',
14
+ }),
15
+ Object.freeze({
16
+ path: 'src/rust-host/src/bindings.rs',
17
+ owner: 'bindings-installer-facade',
18
+ maxLines: 1500,
19
+ reason: 'bindings facade should stay a dispatcher over install, callback, support, and split test owner modules',
20
+ }),
21
+ Object.freeze({
22
+ path: 'src/rust-host/src/main.rs',
23
+ owner: 'entrypoint-crash-boundary',
24
+ maxLines: 1400,
25
+ reason: 'main.rs should stay focused on entrypoint and crash-boundary concerns',
26
+ }),
27
+ Object.freeze({
28
+ path: 'src/cli/test/conformance.test.mjs',
29
+ owner: 'conformance-aggregate-coordinator',
30
+ maxLines: 80,
31
+ reason: 'aggregate conformance coordinator should stay a pure importer over owned suites',
32
+ }),
33
+ Object.freeze({
34
+ path: 'src/cli/src/cli.mjs',
35
+ owner: 'cli-router-facade',
36
+ maxLines: 6500,
37
+ reason: 'cli.mjs should stay a thin dispatcher over command-family modules and shared argument parsing',
38
+ }),
39
+ Object.freeze({
40
+ path: 'src/cli/src/conformance.mjs',
41
+ owner: 'conformance-coordinator',
42
+ maxLines: 3400,
43
+ reason: 'conformance.mjs should stay focused on runner orchestration and defer large case catalogs to owned suites',
44
+ }),
45
+ Object.freeze({
46
+ path: 'src/cli/src/conformance/cases/app-and-ui-runtime-cases.mjs',
47
+ owner: 'conformance-app-and-ui-runtime-family',
48
+ maxLines: 3400,
49
+ reason: 'app and UI runtime conformance cases should stay isolated from other case families instead of regrowing the aggregate runner',
50
+ }),
51
+ Object.freeze({
52
+ path: 'src/cli/src/conformance/cases/core-runtime-cases.mjs',
53
+ owner: 'conformance-core-runtime-family',
54
+ maxLines: 1600,
55
+ reason: 'core runtime cases should stay in the owned core family instead of leaking back into the aggregate runner',
56
+ }),
57
+ Object.freeze({
58
+ path: 'src/cli/src/conformance/cases/scene3d-and-media-cases.mjs',
59
+ owner: 'conformance-scene3d-and-media-family',
60
+ maxLines: 2100,
61
+ reason: 'scene3d and media conformance cases should stay in their owned family catalog',
62
+ }),
63
+ Object.freeze({
64
+ path: 'src/cli/src/conformance/cases/systems-and-gameplay-cases.mjs',
65
+ owner: 'conformance-systems-and-gameplay-family',
66
+ maxLines: 1900,
67
+ reason: 'systems and gameplay conformance cases should stay in their owned family catalog',
68
+ }),
69
+ Object.freeze({
70
+ path: 'src/cli/src/headless-test.mjs',
71
+ owner: 'headless-runtime-entry',
72
+ maxLines: 1200,
73
+ reason: 'headless-test.mjs should stay a thin entry over owned runtime coordinator and helper modules',
74
+ }),
75
+ Object.freeze({
76
+ path: 'src/cli/src/headless-test/runtime-coordinator.mjs',
77
+ owner: 'headless-runtime-coordinator',
78
+ maxLines: 1700,
79
+ reason: 'runtime-coordinator should stay the only broad headless orchestration file instead of absorbing unrelated namespace factories again',
80
+ }),
81
+ Object.freeze({
82
+ path: 'src/cli/src/scaffold.mjs',
83
+ owner: 'scaffold-entry',
84
+ maxLines: 250,
85
+ reason: 'scaffold.mjs should stay a thin entry over owned scaffold config, layout, fs, and project-docs families',
86
+ }),
87
+ Object.freeze({
88
+ path: 'src/cli/src/build-contract.mjs',
89
+ owner: 'build-contract-entry',
90
+ maxLines: 250,
91
+ reason: 'build-contract.mjs should stay a thin entry over owned build-contract helper modules',
92
+ }),
93
+ Object.freeze({
94
+ path: 'src/cli/src/build-contract/web-templates.mjs',
95
+ owner: 'build-contract-web-template-family',
96
+ maxLines: 4300,
97
+ reason: 'web build templates are now the large owned contract family and should stay isolated from the build-contract entry facade',
98
+ }),
99
+ Object.freeze({
100
+ path: 'src/rust-host/src/bindings/tests_core.rs',
101
+ owner: 'bindings-test-corpus-dispatcher',
102
+ maxLines: 5000,
103
+ reason: 'bindings/tests_core.rs should stay a dispatcher over the owned bindings regression families instead of regrowing into the previous monolith',
104
+ }),
105
+ Object.freeze({
106
+ path: 'src/rust-host/src/gltf_import.rs',
107
+ owner: 'gltf-import-entry',
108
+ maxLines: 3400,
109
+ reason: 'gltf_import.rs should stay focused on entry and owned helper delegation instead of reabsorbing schema and buffer helpers',
110
+ }),
111
+ Object.freeze({
112
+ path: 'src/rust-host/src/mesh.rs',
113
+ owner: 'mesh-runtime-entry',
114
+ maxLines: 1900,
115
+ reason: 'mesh.rs should stay focused on mesh runtime ownership instead of reabsorbing import and generator helper families',
116
+ }),
117
+ Object.freeze({
118
+ path: 'src/rust-host/src/bindings_navmesh.rs',
119
+ owner: 'navmesh-binding-family',
120
+ maxLines: 1700,
121
+ reason: 'bindings_navmesh.rs should stay bounded now that parse, result, and follow helpers can live in sibling families',
122
+ }),
123
+ Object.freeze({
124
+ path: 'src/rust-host/src/audio.rs',
125
+ owner: 'audio-runtime-family',
126
+ maxLines: 1850,
127
+ reason: 'audio.rs should stay focused on audio runtime control after the observer and media helper split',
128
+ }),
129
+ Object.freeze({
130
+ path: 'src/rust-host/src/bindings_video.rs',
131
+ owner: 'video-binding-entry',
132
+ maxLines: 900,
133
+ reason: 'bindings_video.rs should stay a thin entry over the dedicated media presentation helper bootstrap',
134
+ }),
135
+ Object.freeze({
136
+ path: 'src/rust-host/src/bindings/install/ui.rs',
137
+ owner: 'ui-installer-entry',
138
+ maxLines: 80,
139
+ reason: 'bindings/install/ui.rs should stay a thin installer entry over the retained UI bootstrap family',
140
+ }),
141
+ Object.freeze({
142
+ path: 'src/rust-host/src/bindings/install/ui/bootstrap.rs',
143
+ owner: 'ui-retained-bootstrap-family',
144
+ maxLines: 3300,
145
+ reason: 'the retained UI bootstrap surface is now the large owned family and should not leak back into the installer entry',
146
+ }),
147
+ Object.freeze({
148
+ path: 'src/rust-host/src/renderer/draw2d.rs',
149
+ owner: 'draw2d-renderer-entry',
150
+ maxLines: 2800,
151
+ reason: 'renderer/draw2d.rs should stay focused on draw2d orchestration after pipeline extraction',
152
+ }),
153
+ Object.freeze({
154
+ path: 'src/rust-host/src/bindings/draw2d.rs',
155
+ owner: 'draw2d-binding-entry',
156
+ maxLines: 3600,
157
+ reason: 'bindings/draw2d.rs should stay focused on draw2d binding orchestration after runtime and compositor extraction',
158
+ }),
159
+ ]);
160
+ export const DEFAULT_REQUIRED_FILES = Object.freeze([
161
+ Object.freeze({
162
+ path: 'src/rust-host/src/renderer/draw2d.rs',
163
+ role: 'draw2d_owner_module',
164
+ }),
165
+ Object.freeze({
166
+ path: 'src/rust-host/src/renderer/draw3d.rs',
167
+ role: 'draw3d_owner_module',
168
+ }),
169
+ Object.freeze({
170
+ path: 'src/rust-host/src/bindings/draw3d.rs',
171
+ role: 'draw3d_binding_owner_module',
172
+ }),
173
+ Object.freeze({
174
+ path: 'src/rust-host/src/bindings/install.rs',
175
+ role: 'bindings_install_facade',
176
+ }),
177
+ Object.freeze({
178
+ path: 'src/rust-host/src/bindings/install/core.rs',
179
+ role: 'bindings_install_core_family',
180
+ }),
181
+ Object.freeze({
182
+ path: 'src/rust-host/src/bindings/install/ui.rs',
183
+ role: 'bindings_install_ui_family',
184
+ }),
185
+ Object.freeze({
186
+ path: 'src/rust-host/src/bindings/install/scene.rs',
187
+ role: 'bindings_install_scene_family',
188
+ }),
189
+ Object.freeze({
190
+ path: 'src/rust-host/src/bindings/value_support.rs',
191
+ role: 'bindings_value_support_owner_module',
192
+ }),
193
+ Object.freeze({
194
+ path: 'src/rust-host/src/bindings/callback_runtime_support.rs',
195
+ role: 'bindings_callback_runtime_support_owner_module',
196
+ }),
197
+ Object.freeze({
198
+ path: 'src/rust-host/src/bindings/test_support.rs',
199
+ role: 'bindings_test_support_owner_module',
200
+ }),
201
+ Object.freeze({
202
+ path: 'src/rust-host/src/bindings/input_support.rs',
203
+ role: 'bindings_input_window_support_owner_module',
204
+ }),
205
+ Object.freeze({
206
+ path: 'src/rust-host/src/bindings/window_input.rs',
207
+ role: 'bindings_window_input_bridge_owner_module',
208
+ }),
209
+ Object.freeze({
210
+ path: 'src/rust-host/src/bindings/audio_assets.rs',
211
+ role: 'bindings_audio_assets_bridge_owner_module',
212
+ }),
213
+ Object.freeze({
214
+ path: 'src/rust-host/src/bindings/physics_support.rs',
215
+ role: 'bindings_physics_support_owner_module',
216
+ }),
217
+ Object.freeze({
218
+ path: 'src/rust-host/src/bindings/utility_surface_support.rs',
219
+ role: 'bindings_utility_surface_owner_module',
220
+ }),
221
+ Object.freeze({
222
+ path: 'src/rust-host/src/host_runtime.rs',
223
+ role: 'host_bootstrap_owner_module',
224
+ }),
225
+ Object.freeze({
226
+ path: 'src/rust-host/src/host_runtime_callbacks.rs',
227
+ role: 'host_runtime_callback_owner_module',
228
+ }),
229
+ Object.freeze({
230
+ path: 'src/rust-host/src/runtime_bootstrap.rs',
231
+ role: 'runtime_bootstrap_owner_module',
232
+ }),
233
+ Object.freeze({
234
+ path: 'src/rust-host/src/runtime_launch_target.rs',
235
+ role: 'runtime_launch_target_owner_module',
236
+ }),
237
+ Object.freeze({
238
+ path: 'src/rust-host/src/runtime_host_commands.rs',
239
+ role: 'runtime_host_command_owner_module',
240
+ }),
241
+ Object.freeze({
242
+ path: 'src/rust-host/src/console_runtime.rs',
243
+ role: 'console_runtime_owner_module',
244
+ }),
245
+ Object.freeze({
246
+ path: 'src/rust-host/src/renderer/core.rs',
247
+ role: 'renderer_core_helper_module',
248
+ }),
249
+ Object.freeze({
250
+ path: 'src/rust-host/src/renderer/debug_draw.rs',
251
+ role: 'renderer_debug_draw_owner_module',
252
+ }),
253
+ Object.freeze({
254
+ path: 'src/rust-host/src/renderer/math.rs',
255
+ role: 'renderer_math_helper_module',
256
+ }),
257
+ Object.freeze({
258
+ path: 'src/rust-host/src/renderer/facade_support.rs',
259
+ role: 'renderer_facade_support_owner_module',
260
+ }),
261
+ Object.freeze({
262
+ path: 'src/rust-host/src/renderer/test_support.rs',
263
+ role: 'renderer_test_support_owner_module',
264
+ }),
265
+ Object.freeze({
266
+ path: 'src/rust-host/src/renderer/tests_core.rs',
267
+ role: 'renderer_core_test_owner_module',
268
+ }),
269
+ Object.freeze({
270
+ path: 'src/rust-host/src/renderer/tests_draw2d.rs',
271
+ role: 'renderer_draw2d_test_owner_module',
272
+ }),
273
+ Object.freeze({
274
+ path: 'src/rust-host/src/renderer/tests_scene_runtime.rs',
275
+ role: 'renderer_scene_runtime_test_owner_module',
276
+ }),
277
+ Object.freeze({
278
+ path: 'src/rust-host/src/renderer/tests_materials.rs',
279
+ role: 'renderer_material_test_owner_module',
280
+ }),
281
+ Object.freeze({
282
+ path: 'src/rust-host/src/renderer/draw2d_geometry.rs',
283
+ role: 'renderer_draw2d_geometry_owner_module',
284
+ }),
285
+ Object.freeze({
286
+ path: 'src/rust-host/src/renderer/passes.rs',
287
+ role: 'renderer_passes_owner_module',
288
+ }),
289
+ Object.freeze({
290
+ path: 'src/rust-host/src/renderer/passes/postfx.rs',
291
+ role: 'renderer_postfx_owner_module',
292
+ }),
293
+ Object.freeze({
294
+ path: 'src/rust-host/src/renderer/scene_submit.rs',
295
+ role: 'renderer_scene_submit_owner_module',
296
+ }),
297
+ Object.freeze({
298
+ path: 'src/rust-host/src/renderer/sprite_support.rs',
299
+ role: 'renderer_sprite_support_owner_module',
300
+ }),
301
+ Object.freeze({
302
+ path: 'src/rust-host/tests/main_runtime_surface_tests/mod.rs',
303
+ role: 'main_runtime_surface_test_owner',
304
+ }),
305
+ Object.freeze({
306
+ path: 'src/rust-host/tests/main_launch_target_tests/mod.rs',
307
+ role: 'main_launch_target_test_owner',
308
+ }),
309
+ Object.freeze({
310
+ path: 'src/rust-host/src/bindings/tests_core.rs',
311
+ role: 'bindings_core_test_owner_module',
312
+ }),
313
+ Object.freeze({
314
+ path: 'src/rust-host/src/bindings/tests_ui_layout.rs',
315
+ role: 'bindings_ui_layout_test_owner_module',
316
+ }),
317
+ Object.freeze({
318
+ path: 'src/rust-host/src/bindings/tests_ui_retained.rs',
319
+ role: 'bindings_ui_retained_test_owner_module',
320
+ }),
321
+ Object.freeze({
322
+ path: 'src/rust-host/src/bindings/tests_ui_widgets.rs',
323
+ role: 'bindings_ui_widgets_test_owner_module',
324
+ }),
325
+ Object.freeze({
326
+ path: 'src/rust-host/src/bindings/tests_draw2d.rs',
327
+ role: 'bindings_draw2d_test_owner_module',
328
+ }),
329
+ Object.freeze({
330
+ path: 'src/rust-host/src/bindings/tests_optional_modules.rs',
331
+ role: 'bindings_optional_module_test_owner_module',
332
+ }),
333
+ Object.freeze({
334
+ path: 'src/rust-host/tests/conformance_3d_internal/renderer_command_seam_tests.rs',
335
+ role: 'renderer_seam_proof',
336
+ }),
337
+ Object.freeze({
338
+ path: 'src/rust-host/tests/conformance_3d_internal/bindings_bridge_seam_tests.rs',
339
+ role: 'bindings_seam_proof',
340
+ }),
341
+ Object.freeze({
342
+ path: 'src/cli/test/conformance-bootstrap-seams.test.mjs',
343
+ role: 'bootstrap_seam_proof',
344
+ }),
345
+ Object.freeze({
346
+ path: 'src/cli/test/conformance-bindings-seams.test.mjs',
347
+ role: 'bindings_seam_metadata_proof',
348
+ }),
349
+ Object.freeze({
350
+ path: 'src/cli/test/conformance-renderer-seams.test.mjs',
351
+ role: 'renderer_seam_metadata_proof',
352
+ }),
353
+ Object.freeze({
354
+ path: 'src/cli/test/conformance-aggregate-defaults.test.mjs',
355
+ role: 'conformance_aggregate_defaults_owner_suite',
356
+ }),
357
+ Object.freeze({
358
+ path: 'src/cli/test/conformance-animation-runtime.test.mjs',
359
+ role: 'animation_conformance_family_suite',
360
+ }),
361
+ Object.freeze({
362
+ path: 'src/cli/test/conformance-scene-runtime.test.mjs',
363
+ role: 'scene_conformance_family_suite',
364
+ }),
365
+ Object.freeze({
366
+ path: 'src/cli/test/conformance-reporting.test.mjs',
367
+ role: 'reporting_conformance_family_suite',
368
+ }),
369
+ Object.freeze({
370
+ path: 'src/cli/src/scene-composition/index.mjs',
371
+ role: 'scene_composition_owner_module',
372
+ }),
373
+ Object.freeze({
374
+ path: 'src/cli/src/scene-composition/runtime.mjs',
375
+ role: 'scene_composition_runtime_owner_module',
376
+ }),
377
+ Object.freeze({
378
+ path: 'src/cli/src/prefabs/index.mjs',
379
+ role: 'prefab_authoring_owner_module',
380
+ }),
381
+ Object.freeze({
382
+ path: 'src/cli/src/prefabs/scene-serialization.mjs',
383
+ role: 'prefab_scene_serialization_owner_module',
384
+ }),
385
+ Object.freeze({
386
+ path: 'src/cli/test/scene-composition.test.mjs',
387
+ role: 'scene_composition_owner_suite',
388
+ }),
389
+ Object.freeze({
390
+ path: 'src/cli/test/prefab-serialization.test.mjs',
391
+ role: 'prefab_scene_serialization_owner_suite',
392
+ }),
393
+ Object.freeze({
394
+ path: 'src/cli/src/commands/project-authoring.mjs',
395
+ role: 'cli_project_authoring_owner_module',
396
+ }),
397
+ Object.freeze({
398
+ path: 'src/cli/src/conformance/cases/index.mjs',
399
+ role: 'conformance_case_catalog_index',
400
+ }),
401
+ Object.freeze({
402
+ path: 'src/cli/src/conformance/cases/app-and-ui-runtime-cases.mjs',
403
+ role: 'conformance_app_and_ui_runtime_owner_suite',
404
+ }),
405
+ Object.freeze({
406
+ path: 'src/cli/src/conformance/cases/core-runtime-cases.mjs',
407
+ role: 'conformance_core_runtime_owner_suite',
408
+ }),
409
+ Object.freeze({
410
+ path: 'src/cli/src/conformance/cases/scene3d-and-media-cases.mjs',
411
+ role: 'conformance_scene3d_and_media_owner_suite',
412
+ }),
413
+ Object.freeze({
414
+ path: 'src/cli/src/conformance/cases/systems-and-gameplay-cases.mjs',
415
+ role: 'conformance_systems_and_gameplay_owner_suite',
416
+ }),
417
+ Object.freeze({
418
+ path: 'src/cli/src/conformance/shared.mjs',
419
+ role: 'conformance_shared_helper_owner_module',
420
+ }),
421
+ Object.freeze({
422
+ path: 'src/cli/src/headless-test/runtime-coordinator.mjs',
423
+ role: 'headless_runtime_coordinator_owner_module',
424
+ }),
425
+ Object.freeze({
426
+ path: 'src/cli/src/headless-test/runtime-primitives.mjs',
427
+ role: 'headless_runtime_primitives_owner_module',
428
+ }),
429
+ Object.freeze({
430
+ path: 'src/cli/src/headless-test/runtime-world.mjs',
431
+ role: 'headless_runtime_world_owner_module',
432
+ }),
433
+ Object.freeze({
434
+ path: 'src/cli/src/headless-test/runtime-animation.mjs',
435
+ role: 'headless_runtime_animation_owner_module',
436
+ }),
437
+ Object.freeze({
438
+ path: 'src/cli/src/scaffold/project-docs.mjs',
439
+ role: 'scaffold_project_docs_owner_module',
440
+ }),
441
+ Object.freeze({
442
+ path: 'src/cli/src/build-contract/assets.mjs',
443
+ role: 'build_contract_assets_owner_module',
444
+ }),
445
+ Object.freeze({
446
+ path: 'src/cli/src/build-contract/capabilities.mjs',
447
+ role: 'build_contract_capabilities_owner_module',
448
+ }),
449
+ Object.freeze({
450
+ path: 'src/cli/src/build-contract/web-templates.mjs',
451
+ role: 'build_contract_web_templates_owner_module',
452
+ }),
453
+ Object.freeze({
454
+ path: 'src/rust-host/src/gltf_import/schema.rs',
455
+ role: 'gltf_import_schema_owner_module',
456
+ }),
457
+ Object.freeze({
458
+ path: 'src/rust-host/src/gltf_import/buffer.rs',
459
+ role: 'gltf_import_buffer_owner_module',
460
+ }),
461
+ Object.freeze({
462
+ path: 'src/rust-host/src/renderer/draw2d/pipelines.rs',
463
+ role: 'renderer_draw2d_pipeline_owner_module',
464
+ }),
465
+ Object.freeze({
466
+ path: 'src/rust-host/src/bindings/draw2d/runtime.rs',
467
+ role: 'bindings_draw2d_runtime_owner_module',
468
+ }),
469
+ Object.freeze({
470
+ path: 'src/rust-host/src/bindings/draw2d/compositor.rs',
471
+ role: 'bindings_draw2d_compositor_owner_module',
472
+ }),
473
+ Object.freeze({
474
+ path: 'src/rust-host/src/bindings/install/ui/bootstrap.rs',
475
+ role: 'bindings_install_ui_bootstrap_owner_module',
476
+ }),
477
+ Object.freeze({
478
+ path: 'src/rust-host/src/terrain_bindings/parsing.rs',
479
+ role: 'terrain_bindings_parse_owner_module',
480
+ }),
481
+ Object.freeze({
482
+ path: 'src/rust-host/src/terrain_splat/runtime.rs',
483
+ role: 'terrain_splat_runtime_owner_module',
484
+ }),
485
+ Object.freeze({
486
+ path: 'src/rust-host/src/terrain_vegetation/manager.rs',
487
+ role: 'terrain_vegetation_manager_owner_module',
488
+ }),
489
+ Object.freeze({
490
+ path: 'src/rust-host/src/bindings/multiplayer_events.rs',
491
+ role: 'bindings_multiplayer_event_owner_module',
492
+ }),
493
+ Object.freeze({
494
+ path: 'src/rust-host/src/bindings/multiplayer_v8.rs',
495
+ role: 'bindings_multiplayer_v8_owner_module',
496
+ }),
497
+ Object.freeze({
498
+ path: 'src/rust-host/src/bindings_video_presentation.rs',
499
+ role: 'bindings_video_presentation_owner_module',
500
+ }),
501
+ ]);
502
+
503
+ const DEFAULTS = Object.freeze({
504
+ projectRoot: '.',
505
+ reportPath: null,
506
+ markdownPath: null,
507
+ check: false,
508
+ json: false,
509
+ });
510
+
511
+ function countLines(text) {
512
+ if (!text) return 0;
513
+ return String(text).split(/\r?\n/).length;
514
+ }
515
+
516
+ export function parseArgs(argv = process.argv.slice(2)) {
517
+ const parsed = { ...DEFAULTS };
518
+
519
+ for (let i = 0; i < argv.length; i += 1) {
520
+ const token = argv[i];
521
+ if (token === '--project-root') {
522
+ parsed.projectRoot = argv[i + 1] || parsed.projectRoot;
523
+ i += 1;
524
+ continue;
525
+ }
526
+ if (token === '--report-path') {
527
+ parsed.reportPath = argv[i + 1] || parsed.reportPath;
528
+ i += 1;
529
+ continue;
530
+ }
531
+ if (token === '--markdown-path') {
532
+ parsed.markdownPath = argv[i + 1] || parsed.markdownPath;
533
+ i += 1;
534
+ continue;
535
+ }
536
+ if (token === '--check') {
537
+ parsed.check = true;
538
+ continue;
539
+ }
540
+ if (token === '--json') {
541
+ parsed.json = true;
542
+ continue;
543
+ }
544
+ throw new Error(`Unknown option: ${token}`);
545
+ }
546
+
547
+ return parsed;
548
+ }
549
+
550
+ export function evaluateRuntimeHotspotAudit({
551
+ projectRoot = '.',
552
+ hotspotBudgets = DEFAULT_HOTSPOT_BUDGETS,
553
+ requiredFiles = DEFAULT_REQUIRED_FILES,
554
+ } = {}) {
555
+ const auditedProjectRoot = resolve(projectRoot);
556
+
557
+ const hotspotFiles = hotspotBudgets.map((budget) => {
558
+ const absolutePath = resolve(auditedProjectRoot, budget.path);
559
+ const exists = existsSync(absolutePath);
560
+ const lineCount = exists ? countLines(readFileSync(absolutePath, 'utf8')) : null;
561
+ const withinBudget = exists && Number.isFinite(lineCount) && lineCount <= budget.maxLines;
562
+ return {
563
+ ...budget,
564
+ absolutePath,
565
+ exists,
566
+ lineCount,
567
+ deltaLines: Number.isFinite(lineCount) ? budget.maxLines - lineCount : null,
568
+ status: withinBudget ? 'pass' : 'fail',
569
+ reasonCode: !exists
570
+ ? 'hotspot_file_missing'
571
+ : (lineCount > budget.maxLines ? 'hotspot_budget_exceeded' : 'hotspot_within_budget'),
572
+ };
573
+ });
574
+
575
+ const seamFiles = requiredFiles.map((entry) => {
576
+ const absolutePath = resolve(auditedProjectRoot, entry.path);
577
+ const exists = existsSync(absolutePath);
578
+ return {
579
+ ...entry,
580
+ absolutePath,
581
+ exists,
582
+ status: exists ? 'pass' : 'fail',
583
+ reasonCode: exists ? 'required_owner_file_present' : 'required_owner_file_missing',
584
+ };
585
+ });
586
+
587
+ const failures = [];
588
+ for (const hotspot of hotspotFiles) {
589
+ if (hotspot.status === 'fail') {
590
+ failures.push({
591
+ code: hotspot.reasonCode,
592
+ path: hotspot.path,
593
+ owner: hotspot.owner,
594
+ maxLines: hotspot.maxLines,
595
+ lineCount: hotspot.lineCount,
596
+ });
597
+ }
598
+ }
599
+ for (const seamFile of seamFiles) {
600
+ if (seamFile.status === 'fail') {
601
+ failures.push({
602
+ code: seamFile.reasonCode,
603
+ path: seamFile.path,
604
+ role: seamFile.role,
605
+ });
606
+ }
607
+ }
608
+
609
+ const pass = failures.length === 0;
610
+ return {
611
+ schemaVersion: SCHEMA_VERSION,
612
+ reportType: 'runtime-hotspot-audit',
613
+ auditedProjectRoot,
614
+ pass,
615
+ fail: !pass,
616
+ status: pass ? 'pass' : 'fail',
617
+ reasonCode: pass ? 'runtime_hotspot_audit_pass' : (failures[0]?.code || 'runtime_hotspot_audit_failed'),
618
+ summary: {
619
+ budgetedHotspots: hotspotFiles.length,
620
+ hotspotsWithinBudget: hotspotFiles.filter((entry) => entry.status === 'pass').length,
621
+ requiredFiles: seamFiles.length,
622
+ requiredFilesPresent: seamFiles.filter((entry) => entry.status === 'pass').length,
623
+ failedHotspotPaths: hotspotFiles.filter((entry) => entry.status === 'fail').map((entry) => entry.path),
624
+ missingRequiredFiles: seamFiles.filter((entry) => entry.status === 'fail').map((entry) => entry.path),
625
+ },
626
+ hotspotFiles,
627
+ requiredFiles: seamFiles,
628
+ failures,
629
+ };
630
+ }
631
+
632
+ export function buildRuntimeHotspotAuditMarkdown(report) {
633
+ const lines = [
634
+ '# AuraJS Runtime Hotspot Audit',
635
+ '',
636
+ `- Schema: ${report.schemaVersion}`,
637
+ `- Status: ${report.status}`,
638
+ `- Reason code: ${report.reasonCode}`,
639
+ `- Audited project root: ${report.auditedProjectRoot}`,
640
+ '',
641
+ '## Hotspot budgets',
642
+ ];
643
+
644
+ for (const hotspot of report.hotspotFiles) {
645
+ lines.push(
646
+ `- ${hotspot.path}: ${hotspot.status.toUpperCase()} (${hotspot.lineCount ?? 'missing'} / ${hotspot.maxLines} lines, owner=${hotspot.owner})`,
647
+ ` - reason: ${hotspot.reason}`,
648
+ );
649
+ }
650
+
651
+ lines.push('', '## Required owner and seam files');
652
+ for (const seamFile of report.requiredFiles) {
653
+ lines.push(`- ${seamFile.path}: ${seamFile.status.toUpperCase()} (${seamFile.role})`);
654
+ }
655
+
656
+ lines.push('', `## Failures (${report.failures.length})`);
657
+ if (report.failures.length === 0) {
658
+ lines.push('- None');
659
+ } else {
660
+ for (const failure of report.failures) {
661
+ lines.push(`- ${failure.code}: ${failure.path}`);
662
+ }
663
+ }
664
+
665
+ return `${lines.join('\n')}\n`;
666
+ }
667
+
668
+ export function runRuntimeHotspotAudit(options = {}) {
669
+ const report = evaluateRuntimeHotspotAudit(options);
670
+
671
+ if (options.reportPath) {
672
+ const reportPath = resolve(options.projectRoot || '.', options.reportPath);
673
+ mkdirSync(dirname(reportPath), { recursive: true });
674
+ writeFileSync(reportPath, `${JSON.stringify(report, null, 2)}\n`, 'utf8');
675
+ }
676
+
677
+ if (options.markdownPath) {
678
+ const markdownPath = resolve(options.projectRoot || '.', options.markdownPath);
679
+ mkdirSync(dirname(markdownPath), { recursive: true });
680
+ writeFileSync(markdownPath, buildRuntimeHotspotAuditMarkdown(report), 'utf8');
681
+ }
682
+
683
+ return report;
684
+ }
685
+
686
+ export async function main(argv = process.argv.slice(2)) {
687
+ const args = parseArgs(argv);
688
+ const report = runRuntimeHotspotAudit(args);
689
+
690
+ if (!args.reportPath && !args.markdownPath) {
691
+ const output = args.json ? `${JSON.stringify(report, null, 2)}\n` : buildRuntimeHotspotAuditMarkdown(report);
692
+ process.stdout.write(output);
693
+ }
694
+
695
+ if (args.check && !report.pass) {
696
+ process.exitCode = 1;
697
+ }
698
+ }
699
+
700
+ const entryPath = process.argv[1] ? resolve(process.argv[1]) : null;
701
+ const currentPath = fileURLToPath(import.meta.url);
702
+ if (entryPath && currentPath === entryPath) {
703
+ main().catch((error) => {
704
+ console.error(error instanceof Error ? error.message : String(error));
705
+ process.exitCode = 1;
706
+ });
707
+ }