From 45ea3c4528b956221e4d080082d0b5a5d6dcfd6f Mon Sep 17 00:00:00 2001 From: Alfa Team Date: Sun, 28 Jun 2026 17:54:38 -0400 Subject: [PATCH] Move browser application into www --- .../PROJECT_INSTRUCTIONS.md | 2 +- .../PROJECT_INSTRUCTIONS_VERSION.md | 3 +- .../ProjectInstructions/PROJECT_STATE.md | 25 ++---- .../backlog/BACKLOG_MASTER.md | 6 +- .../canonical_repository_structure.md | 45 ++++------- .../repository_layout_architecture_plan.md | 19 +++-- .../repository/www_migration_map.md | 28 ++++--- ...-move-www-application_branch-validation.md | 26 +++++++ ...www-application_manual-validation-notes.md | 24 ++++++ ...0_OWNER_008-move-www-application_report.md | 59 ++++++++++++++ ...e-www-application_requirement-checklist.md | 27 +++++++ ...-move-www-application_validation-report.md | 43 +++++++++++ dev/reports/codex_changed_files.txt | Bin 1140 -> 46382 bytes dev/reports/codex_review.diff | Bin 50162 -> 399040 bytes dev/scripts/validate-active-tools-surface.mjs | 20 ++--- dev/scripts/validate-browser-env-agnostic.mjs | 72 +++++++++--------- ...alidate-canonical-repository-structure.mjs | 56 +++++++------- dev/scripts/validate-tool-registry.mjs | 4 +- .../dev-runtime/AdminNotesBoundary.test.mjs | 6 +- ...hitectureCleanupApiNavInvitations.test.mjs | 4 +- ...ductDataProviderContractHardening.test.mjs | 16 ++-- .../StaticWebRootCompatibility.test.mjs | 19 ++--- .../tools/SpritesToolShell.spec.mjs | 4 +- .../tools/StaticWebRootCompatibility.spec.mjs | 20 +++-- .../ToolDisplayModeSingleLineSummary.spec.mjs | 4 +- .../tools/ToolImageRegistry.spec.mjs | 4 +- .../tools/ToolNavigationPrevNext.spec.mjs | 4 +- ...rkspaceToolRegistrationValidation.test.mjs | 6 +- .../tools/ToolContractCoverage.test.mjs | 4 +- .../NoHiddenToolCouplingValidation.test.mjs | 4 +- .../ObjectVectorFinalRuntimeCleanup.test.mjs | 4 +- .../tools/RequiredToolsBaseline.test.mjs | 4 +- src/dev-runtime/admin/admin-notes-menu.mjs | 2 +- src/dev-runtime/server/static-web-root.mjs | 8 +- src/shared/toolbox/assetUsageIntegration.js | 2 +- src/shared/toolbox/platformShell.js | 2 +- src/shared/toolbox/projectSystem.js | 2 +- src/shared/toolbox/toolHostManifest.js | 2 +- src/shared/toolbox/toolLaunchSSoTData.js | 2 +- www/.gitkeep | 1 - {account => www/account}/achievements.html | 0 {account => www/account}/ai-credits.html | 0 {account => www/account}/create-account.html | 0 {account => www/account}/index.html | 0 {account => www/account}/lost-password.html | 0 {account => www/account}/password-reset.html | 0 {account => www/account}/preferences.html | 0 {account => www/account}/profile.html | 0 {account => www/account}/security.html | 0 {account => www/account}/sign-in.html | 0 .../account}/user-controls-page.js | 10 +-- {account => www/account}/user-controls.html | 0 {account => www/account}/user-controls.js | 0 {admin => www/admin}/analytics.html | 0 {admin => www/admin}/controls.html | 0 {admin => www/admin}/db-viewer.html | 0 {admin => www/admin}/db-viewer.js | 4 +- {admin => www/admin}/environments.html | 0 {admin => www/admin}/game-migration.html | 0 {admin => www/admin}/infrastructure.html | 0 {admin => www/admin}/invitations.html | 0 {admin => www/admin}/moderation.html | 0 {admin => www/admin}/operations.html | 0 {admin => www/admin}/platform-settings.html | 0 {admin => www/admin}/ratings.html | 0 {admin => www/admin}/roles.html | 0 {admin => www/admin}/site-setup.html | 0 {admin => www/admin}/system-health.html | 0 {admin => www/admin}/tool-votes.html | 0 {admin => www/admin}/tool-votes.js | 2 +- {admin => www/admin}/users.html | 0 .../assets}/GFS-Infrastructure v1-2.png | Bin .../assets}/GFS-Infrastructure v1-3.png | Bin .../assets}/js/shared/assets-api-client.js | 2 +- .../assets}/js/shared/controls-api-client.js | 2 +- .../js/shared/game-journey-api-client.js | 4 +- {assets => www/assets}/js/shared/status.js | 0 .../assets}/js/shared/tts-profile-store.js | 0 .../assets}/theme-v2/css/accordion.css | 0 {assets => www/assets}/theme-v2/css/base.css | 0 .../assets}/theme-v2/css/buttons.css | 0 .../assets}/theme-v2/css/colors.css | 0 .../assets}/theme-v2/css/controls.css | 0 .../assets}/theme-v2/css/dialogs.css | 0 {assets => www/assets}/theme-v2/css/forms.css | 0 .../theme-v2/css/gamefoundrystudio.css | 0 {assets => www/assets}/theme-v2/css/icons.css | 0 .../assets}/theme-v2/css/layout.css | 0 {assets => www/assets}/theme-v2/css/pages.css | 0 .../assets}/theme-v2/css/panels.css | 0 .../assets}/theme-v2/css/site-colors.css | 0 .../assets}/theme-v2/css/site-controls.css | 0 .../assets}/theme-v2/css/spacing.css | 0 .../assets}/theme-v2/css/status.css | 0 .../assets}/theme-v2/css/tables.css | 0 {assets => www/assets}/theme-v2/css/theme.css | 0 .../assets}/theme-v2/css/tokens.css | 0 {assets => www/assets}/theme-v2/css/tools.css | 0 .../assets}/theme-v2/css/typography.css | 0 .../0xProtoNerdFont/0xProtoNerdFont-Bold.ttf | Bin .../0xProtoNerdFont-Italic.ttf | Bin .../0xProtoNerdFont-Regular.ttf | Bin .../0xProtoNerdFontMono-Bold.ttf | Bin .../0xProtoNerdFontMono-Italic.ttf | Bin .../0xProtoNerdFontMono-Regular.ttf | Bin .../0xProtoNerdFontPropo-Bold.ttf | Bin .../0xProtoNerdFontPropo-Italic.ttf | Bin .../0xProtoNerdFontPropo-Regular.ttf | Bin .../theme-v2/fonts/0xProtoNerdFont/LICENSE | 0 .../theme-v2/fonts/0xProtoNerdFont/README.md | 0 .../fontawesome/css/font-awesome.min.css | 0 .../fontawesome/fonts/fontawesome-webfont.ttf | Bin .../fonts/fontawesome-webfont.woff | Bin .../fonts/fontawesome-webfont.woff2 | Bin .../fonts/vector_battle/vector_battle.ttf | Bin .../theme-v2/images/Tools Dependency Tree.png | Bin .../images/badges/achievement-1024.png | Bin .../theme-v2/images/badges/achievement.png | Bin .../images/badges/ai-assistant-1024.png | Bin .../theme-v2/images/badges/ai-assistant.png | Bin .../images/badges/animations-1024.png | Bin .../theme-v2/images/badges/animations.png | Bin .../theme-v2/images/badges/assets-1024.png | Bin .../assets}/theme-v2/images/badges/assets.png | Bin .../theme-v2/images/badges/audio-1024.png | Bin .../images/badges/audio-effects-1024.png | Bin .../theme-v2/images/badges/audio-effects.png | Bin .../assets}/theme-v2/images/badges/audio.png | Bin .../images/badges/build-game-1024.png | Bin .../theme-v2/images/badges/build-game.png | Bin .../images/badges/characters-1024.png | Bin .../theme-v2/images/badges/characters.png | Bin .../theme-v2/images/badges/cloud-1024.png | Bin .../assets}/theme-v2/images/badges/cloud.png | Bin .../theme-v2/images/badges/code-1024.png | Bin .../assets}/theme-v2/images/badges/code.png | Bin .../theme-v2/images/badges/colors-1024.png | Bin .../assets}/theme-v2/images/badges/colors.png | Bin .../theme-v2/images/badges/community-1024.png | Bin .../theme-v2/images/badges/community.png | Bin .../theme-v2/images/badges/controls-1024.png | Bin .../theme-v2/images/badges/controls.png | Bin .../theme-v2/images/badges/debug-1024.png | Bin .../assets}/theme-v2/images/badges/debug.png | Bin .../images/badges/environments-1024.png | Bin .../theme-v2/images/badges/environments.png | Bin .../theme-v2/images/badges/events-1024.png | Bin .../assets}/theme-v2/images/badges/events.png | Bin .../theme-v2/images/badges/fonts-1024.png | Bin .../assets}/theme-v2/images/badges/fonts.png | Bin .../images/badges/game-configuration-1024.png | Bin .../images/badges/game-configuration.png | Bin .../images/badges/game-design-1024.png | Bin .../theme-v2/images/badges/game-design.png | Bin .../theme-v2/images/badges/game-hub-1024.png | Bin .../theme-v2/images/badges/game-hub.png | Bin .../images/badges/game-migration-1024.png | Bin .../theme-v2/images/badges/game-migration.png | Bin .../images/badges/game-testing-1024.png | Bin .../theme-v2/images/badges/game-testing.png | Bin .../theme-v2/images/badges/hitboxes-1024.png | Bin .../theme-v2/images/badges/hitboxes.png | Bin .../theme-v2/images/badges/languages-1024.png | Bin .../theme-v2/images/badges/languages.png | Bin .../theme-v2/images/badges/learn-1024.png | Bin .../assets}/theme-v2/images/badges/learn.png | Bin .../images/badges/marketplace-1024.png | Bin .../theme-v2/images/badges/marketplace.png | Bin .../theme-v2/images/badges/midi-1024.png | Bin .../assets}/theme-v2/images/badges/midi.png | Bin .../theme-v2/images/badges/music-1024.png | Bin .../assets}/theme-v2/images/badges/music.png | Bin .../theme-v2/images/badges/objects-1024.png | Bin .../theme-v2/images/badges/objects.png | Bin .../theme-v2/images/badges/particles-1024.png | Bin .../theme-v2/images/badges/particles.png | Bin .../images/badges/performance-1024.png | Bin .../theme-v2/images/badges/performance.png | Bin .../images/badges/platform-settings-1024.png | Bin .../images/badges/platform-settings.png | Bin .../images/badges/project-workspace-1024.png | Bin .../images/badges/project-workspace.png | Bin .../theme-v2/images/badges/publish-1024.png | Bin .../theme-v2/images/badges/publish.png | Bin .../theme-v2/images/badges/ratings-1024.png | Bin .../theme-v2/images/badges/ratings.png | Bin .../images/badges/saved-data-1024.png | Bin .../theme-v2/images/badges/saved-data.png | Bin .../images/badges/speech-to-text-1024.png | Bin .../theme-v2/images/badges/speech-to-text.png | Bin .../theme-v2/images/badges/sprites-1024.png | Bin .../theme-v2/images/badges/sprites.png | Bin .../theme-v2/images/badges/tags-1024.png | Bin .../assets}/theme-v2/images/badges/tags.png | Bin .../images/badges/text-to-speech-1024.png | Bin .../theme-v2/images/badges/text-to-speech.png | Bin .../theme-v2/images/badges/users-1024.png | Bin .../assets}/theme-v2/images/badges/users.png | Bin .../theme-v2/images/badges/videos-1024.png | Bin .../assets}/theme-v2/images/badges/videos.png | Bin .../theme-v2/images/badges/voices-1024.png | Bin .../assets}/theme-v2/images/badges/voices.png | Bin .../theme-v2/images/badges/worlds-1024.png | Bin .../assets}/theme-v2/images/badges/worlds.png | Bin .../assets}/theme-v2/images/forge-bot.svg | 0 .../images/game-foundry-studio-logo.png | Bin .../images/game-foundry-tools-poster.png | Bin .../images/game-foundry-tools-poster=2.png | Bin .../theme-v2/images/gfs-chevron-down.svg | 0 .../theme-v2/images/gfs-chevron-up.svg | 0 .../assets}/theme-v2/images/image-missing.svg | 0 .../assets}/theme-v2/images/logo-mark.svg | 0 ...hatGPT Image May 30, 2026, 07_57_30 PM.png | Bin ...atGPT Image May 30, 2026, 07_57_30 PM2.png | Bin .../images/mascots/forge-bot-single.png | Bin .../theme-v2/images/mascots/forgebot.png | Bin .../theme-v2/images/mascots/foundry-bot.png | Bin .../mascots/game-foundry-mascots-sheet.png | Bin .../images/mascots/localization-studio.png | Bin .../theme-v2/images/mascots/pixel-smith.png | Bin .../assets}/theme-v2/images/mascots/spark.png | Bin .../theme-v2/images/merch/logo-merch-0.png | Bin .../theme-v2/images/merch/logo-merch-2.png | Bin .../theme-v2/images/merch/logo-merch-3.png | Bin .../images/merch/logo-merch-4-like.png | Bin .../theme-v2/images/merch/logo-merch-5.png | Bin .../theme-v2/images/merch/logo-trans-back.png | Bin .../images/tools/achievement-1024.png | Bin .../theme-v2/images/tools/achievement.png | Bin .../images/tools/ai-assistant-1024.png | Bin .../theme-v2/images/tools/ai-assistant.png | Bin .../theme-v2/images/tools/animation-1024.png | Bin .../theme-v2/images/tools/animation.png | Bin .../assets}/theme-v2/images/tools/arcade.png | Bin .../theme-v2/images/tools/asset-studio.png | Bin .../theme-v2/images/tools/assets-1024.png | Bin .../assets}/theme-v2/images/tools/assets.png | Bin .../theme-v2/images/tools/audio-1024.png | Bin .../images/tools/audio-effects-1024.png | Bin .../theme-v2/images/tools/audio-effects.png | Bin .../assets}/theme-v2/images/tools/audio.png | Bin .../theme-v2/images/tools/build-game-1024.png | Bin .../theme-v2/images/tools/build-game.png | Bin .../theme-v2/images/tools/characters-1024.png | Bin .../theme-v2/images/tools/characters.png | Bin .../theme-v2/images/tools/cloud-1024.png | Bin .../theme-v2/images/tools/cloud-studio.png | Bin .../assets}/theme-v2/images/tools/cloud.png | Bin .../theme-v2/images/tools/code-1024.png | Bin .../theme-v2/images/tools/code-studio.png | Bin .../assets}/theme-v2/images/tools/code.png | Bin .../theme-v2/images/tools/colors-1024.png | Bin .../assets}/theme-v2/images/tools/colors.png | Bin .../theme-v2/images/tools/community-1024.png | Bin .../theme-v2/images/tools/community.png | Bin .../theme-v2/images/tools/controls-1024.png | Bin .../theme-v2/images/tools/controls.png | Bin .../theme-v2/images/tools/debug-1024.png | Bin .../assets}/theme-v2/images/tools/debug.png | Bin .../images/tools/environments-1024.png | Bin .../theme-v2/images/tools/environments.png | Bin .../theme-v2/images/tools/events-1024.png | Bin .../assets}/theme-v2/images/tools/events.png | Bin .../theme-v2/images/tools/fonts-1024.png | Bin .../assets}/theme-v2/images/tools/fonts.png | Bin .../theme-v2/images/tools/game-builder.png | Bin .../images/tools/game-configuration-1024.png | Bin .../images/tools/game-configuration.png | Bin .../images/tools/game-design-1024.png | Bin .../images/tools/game-design-studio.png | Bin .../theme-v2/images/tools/game-design.png | Bin .../theme-v2/images/tools/game-hub-1024.png | Bin .../theme-v2/images/tools/game-hub.png | Bin .../images/tools/game-migration-1024.png | Bin .../theme-v2/images/tools/game-migration.png | Bin .../images/tools/game-testing-1024.png | Bin .../theme-v2/images/tools/game-testing.png | Bin .../theme-v2/images/tools/hitboxes-1024.png | Bin .../theme-v2/images/tools/hitboxes.png | Bin .../theme-v2/images/tools/input-studio.png | Bin .../theme-v2/images/tools/languages-1024.png | Bin .../theme-v2/images/tools/languages.png | Bin .../theme-v2/images/tools/learn-1024.png | Bin .../theme-v2/images/tools/learn-studio.png | Bin .../assets}/theme-v2/images/tools/learn.png | Bin .../images/tools/localization-studio.png | Bin .../theme-v2/images/tools/localizaton.png | Bin .../images/tools/marketplace-1024.png | Bin .../theme-v2/images/tools/marketplace.png | Bin .../theme-v2/images/tools/match_format.png | Bin .../theme-v2/images/tools/midi-1024.png | Bin .../theme-v2/images/tools/midi-studio.png | Bin .../assets}/theme-v2/images/tools/midi.png | Bin .../theme-v2/images/tools/music-1024.png | Bin .../assets}/theme-v2/images/tools/music.png | Bin .../images/tools/object-vector-studio.png | Bin .../theme-v2/images/tools/objects-1024.png | Bin .../assets}/theme-v2/images/tools/objects.png | Bin .../theme-v2/images/tools/palette-manager.png | Bin .../theme-v2/images/tools/particle-studio.png | Bin .../theme-v2/images/tools/particles-1024.png | Bin .../theme-v2/images/tools/particles.png | Bin .../images/tools/performance-1024.png | Bin .../theme-v2/images/tools/performance.png | Bin .../images/tools/platform-settings-1024.png | Bin .../images/tools/platform-settings.png | Bin .../images/tools/project-workspace-1024.png | Bin .../images/tools/project-workspace.png | Bin .../theme-v2/images/tools/publish-1024.png | Bin .../theme-v2/images/tools/publish-studio.png | Bin .../assets}/theme-v2/images/tools/publish.png | Bin .../theme-v2/images/tools/ratings-1024.png | Bin .../assets}/theme-v2/images/tools/ratings.png | Bin .../theme-v2/images/tools/saved-data-1024.png | Bin .../theme-v2/images/tools/saved-data.png | Bin .../theme-v2/images/tools/settings-studio.png | Bin .../theme-v2/images/tools/sound-studio.png | Bin .../images/tools/speech-to-text-1024.png | Bin .../theme-v2/images/tools/speech-to-text.png | Bin .../theme-v2/images/tools/sprites-1024.png | Bin .../assets}/theme-v2/images/tools/sprites.png | Bin .../images/tools/storage-inspector.png | Bin .../theme-v2/images/tools/tags-1024.png | Bin .../assets}/theme-v2/images/tools/tags.png | Bin .../theme-v2/images/tools/text-to-speech.png | Bin .../theme-v2/images/tools/users-1024.png | Bin .../assets}/theme-v2/images/tools/users.png | Bin .../theme-v2/images/tools/videos-1024.png | Bin .../assets}/theme-v2/images/tools/videos.png | Bin .../theme-v2/images/tools/voices-1024.png | Bin .../assets}/theme-v2/images/tools/voices.png | Bin .../images/tools/world-vector-studio.png | Bin .../theme-v2/images/tools/worlds-1024.png | Bin .../assets}/theme-v2/images/tools/worlds.png | Bin .../theme-v2/images/youtube_banner.png | Bin .../assets}/theme-v2/images/youtube_video.png | Bin .../theme-v2/js/account-achievements.js | 4 +- .../assets}/theme-v2/js/account-ai-credits.js | 2 +- .../theme-v2/js/account-auth-actions.js | 0 .../theme-v2/js/account-auth-service.js | 2 +- .../assets}/theme-v2/js/account-controls.js | 0 .../assets}/theme-v2/js/account-page-data.js | 0 .../theme-v2/js/admin-db-status-panel.js | 2 +- .../theme-v2/js/admin-infrastructure.js | 2 +- .../assets}/theme-v2/js/admin-invitations.js | 2 +- .../assets}/theme-v2/js/admin-operations.js | 2 +- .../theme-v2/js/admin-owner-navigation.js | 2 +- .../theme-v2/js/admin-platform-settings.js | 2 +- .../theme-v2/js/admin-service-page-data.js | 2 +- .../theme-v2/js/admin-setup-actions.js | 2 +- .../theme-v2/js/admin-system-health.js | 2 +- .../theme-v2/js/gamefoundry-partials.js | 0 .../assets}/theme-v2/js/image-zoom-dialog.js | 0 .../assets}/theme-v2/js/login-session.js | 0 .../assets}/theme-v2/js/marketplace-page.js | 2 +- .../assets}/theme-v2/js/memberships-page.js | 2 +- .../assets}/theme-v2/js/owner-ai-credits.js | 2 +- .../assets}/theme-v2/js/owner-memberships.js | 2 +- .../assets}/theme-v2/js/theme-icons.js | 0 .../assets}/theme-v2/js/tool-display-mode.js | 0 .../assets}/theme-v2/js/toolbox-status-bar.js | 0 .../theme-v2/partials/account-side-nav.html | 0 .../assets}/theme-v2/partials/footer.html | 0 .../assets}/theme-v2/partials/header-nav.html | 0 .../assets}/theme-v2/partials/page-shell.html | 0 .../assets}/theme-v2/partials/tool-shell.html | 0 {assets => www/assets}/theme-v2/svg/README.md | 0 .../assets}/theme-v2/svg/gfs-add.svg | 0 .../assets}/theme-v2/svg/gfs-chevron-down.svg | 0 .../assets}/theme-v2/svg/gfs-chevron-left.svg | 0 .../theme-v2/svg/gfs-chevron-right.svg | 0 .../assets}/theme-v2/svg/gfs-chevron-up.svg | 0 .../assets}/theme-v2/svg/gfs-close.svg | 0 .../assets}/theme-v2/svg/gfs-error.svg | 0 .../theme-v2/svg/gfs-exit-fullscreen.svg | 0 .../assets}/theme-v2/svg/gfs-fullscreen.svg | 0 .../assets}/theme-v2/svg/gfs-info.svg | 0 .../assets}/theme-v2/svg/gfs-menu.svg | 0 .../assets}/theme-v2/svg/gfs-search.svg | 0 .../assets}/theme-v2/svg/gfs-settings.svg | 0 .../assets}/theme-v2/svg/gfs-subtract.svg | 0 .../assets}/theme-v2/svg/gfs-success.svg | 0 .../assets}/theme-v2/svg/gfs-trash.svg | 0 .../assets}/theme-v2/svg/gfs-warning.svg | 0 .../toolbox/assets/js/assets-upload-worker.js | 0 .../assets}/toolbox/assets/js/index.js | 2 +- .../assets}/toolbox/colors/js/index.js | 2 +- .../assets}/toolbox/controls/js/index.js | 2 +- .../assets}/toolbox/events/js/index.js | 2 +- .../toolbox/game-configuration/js/index.js | 4 +- .../assets}/toolbox/game-crew/js/index.js | 4 +- .../assets}/toolbox/game-design/js/index.js | 4 +- .../assets}/toolbox/game-journey/js/index.js | 2 +- .../assets}/toolbox/hitboxes/js/index.js | 6 +- .../assets}/toolbox/idea-board/js/index.js | 4 +- .../assets}/toolbox/objects/js/index.js | 6 +- .../assets}/toolbox/sprites/js/index.js | 0 .../assets}/toolbox/tags/js/index.js | 4 +- .../toolbox/text-to-speech/js/index.js | 6 +- {community => www/community}/assets.html | 0 {community => www/community}/index.html | 0 {community => www/community}/publish.html | 0 {company => www/company}/about.html | 0 {company => www/company}/contact.html | 0 {company => www/company}/how-we-build.html | 0 {company => www/company}/mission.html | 0 {company => www/company}/release-notes.html | 0 {company => www/company}/roadmap.html | 0 {company => www/company}/vision.html | 0 {docs => www/docs}/README.md | 0 {docs => www/docs}/faq.html | 0 {docs => www/docs}/index.html | 0 {docs => www/docs}/reference.html | 0 {docs => www/docs}/support.html | 0 {games => www/games}/action/index.html | 0 {games => www/games}/adventure/index.html | 0 {games => www/games}/arcade/index.html | 0 .../games}/assets/images/game-forgequest.svg | 0 .../games}/assets/images/game-iceberg.svg | 0 .../games}/assets/images/game-nebula.svg | 0 .../games}/assets/images/game-retrobot.svg | 0 {games => www/games}/index.html | 0 {games => www/games}/puzzle/index.html | 0 {games => www/games}/racing/index.html | 0 {games => www/games}/retro/index.html | 0 {games => www/games}/strategy/index.html | 0 index.html => www/index.html | 0 {learn => www/learn}/assets/index.html | 0 {learn => www/learn}/audio/index.html | 0 {learn => www/learn}/colors/index.html | 0 .../learn}/game-configuration/index.html | 0 {learn => www/learn}/game-design/index.html | 0 {learn => www/learn}/game-hub/index.html | 0 .../learn}/getting-started/index.html | 0 {learn => www/learn}/index.html | 0 {learn => www/learn}/objects/index.html | 0 {learn => www/learn}/publish/index.html | 0 {learn => www/learn}/worlds/index.html | 0 .../legal}/community-guidelines.html | 0 {legal => www/legal}/community-guidelines.md | 0 {legal => www/legal}/cookie-policy.html | 0 {legal => www/legal}/cookie-policy.md | 0 {legal => www/legal}/cookies-policy.html | 0 {legal => www/legal}/copyright-policy.html | 0 {legal => www/legal}/copyright-policy.md | 0 {legal => www/legal}/dmca-policy.html | 0 {legal => www/legal}/dmca-policy.md | 0 {legal => www/legal}/index.html | 0 {legal => www/legal}/index.md | 0 {legal => www/legal}/legal-nav.js | 0 {legal => www/legal}/privacy-policy.html | 0 {legal => www/legal}/privacy-policy.md | 0 {legal => www/legal}/terms-of-service.html | 0 {legal => www/legal}/terms-of-service.md | 0 {legal => www/legal}/terms.html | 0 {marketplace => www/marketplace}/index.html | 0 {memberships => www/memberships}/index.html | 0 {owner => www/owner}/ai-credits.html | 0 {owner => www/owner}/branding.html | 0 {owner => www/owner}/design-system.html | 0 {owner => www/owner}/grouping-colors.html | 0 {owner => www/owner}/memberships.html | 0 {owner => www/owner}/notes.html | 0 {owner => www/owner}/site-settings.html | 0 {owner => www/owner}/themes.html | 0 .../toolbox}/achievements/index.html | 0 .../toolbox}/ai-assistant/index.html | 0 .../toolbox}/animations/index.html | 0 {toolbox => www/toolbox}/assets/index.html | 0 .../toolbox}/audio-effects/index.html | 0 {toolbox => www/toolbox}/audio/index.html | 0 .../toolbox}/build-game/index.html | 0 .../toolbox}/characters/index.html | 0 {toolbox => www/toolbox}/cloud/index.html | 0 {toolbox => www/toolbox}/code/index.html | 0 {toolbox => www/toolbox}/colors/index.html | 0 {toolbox => www/toolbox}/community/index.html | 0 {toolbox => www/toolbox}/controls/index.html | 0 {toolbox => www/toolbox}/debug/index.html | 0 .../toolbox}/environments/index.html | 0 {toolbox => www/toolbox}/events/index.html | 0 {toolbox => www/toolbox}/fonts/index.html | 0 .../toolbox}/game-configuration/index.html | 0 {toolbox => www/toolbox}/game-crew/index.html | 0 .../toolbox}/game-design/index.html | 0 .../toolbox}/game-hub/game-hub-api-client.js | 2 +- {toolbox => www/toolbox}/game-hub/game-hub.js | 2 +- {toolbox => www/toolbox}/game-hub/index.html | 0 .../toolbox}/game-journey/index.html | 0 .../toolbox}/game-migration/index.html | 0 .../toolbox}/game-testing/index.html | 0 {toolbox => www/toolbox}/hitboxes/index.html | 0 .../toolbox}/idea-board/index.html | 0 {toolbox => www/toolbox}/index.html | 0 .../toolbox}/input-mapping-v2/index.html | 0 {toolbox => www/toolbox}/languages/index.html | 0 .../toolbox}/marketplace/index.html | 0 {toolbox => www/toolbox}/messages/index.html | 0 .../messages/message-tts-service-registry.js | 2 +- .../toolbox}/messages/messages-api-client.js | 2 +- {toolbox => www/toolbox}/messages/messages.js | 2 +- {toolbox => www/toolbox}/midi/index.html | 0 {toolbox => www/toolbox}/music/index.html | 0 {toolbox => www/toolbox}/objects/index.html | 0 {toolbox => www/toolbox}/particles/index.html | 0 .../toolbox}/performance/index.html | 0 .../toolbox}/platform-settings/index.html | 0 .../toolbox}/project-workspace/index.html | 0 {toolbox => www/toolbox}/publish/index.html | 0 {toolbox => www/toolbox}/ratings/index.html | 0 .../toolbox}/saved-data/index.html | 0 .../toolbox}/speech-to-text/index.html | 0 {toolbox => www/toolbox}/sprites/index.html | 0 {toolbox => www/toolbox}/tags/index.html | 0 .../toolbox}/text-to-speech/index.html | 0 .../toolbox}/tool-registry-api-client.js | 2 +- {toolbox => www/toolbox}/toolRegistry.js | 2 +- .../toolbox}/tools-page-accordions.js | 6 +- {toolbox => www/toolbox}/users/index.html | 0 {toolbox => www/toolbox}/videos/index.html | 0 {toolbox => www/toolbox}/voices/index.html | 0 {toolbox => www/toolbox}/worlds/index.html | 0 522 files changed, 438 insertions(+), 271 deletions(-) create mode 100644 dev/reports/PR_26180_OWNER_008-move-www-application_branch-validation.md create mode 100644 dev/reports/PR_26180_OWNER_008-move-www-application_manual-validation-notes.md create mode 100644 dev/reports/PR_26180_OWNER_008-move-www-application_report.md create mode 100644 dev/reports/PR_26180_OWNER_008-move-www-application_requirement-checklist.md create mode 100644 dev/reports/PR_26180_OWNER_008-move-www-application_validation-report.md delete mode 100644 www/.gitkeep rename {account => www/account}/achievements.html (100%) rename {account => www/account}/ai-credits.html (100%) rename {account => www/account}/create-account.html (100%) rename {account => www/account}/index.html (100%) rename {account => www/account}/lost-password.html (100%) rename {account => www/account}/password-reset.html (100%) rename {account => www/account}/preferences.html (100%) rename {account => www/account}/profile.html (100%) rename {account => www/account}/security.html (100%) rename {account => www/account}/sign-in.html (100%) rename {account => www/account}/user-controls-page.js (99%) rename {account => www/account}/user-controls.html (100%) rename {account => www/account}/user-controls.js (100%) rename {admin => www/admin}/analytics.html (100%) rename {admin => www/admin}/controls.html (100%) rename {admin => www/admin}/db-viewer.html (100%) rename {admin => www/admin}/db-viewer.js (90%) rename {admin => www/admin}/environments.html (100%) rename {admin => www/admin}/game-migration.html (100%) rename {admin => www/admin}/infrastructure.html (100%) rename {admin => www/admin}/invitations.html (100%) rename {admin => www/admin}/moderation.html (100%) rename {admin => www/admin}/operations.html (100%) rename {admin => www/admin}/platform-settings.html (100%) rename {admin => www/admin}/ratings.html (100%) rename {admin => www/admin}/roles.html (100%) rename {admin => www/admin}/site-setup.html (100%) rename {admin => www/admin}/system-health.html (100%) rename {admin => www/admin}/tool-votes.html (100%) rename {admin => www/admin}/tool-votes.js (99%) rename {admin => www/admin}/users.html (100%) rename {assets => www/assets}/GFS-Infrastructure v1-2.png (100%) rename {assets => www/assets}/GFS-Infrastructure v1-3.png (100%) rename {assets => www/assets}/js/shared/assets-api-client.js (95%) rename {assets => www/assets}/js/shared/controls-api-client.js (96%) rename {assets => www/assets}/js/shared/game-journey-api-client.js (90%) rename {assets => www/assets}/js/shared/status.js (100%) rename {assets => www/assets}/js/shared/tts-profile-store.js (100%) rename {assets => www/assets}/theme-v2/css/accordion.css (100%) rename {assets => www/assets}/theme-v2/css/base.css (100%) rename {assets => www/assets}/theme-v2/css/buttons.css (100%) rename {assets => www/assets}/theme-v2/css/colors.css (100%) rename {assets => www/assets}/theme-v2/css/controls.css (100%) rename {assets => www/assets}/theme-v2/css/dialogs.css (100%) rename {assets => www/assets}/theme-v2/css/forms.css (100%) rename {assets => www/assets}/theme-v2/css/gamefoundrystudio.css (100%) rename {assets => www/assets}/theme-v2/css/icons.css (100%) rename {assets => www/assets}/theme-v2/css/layout.css (100%) rename {assets => www/assets}/theme-v2/css/pages.css (100%) rename {assets => www/assets}/theme-v2/css/panels.css (100%) rename {assets => www/assets}/theme-v2/css/site-colors.css (100%) rename {assets => www/assets}/theme-v2/css/site-controls.css (100%) rename {assets => www/assets}/theme-v2/css/spacing.css (100%) rename {assets => www/assets}/theme-v2/css/status.css (100%) rename {assets => www/assets}/theme-v2/css/tables.css (100%) rename {assets => www/assets}/theme-v2/css/theme.css (100%) rename {assets => www/assets}/theme-v2/css/tokens.css (100%) rename {assets => www/assets}/theme-v2/css/tools.css (100%) rename {assets => www/assets}/theme-v2/css/typography.css (100%) rename {assets => www/assets}/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Bold.ttf (100%) rename {assets => www/assets}/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Italic.ttf (100%) rename {assets => www/assets}/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Regular.ttf (100%) rename {assets => www/assets}/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Bold.ttf (100%) rename {assets => www/assets}/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Italic.ttf (100%) rename {assets => www/assets}/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Regular.ttf (100%) rename {assets => www/assets}/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Bold.ttf (100%) rename {assets => www/assets}/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Italic.ttf (100%) rename {assets => www/assets}/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Regular.ttf (100%) rename {assets => www/assets}/theme-v2/fonts/0xProtoNerdFont/LICENSE (100%) rename {assets => www/assets}/theme-v2/fonts/0xProtoNerdFont/README.md (100%) rename {assets => www/assets}/theme-v2/fonts/fontawesome/css/font-awesome.min.css (100%) rename {assets => www/assets}/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.ttf (100%) rename {assets => www/assets}/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.woff (100%) rename {assets => www/assets}/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.woff2 (100%) rename {assets => www/assets}/theme-v2/fonts/vector_battle/vector_battle.ttf (100%) rename {assets => www/assets}/theme-v2/images/Tools Dependency Tree.png (100%) rename {assets => www/assets}/theme-v2/images/badges/achievement-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/achievement.png (100%) rename {assets => www/assets}/theme-v2/images/badges/ai-assistant-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/ai-assistant.png (100%) rename {assets => www/assets}/theme-v2/images/badges/animations-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/animations.png (100%) rename {assets => www/assets}/theme-v2/images/badges/assets-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/assets.png (100%) rename {assets => www/assets}/theme-v2/images/badges/audio-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/audio-effects-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/audio-effects.png (100%) rename {assets => www/assets}/theme-v2/images/badges/audio.png (100%) rename {assets => www/assets}/theme-v2/images/badges/build-game-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/build-game.png (100%) rename {assets => www/assets}/theme-v2/images/badges/characters-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/characters.png (100%) rename {assets => www/assets}/theme-v2/images/badges/cloud-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/cloud.png (100%) rename {assets => www/assets}/theme-v2/images/badges/code-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/code.png (100%) rename {assets => www/assets}/theme-v2/images/badges/colors-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/colors.png (100%) rename {assets => www/assets}/theme-v2/images/badges/community-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/community.png (100%) rename {assets => www/assets}/theme-v2/images/badges/controls-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/controls.png (100%) rename {assets => www/assets}/theme-v2/images/badges/debug-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/debug.png (100%) rename {assets => www/assets}/theme-v2/images/badges/environments-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/environments.png (100%) rename {assets => www/assets}/theme-v2/images/badges/events-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/events.png (100%) rename {assets => www/assets}/theme-v2/images/badges/fonts-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/fonts.png (100%) rename {assets => www/assets}/theme-v2/images/badges/game-configuration-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/game-configuration.png (100%) rename {assets => www/assets}/theme-v2/images/badges/game-design-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/game-design.png (100%) rename {assets => www/assets}/theme-v2/images/badges/game-hub-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/game-hub.png (100%) rename {assets => www/assets}/theme-v2/images/badges/game-migration-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/game-migration.png (100%) rename {assets => www/assets}/theme-v2/images/badges/game-testing-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/game-testing.png (100%) rename {assets => www/assets}/theme-v2/images/badges/hitboxes-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/hitboxes.png (100%) rename {assets => www/assets}/theme-v2/images/badges/languages-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/languages.png (100%) rename {assets => www/assets}/theme-v2/images/badges/learn-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/learn.png (100%) rename {assets => www/assets}/theme-v2/images/badges/marketplace-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/marketplace.png (100%) rename {assets => www/assets}/theme-v2/images/badges/midi-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/midi.png (100%) rename {assets => www/assets}/theme-v2/images/badges/music-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/music.png (100%) rename {assets => www/assets}/theme-v2/images/badges/objects-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/objects.png (100%) rename {assets => www/assets}/theme-v2/images/badges/particles-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/particles.png (100%) rename {assets => www/assets}/theme-v2/images/badges/performance-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/performance.png (100%) rename {assets => www/assets}/theme-v2/images/badges/platform-settings-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/platform-settings.png (100%) rename {assets => www/assets}/theme-v2/images/badges/project-workspace-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/project-workspace.png (100%) rename {assets => www/assets}/theme-v2/images/badges/publish-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/publish.png (100%) rename {assets => www/assets}/theme-v2/images/badges/ratings-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/ratings.png (100%) rename {assets => www/assets}/theme-v2/images/badges/saved-data-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/saved-data.png (100%) rename {assets => www/assets}/theme-v2/images/badges/speech-to-text-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/speech-to-text.png (100%) rename {assets => www/assets}/theme-v2/images/badges/sprites-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/sprites.png (100%) rename {assets => www/assets}/theme-v2/images/badges/tags-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/tags.png (100%) rename {assets => www/assets}/theme-v2/images/badges/text-to-speech-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/text-to-speech.png (100%) rename {assets => www/assets}/theme-v2/images/badges/users-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/users.png (100%) rename {assets => www/assets}/theme-v2/images/badges/videos-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/videos.png (100%) rename {assets => www/assets}/theme-v2/images/badges/voices-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/voices.png (100%) rename {assets => www/assets}/theme-v2/images/badges/worlds-1024.png (100%) rename {assets => www/assets}/theme-v2/images/badges/worlds.png (100%) rename {assets => www/assets}/theme-v2/images/forge-bot.svg (100%) rename {assets => www/assets}/theme-v2/images/game-foundry-studio-logo.png (100%) rename {assets => www/assets}/theme-v2/images/game-foundry-tools-poster.png (100%) rename {assets => www/assets}/theme-v2/images/game-foundry-tools-poster=2.png (100%) rename {assets => www/assets}/theme-v2/images/gfs-chevron-down.svg (100%) rename {assets => www/assets}/theme-v2/images/gfs-chevron-up.svg (100%) rename {assets => www/assets}/theme-v2/images/image-missing.svg (100%) rename {assets => www/assets}/theme-v2/images/logo-mark.svg (100%) rename {assets => www/assets}/theme-v2/images/mascots/ChatGPT Image May 30, 2026, 07_57_30 PM.png (100%) rename {assets => www/assets}/theme-v2/images/mascots/ChatGPT Image May 30, 2026, 07_57_30 PM2.png (100%) rename {assets => www/assets}/theme-v2/images/mascots/forge-bot-single.png (100%) rename {assets => www/assets}/theme-v2/images/mascots/forgebot.png (100%) rename {assets => www/assets}/theme-v2/images/mascots/foundry-bot.png (100%) rename {assets => www/assets}/theme-v2/images/mascots/game-foundry-mascots-sheet.png (100%) rename {assets => www/assets}/theme-v2/images/mascots/localization-studio.png (100%) rename {assets => www/assets}/theme-v2/images/mascots/pixel-smith.png (100%) rename {assets => www/assets}/theme-v2/images/mascots/spark.png (100%) rename {assets => www/assets}/theme-v2/images/merch/logo-merch-0.png (100%) rename {assets => www/assets}/theme-v2/images/merch/logo-merch-2.png (100%) rename {assets => www/assets}/theme-v2/images/merch/logo-merch-3.png (100%) rename {assets => www/assets}/theme-v2/images/merch/logo-merch-4-like.png (100%) rename {assets => www/assets}/theme-v2/images/merch/logo-merch-5.png (100%) rename {assets => www/assets}/theme-v2/images/merch/logo-trans-back.png (100%) rename {assets => www/assets}/theme-v2/images/tools/achievement-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/achievement.png (100%) rename {assets => www/assets}/theme-v2/images/tools/ai-assistant-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/ai-assistant.png (100%) rename {assets => www/assets}/theme-v2/images/tools/animation-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/animation.png (100%) rename {assets => www/assets}/theme-v2/images/tools/arcade.png (100%) rename {assets => www/assets}/theme-v2/images/tools/asset-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/assets-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/assets.png (100%) rename {assets => www/assets}/theme-v2/images/tools/audio-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/audio-effects-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/audio-effects.png (100%) rename {assets => www/assets}/theme-v2/images/tools/audio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/build-game-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/build-game.png (100%) rename {assets => www/assets}/theme-v2/images/tools/characters-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/characters.png (100%) rename {assets => www/assets}/theme-v2/images/tools/cloud-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/cloud-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/cloud.png (100%) rename {assets => www/assets}/theme-v2/images/tools/code-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/code-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/code.png (100%) rename {assets => www/assets}/theme-v2/images/tools/colors-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/colors.png (100%) rename {assets => www/assets}/theme-v2/images/tools/community-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/community.png (100%) rename {assets => www/assets}/theme-v2/images/tools/controls-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/controls.png (100%) rename {assets => www/assets}/theme-v2/images/tools/debug-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/debug.png (100%) rename {assets => www/assets}/theme-v2/images/tools/environments-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/environments.png (100%) rename {assets => www/assets}/theme-v2/images/tools/events-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/events.png (100%) rename {assets => www/assets}/theme-v2/images/tools/fonts-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/fonts.png (100%) rename {assets => www/assets}/theme-v2/images/tools/game-builder.png (100%) rename {assets => www/assets}/theme-v2/images/tools/game-configuration-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/game-configuration.png (100%) rename {assets => www/assets}/theme-v2/images/tools/game-design-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/game-design-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/game-design.png (100%) rename {assets => www/assets}/theme-v2/images/tools/game-hub-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/game-hub.png (100%) rename {assets => www/assets}/theme-v2/images/tools/game-migration-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/game-migration.png (100%) rename {assets => www/assets}/theme-v2/images/tools/game-testing-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/game-testing.png (100%) rename {assets => www/assets}/theme-v2/images/tools/hitboxes-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/hitboxes.png (100%) rename {assets => www/assets}/theme-v2/images/tools/input-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/languages-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/languages.png (100%) rename {assets => www/assets}/theme-v2/images/tools/learn-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/learn-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/learn.png (100%) rename {assets => www/assets}/theme-v2/images/tools/localization-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/localizaton.png (100%) rename {assets => www/assets}/theme-v2/images/tools/marketplace-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/marketplace.png (100%) rename {assets => www/assets}/theme-v2/images/tools/match_format.png (100%) rename {assets => www/assets}/theme-v2/images/tools/midi-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/midi-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/midi.png (100%) rename {assets => www/assets}/theme-v2/images/tools/music-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/music.png (100%) rename {assets => www/assets}/theme-v2/images/tools/object-vector-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/objects-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/objects.png (100%) rename {assets => www/assets}/theme-v2/images/tools/palette-manager.png (100%) rename {assets => www/assets}/theme-v2/images/tools/particle-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/particles-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/particles.png (100%) rename {assets => www/assets}/theme-v2/images/tools/performance-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/performance.png (100%) rename {assets => www/assets}/theme-v2/images/tools/platform-settings-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/platform-settings.png (100%) rename {assets => www/assets}/theme-v2/images/tools/project-workspace-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/project-workspace.png (100%) rename {assets => www/assets}/theme-v2/images/tools/publish-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/publish-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/publish.png (100%) rename {assets => www/assets}/theme-v2/images/tools/ratings-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/ratings.png (100%) rename {assets => www/assets}/theme-v2/images/tools/saved-data-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/saved-data.png (100%) rename {assets => www/assets}/theme-v2/images/tools/settings-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/sound-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/speech-to-text-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/speech-to-text.png (100%) rename {assets => www/assets}/theme-v2/images/tools/sprites-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/sprites.png (100%) rename {assets => www/assets}/theme-v2/images/tools/storage-inspector.png (100%) rename {assets => www/assets}/theme-v2/images/tools/tags-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/tags.png (100%) rename {assets => www/assets}/theme-v2/images/tools/text-to-speech.png (100%) rename {assets => www/assets}/theme-v2/images/tools/users-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/users.png (100%) rename {assets => www/assets}/theme-v2/images/tools/videos-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/videos.png (100%) rename {assets => www/assets}/theme-v2/images/tools/voices-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/voices.png (100%) rename {assets => www/assets}/theme-v2/images/tools/world-vector-studio.png (100%) rename {assets => www/assets}/theme-v2/images/tools/worlds-1024.png (100%) rename {assets => www/assets}/theme-v2/images/tools/worlds.png (100%) rename {assets => www/assets}/theme-v2/images/youtube_banner.png (100%) rename {assets => www/assets}/theme-v2/images/youtube_video.png (100%) rename {assets => www/assets}/theme-v2/js/account-achievements.js (96%) rename {assets => www/assets}/theme-v2/js/account-ai-credits.js (98%) rename {assets => www/assets}/theme-v2/js/account-auth-actions.js (100%) rename {assets => www/assets}/theme-v2/js/account-auth-service.js (97%) rename {assets => www/assets}/theme-v2/js/account-controls.js (100%) rename {assets => www/assets}/theme-v2/js/account-page-data.js (100%) rename {assets => www/assets}/theme-v2/js/admin-db-status-panel.js (93%) rename {assets => www/assets}/theme-v2/js/admin-infrastructure.js (96%) rename {assets => www/assets}/theme-v2/js/admin-invitations.js (99%) rename {assets => www/assets}/theme-v2/js/admin-operations.js (99%) rename {assets => www/assets}/theme-v2/js/admin-owner-navigation.js (97%) rename {assets => www/assets}/theme-v2/js/admin-platform-settings.js (98%) rename {assets => www/assets}/theme-v2/js/admin-service-page-data.js (98%) rename {assets => www/assets}/theme-v2/js/admin-setup-actions.js (95%) rename {assets => www/assets}/theme-v2/js/admin-system-health.js (99%) rename {assets => www/assets}/theme-v2/js/gamefoundry-partials.js (100%) rename {assets => www/assets}/theme-v2/js/image-zoom-dialog.js (100%) rename {assets => www/assets}/theme-v2/js/login-session.js (100%) rename {assets => www/assets}/theme-v2/js/marketplace-page.js (99%) rename {assets => www/assets}/theme-v2/js/memberships-page.js (98%) rename {assets => www/assets}/theme-v2/js/owner-ai-credits.js (99%) rename {assets => www/assets}/theme-v2/js/owner-memberships.js (99%) rename {assets => www/assets}/theme-v2/js/theme-icons.js (100%) rename {assets => www/assets}/theme-v2/js/tool-display-mode.js (100%) rename {assets => www/assets}/theme-v2/js/toolbox-status-bar.js (100%) rename {assets => www/assets}/theme-v2/partials/account-side-nav.html (100%) rename {assets => www/assets}/theme-v2/partials/footer.html (100%) rename {assets => www/assets}/theme-v2/partials/header-nav.html (100%) rename {assets => www/assets}/theme-v2/partials/page-shell.html (100%) rename {assets => www/assets}/theme-v2/partials/tool-shell.html (100%) rename {assets => www/assets}/theme-v2/svg/README.md (100%) rename {assets => www/assets}/theme-v2/svg/gfs-add.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-chevron-down.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-chevron-left.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-chevron-right.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-chevron-up.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-close.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-error.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-exit-fullscreen.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-fullscreen.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-info.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-menu.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-search.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-settings.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-subtract.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-success.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-trash.svg (100%) rename {assets => www/assets}/theme-v2/svg/gfs-warning.svg (100%) rename {assets => www/assets}/toolbox/assets/js/assets-upload-worker.js (100%) rename {assets => www/assets}/toolbox/assets/js/index.js (99%) rename {assets => www/assets}/toolbox/colors/js/index.js (99%) rename {assets => www/assets}/toolbox/controls/js/index.js (99%) rename {assets => www/assets}/toolbox/events/js/index.js (99%) rename {assets => www/assets}/toolbox/game-configuration/js/index.js (98%) rename {assets => www/assets}/toolbox/game-crew/js/index.js (97%) rename {assets => www/assets}/toolbox/game-design/js/index.js (99%) rename {assets => www/assets}/toolbox/game-journey/js/index.js (99%) rename {assets => www/assets}/toolbox/hitboxes/js/index.js (99%) rename {assets => www/assets}/toolbox/idea-board/js/index.js (99%) rename {assets => www/assets}/toolbox/objects/js/index.js (99%) rename {assets => www/assets}/toolbox/sprites/js/index.js (100%) rename {assets => www/assets}/toolbox/tags/js/index.js (98%) rename {assets => www/assets}/toolbox/text-to-speech/js/index.js (99%) rename {community => www/community}/assets.html (100%) rename {community => www/community}/index.html (100%) rename {community => www/community}/publish.html (100%) rename {company => www/company}/about.html (100%) rename {company => www/company}/contact.html (100%) rename {company => www/company}/how-we-build.html (100%) rename {company => www/company}/mission.html (100%) rename {company => www/company}/release-notes.html (100%) rename {company => www/company}/roadmap.html (100%) rename {company => www/company}/vision.html (100%) rename {docs => www/docs}/README.md (100%) rename {docs => www/docs}/faq.html (100%) rename {docs => www/docs}/index.html (100%) rename {docs => www/docs}/reference.html (100%) rename {docs => www/docs}/support.html (100%) rename {games => www/games}/action/index.html (100%) rename {games => www/games}/adventure/index.html (100%) rename {games => www/games}/arcade/index.html (100%) rename {games => www/games}/assets/images/game-forgequest.svg (100%) rename {games => www/games}/assets/images/game-iceberg.svg (100%) rename {games => www/games}/assets/images/game-nebula.svg (100%) rename {games => www/games}/assets/images/game-retrobot.svg (100%) rename {games => www/games}/index.html (100%) rename {games => www/games}/puzzle/index.html (100%) rename {games => www/games}/racing/index.html (100%) rename {games => www/games}/retro/index.html (100%) rename {games => www/games}/strategy/index.html (100%) rename index.html => www/index.html (100%) rename {learn => www/learn}/assets/index.html (100%) rename {learn => www/learn}/audio/index.html (100%) rename {learn => www/learn}/colors/index.html (100%) rename {learn => www/learn}/game-configuration/index.html (100%) rename {learn => www/learn}/game-design/index.html (100%) rename {learn => www/learn}/game-hub/index.html (100%) rename {learn => www/learn}/getting-started/index.html (100%) rename {learn => www/learn}/index.html (100%) rename {learn => www/learn}/objects/index.html (100%) rename {learn => www/learn}/publish/index.html (100%) rename {learn => www/learn}/worlds/index.html (100%) rename {legal => www/legal}/community-guidelines.html (100%) rename {legal => www/legal}/community-guidelines.md (100%) rename {legal => www/legal}/cookie-policy.html (100%) rename {legal => www/legal}/cookie-policy.md (100%) rename {legal => www/legal}/cookies-policy.html (100%) rename {legal => www/legal}/copyright-policy.html (100%) rename {legal => www/legal}/copyright-policy.md (100%) rename {legal => www/legal}/dmca-policy.html (100%) rename {legal => www/legal}/dmca-policy.md (100%) rename {legal => www/legal}/index.html (100%) rename {legal => www/legal}/index.md (100%) rename {legal => www/legal}/legal-nav.js (100%) rename {legal => www/legal}/privacy-policy.html (100%) rename {legal => www/legal}/privacy-policy.md (100%) rename {legal => www/legal}/terms-of-service.html (100%) rename {legal => www/legal}/terms-of-service.md (100%) rename {legal => www/legal}/terms.html (100%) rename {marketplace => www/marketplace}/index.html (100%) rename {memberships => www/memberships}/index.html (100%) rename {owner => www/owner}/ai-credits.html (100%) rename {owner => www/owner}/branding.html (100%) rename {owner => www/owner}/design-system.html (100%) rename {owner => www/owner}/grouping-colors.html (100%) rename {owner => www/owner}/memberships.html (100%) rename {owner => www/owner}/notes.html (100%) rename {owner => www/owner}/site-settings.html (100%) rename {owner => www/owner}/themes.html (100%) rename {toolbox => www/toolbox}/achievements/index.html (100%) rename {toolbox => www/toolbox}/ai-assistant/index.html (100%) rename {toolbox => www/toolbox}/animations/index.html (100%) rename {toolbox => www/toolbox}/assets/index.html (100%) rename {toolbox => www/toolbox}/audio-effects/index.html (100%) rename {toolbox => www/toolbox}/audio/index.html (100%) rename {toolbox => www/toolbox}/build-game/index.html (100%) rename {toolbox => www/toolbox}/characters/index.html (100%) rename {toolbox => www/toolbox}/cloud/index.html (100%) rename {toolbox => www/toolbox}/code/index.html (100%) rename {toolbox => www/toolbox}/colors/index.html (100%) rename {toolbox => www/toolbox}/community/index.html (100%) rename {toolbox => www/toolbox}/controls/index.html (100%) rename {toolbox => www/toolbox}/debug/index.html (100%) rename {toolbox => www/toolbox}/environments/index.html (100%) rename {toolbox => www/toolbox}/events/index.html (100%) rename {toolbox => www/toolbox}/fonts/index.html (100%) rename {toolbox => www/toolbox}/game-configuration/index.html (100%) rename {toolbox => www/toolbox}/game-crew/index.html (100%) rename {toolbox => www/toolbox}/game-design/index.html (100%) rename {toolbox => www/toolbox}/game-hub/game-hub-api-client.js (96%) rename {toolbox => www/toolbox}/game-hub/game-hub.js (99%) rename {toolbox => www/toolbox}/game-hub/index.html (100%) rename {toolbox => www/toolbox}/game-journey/index.html (100%) rename {toolbox => www/toolbox}/game-migration/index.html (100%) rename {toolbox => www/toolbox}/game-testing/index.html (100%) rename {toolbox => www/toolbox}/hitboxes/index.html (100%) rename {toolbox => www/toolbox}/idea-board/index.html (100%) rename {toolbox => www/toolbox}/index.html (100%) rename {toolbox => www/toolbox}/input-mapping-v2/index.html (100%) rename {toolbox => www/toolbox}/languages/index.html (100%) rename {toolbox => www/toolbox}/marketplace/index.html (100%) rename {toolbox => www/toolbox}/messages/index.html (100%) rename {toolbox => www/toolbox}/messages/message-tts-service-registry.js (93%) rename {toolbox => www/toolbox}/messages/messages-api-client.js (98%) rename {toolbox => www/toolbox}/messages/messages.js (99%) rename {toolbox => www/toolbox}/midi/index.html (100%) rename {toolbox => www/toolbox}/music/index.html (100%) rename {toolbox => www/toolbox}/objects/index.html (100%) rename {toolbox => www/toolbox}/particles/index.html (100%) rename {toolbox => www/toolbox}/performance/index.html (100%) rename {toolbox => www/toolbox}/platform-settings/index.html (100%) rename {toolbox => www/toolbox}/project-workspace/index.html (100%) rename {toolbox => www/toolbox}/publish/index.html (100%) rename {toolbox => www/toolbox}/ratings/index.html (100%) rename {toolbox => www/toolbox}/saved-data/index.html (100%) rename {toolbox => www/toolbox}/speech-to-text/index.html (100%) rename {toolbox => www/toolbox}/sprites/index.html (100%) rename {toolbox => www/toolbox}/tags/index.html (100%) rename {toolbox => www/toolbox}/text-to-speech/index.html (100%) rename {toolbox => www/toolbox}/tool-registry-api-client.js (99%) rename {toolbox => www/toolbox}/toolRegistry.js (96%) rename {toolbox => www/toolbox}/tools-page-accordions.js (99%) rename {toolbox => www/toolbox}/users/index.html (100%) rename {toolbox => www/toolbox}/videos/index.html (100%) rename {toolbox => www/toolbox}/voices/index.html (100%) rename {toolbox => www/toolbox}/worlds/index.html (100%) diff --git a/dev/build/ProjectInstructions/PROJECT_INSTRUCTIONS.md b/dev/build/ProjectInstructions/PROJECT_INSTRUCTIONS.md index 3a6047dc0..febd6861c 100644 --- a/dev/build/ProjectInstructions/PROJECT_INSTRUCTIONS.md +++ b/dev/build/ProjectInstructions/PROJECT_INSTRUCTIONS.md @@ -117,7 +117,7 @@ Rules: ## Current Version/Date -- Project Instructions Version: 2026.06.28.007 +- Project Instructions Version: 2026.06.28.008 - Date: 2026-06-28 - Owner: OWNER diff --git a/dev/build/ProjectInstructions/PROJECT_INSTRUCTIONS_VERSION.md b/dev/build/ProjectInstructions/PROJECT_INSTRUCTIONS_VERSION.md index b44470158..6ffb05a98 100644 --- a/dev/build/ProjectInstructions/PROJECT_INSTRUCTIONS_VERSION.md +++ b/dev/build/ProjectInstructions/PROJECT_INSTRUCTIONS_VERSION.md @@ -1,6 +1,6 @@ # Project Instructions Version -Current Project Instructions Version: 2026.06.28.007 +Current Project Instructions Version: 2026.06.28.008 Last Updated: 2026-06-28 @@ -15,6 +15,7 @@ Last Updated: 2026-06-28 - Added repository layout scaffold governance for `www/`, `api/`, and `dev/local-runtime/`. - Added `www/` migration map for safe browser-served application movement planning. - Added local route-root compatibility toggle documentation for future `www/` activation. +- Moved browser-served application files under `www/` and made local static serving prefer `www/` by default. - Codex must read this version file and the latest repository copy of `PROJECT_INSTRUCTIONS.md` before performing work. - Codex must discard previously remembered Project Instructions and treat the repository copy as authoritative. - Codex must validate canonical report and ZIP paths, branching model, and legacy path avoidance before work proceeds. diff --git a/dev/build/ProjectInstructions/PROJECT_STATE.md b/dev/build/ProjectInstructions/PROJECT_STATE.md index 6b22eb153..aea9601ef 100644 --- a/dev/build/ProjectInstructions/PROJECT_STATE.md +++ b/dev/build/ProjectInstructions/PROJECT_STATE.md @@ -1,7 +1,7 @@ # Project State ```yaml -project_state_version: "2026.06.28.007" +project_state_version: "2026.06.28.008" last_updated: "2026-06-28" current_main_commit: "40de767476d70cadfd1292c916844c2f31b6f185" repository_status: @@ -10,9 +10,9 @@ repository_status: runtime_database: "Postgres" creator_metadata: "API to Postgres" creator_assets: "API to R2" -project_instructions_version: "2026.06.28.007" -repository_structure_version: "2026.06.28.007" -canonical_layout_version: "2026.06.28.007" +project_instructions_version: "2026.06.28.008" +repository_structure_version: "2026.06.28.008" +canonical_layout_version: "2026.06.28.008" active_teams: - "Owner" - "Alfa" @@ -20,26 +20,13 @@ active_teams: - "Charlie" - "Delta" - "Golf" -latest_owner_pr: "PR_26180_OWNER_007-www-route-root-compatibility" -latest_structure_pr: "PR_26180_OWNER_007-www-route-root-compatibility" +latest_owner_pr: "PR_26180_OWNER_008-move-www-application" +latest_structure_pr: "PR_26180_OWNER_008-move-www-application" valid_top_level_folders: - - "account/" - - "admin/" - "api/" - - "assets/" - - "community/" - - "company/" - "deploy/" - "dev/" - - "docs/" - - "games/" - - "learn/" - - "legal/" - - "marketplace/" - - "memberships/" - - "owner/" - "src/" - - "toolbox/" - "www/" valid_dev_folders: - "dev/archive/" diff --git a/dev/build/ProjectInstructions/backlog/BACKLOG_MASTER.md b/dev/build/ProjectInstructions/backlog/BACKLOG_MASTER.md index 3c52cbced..6b947089c 100644 --- a/dev/build/ProjectInstructions/backlog/BACKLOG_MASTER.md +++ b/dev/build/ProjectInstructions/backlog/BACKLOG_MASTER.md @@ -39,9 +39,9 @@ The backlog is the authoritative source for determining the next logical PRs. - Team: Owner - Product Area: Repository Architecture Simplification - Status: Active -- Percent Complete: 20% -- Active PR: PR_26180_OWNER_007-www-route-root-compatibility -- Next Milestone: Move browser-served application to `www/` +- Percent Complete: 30% +- Active PR: PR_26180_OWNER_008-move-www-application +- Next Milestone: Move server/API application files into `api/` - Source / Reference: `dev/build/ProjectInstructions/repository/repository_layout_architecture_plan.md`; `dev/build/ProjectInstructions/repository/www_migration_map.md` ## Game Journey MVP diff --git a/dev/build/ProjectInstructions/repository/canonical_repository_structure.md b/dev/build/ProjectInstructions/repository/canonical_repository_structure.md index 4c9e960f3..7ef868a5b 100644 --- a/dev/build/ProjectInstructions/repository/canonical_repository_structure.md +++ b/dev/build/ProjectInstructions/repository/canonical_repository_structure.md @@ -7,36 +7,19 @@ Establish the canonical repository structure for future development and reduce t ## Canonical Structure Valid top-level folders: -- account/ -- admin/ - api/ -- assets/ -- community/ -- company/ - deploy/ - dev/ -- docs/ -- games/ -- learn/ -- legal/ -- marketplace/ -- memberships/ -- owner/ - src/ -- toolbox/ - www/ Root product and repo sections: -- account/, admin/, community/, company/, learn/, legal/, marketplace/, memberships/, and owner/ are production website sections. -- assets/ contains production website and tool assets. +- www/ owns browser-served production website sections, Creator toolbox pages, public game discovery, production Docs & Help, and browser assets. - api/ is the target Node/API/server application surface for the repository layout simplification workstream. -- docs/ is production Docs & Help content. -- games/ is public game discovery. -- toolbox/ is the Creator toolbox/workspace. - deploy/ contains deployment configuration. - dev/ contains the development workspace. - src/ contains deployable application/runtime/API source. -- www/ is the target browser-served application surface for the repository layout simplification workstream. +- repository root contains standard repository configuration and top-level application shells only. Deployable application source: - src/web/{feature-name}/ @@ -75,19 +58,19 @@ Dev workspace ownership: - dev/tools/ owns development-only tooling. - dev/workspace/ owns generated output: tmp, zips, logs, generated files, and test-results. -Tools: -- toolbox/{tool-name}/index.html +Browser-served tools: +- www/toolbox/{tool-name}/index.html -Tool assets: -- assets/toolbox/{tool-name}/js/index.js -- assets/toolbox/{tool-name}/css/index.css +Browser-served tool assets: +- www/assets/toolbox/{tool-name}/js/index.js +- www/assets/toolbox/{tool-name}/css/index.css Themes: -- assets/theme-v1/ -- assets/theme-v2/ +- www/assets/theme-v1/ +- www/assets/theme-v2/ Shared JavaScript: -- assets/js/shared/ +- www/assets/js/shared/ Legacy transition buckets: - src/advanced/ @@ -101,16 +84,16 @@ These legacy transition buckets may remain until explicit migration PRs move the ## Rules -- Root is production website and standard repository configuration only. -- www/ is the browser-served application target surface for migration. +- Root is standard repository configuration and top-level application shells only. +- www/ is the browser-served application surface. - api/ is the Node/API/server application target surface for migration. - src/ is deployable application/runtime/API code. - dev/ is development workspace only. - deploy/ is deployment configuration. -- docs/ is production Docs & Help content. +- docs/ routes are served from `www/docs/`. - Theme first. - Tool CSS second. -- Shared functionality belongs in assets/js/shared/. +- Browser-served shared functionality belongs in `www/assets/js/shared/`. - No new scattered JS folders. - No new scattered CSS folders. - Do not create new folders unless they fit the documented canonical structure. diff --git a/dev/build/ProjectInstructions/repository/repository_layout_architecture_plan.md b/dev/build/ProjectInstructions/repository/repository_layout_architecture_plan.md index 3a33327a5..1d8c86f8b 100644 --- a/dev/build/ProjectInstructions/repository/repository_layout_architecture_plan.md +++ b/dev/build/ProjectInstructions/repository/repository_layout_architecture_plan.md @@ -116,37 +116,42 @@ Rules: - Document current browser-served root paths, imports, local server behavior, test assumptions, compatibility needs, and validation lanes. - Do not move browser files or change package commands. -3. `PR_26180_OWNER_007-move-www-application` +3. `PR_26180_OWNER_007-www-route-root-compatibility` + - Prepare runtime/test route-root compatibility for the future `www/` move. + - Preserve public URLs. + - Keep repository-root serving as the default until the actual move. + +4. `PR_26180_OWNER_008-move-www-application` - Move browser-served application files into `www/`. - Include root HTML pages, `assets/`, `toolbox/`, `account/`, `legal/`, `learn/`, `play/`, and other browser-served static routes. - Update internal static references only as needed. - Do not move API/server files. -4. `PR_26180_OWNER_008-move-api-application` +5. `PR_26180_OWNER_009-move-api-application` - Move server/API application files into `api/`. - Include Local API server runtime files, API routes, services, database, storage, auth, publishing, and admin server code. - Do not move developer-only startup orchestration. - Browser code must not import from `api/`. -5. `PR_26180_OWNER_009-move-dev-local-runtime` +6. `PR_26180_OWNER_010-move-dev-local-runtime` - Move developer-only local runtime into `dev/local-runtime/`. - Include team-aware bootstrap, port config, local startup orchestration, local diagnostics, and browser launch support. - Update `package.json` commands to point to the new local-runtime paths. -6. `PR_26180_OWNER_010-move-tests-and-validation` +7. `PR_26180_OWNER_011-move-tests-and-validation` - Ensure all tests and validation suites live under `dev/tests/` or the current canonical dev test structure. - Update test paths after the `www/`, `api/`, and `dev/` migrations. - Do not change behavior. -7. `PR_26180_OWNER_011-update-ci-and-scripts` +8. `PR_26180_OWNER_012-update-ci-and-scripts` - Update CI, package scripts, validation scripts, and developer utilities for the new layout. - Preserve `npm run dev:bootstrap`, `npm run dev:api`, `npm run dev:web`, and `npm run dev:local-api`. -8. `PR_26180_OWNER_012-remove-legacy-layout` +9. `PR_26180_OWNER_013-remove-legacy-layout` - Remove or retire obsolete legacy paths after all references are updated. - Hard stop if any runtime, test, or CI reference still points to old locations. -9. `PR_26180_OWNER_013-final-layout-validation` +10. `PR_26180_OWNER_014-final-layout-validation` - Validate final repository layout. - Confirm `www/` owns the browser-served app, `api/` owns the server app, and `dev/` owns the developer workspace. - Confirm runtime does not depend on `dev/`, browser code does not import `api/`, and legacy references are removed or documented. diff --git a/dev/build/ProjectInstructions/repository/www_migration_map.md b/dev/build/ProjectInstructions/repository/www_migration_map.md index 82f351cd9..a137d5104 100644 --- a/dev/build/ProjectInstructions/repository/www_migration_map.md +++ b/dev/build/ProjectInstructions/repository/www_migration_map.md @@ -1,27 +1,27 @@ # www Migration Map -Status: Active planning map +Status: Implemented migration map Owner: Owner Workstream: Repository Architecture Simplification -PR: PR_26180_OWNER_006-www-migration-map +PR: PR_26180_OWNER_006-www-migration-map; PR_26180_OWNER_008-move-www-application ## Purpose Document the current browser-served repository surface and the safe sequence required before moving files into `www/`. -This map is a no-runtime-change governance artifact. It does not move browser files, change package commands, change local server behavior, or update runtime imports. +This map began as a no-runtime-change governance artifact. `PR_26180_OWNER_008-move-www-application` used it to move browser-served files under `www/` while preserving public URLs. ## Executive Summary -The browser-served application currently depends on repository-root static serving. +The browser-served application now lives under `www/`. -Current local runtime, test helpers, and browser pages assume URLs such as `/index.html`, `/toolbox/index.html`, `/assets/theme-v2/css/theme.css`, `/account/sign-in.html`, `/admin/system-health.html`, and `/games/index.html` resolve from the repository root. +Current local runtime, test helpers, and browser pages keep URLs such as `/index.html`, `/toolbox/index.html`, `/assets/theme-v2/css/theme.css`, `/account/sign-in.html`, `/admin/system-health.html`, and `/games/index.html` while resolving browser-served files from `www/`. -Moving browser files into `www/` is feasible, but the move must preserve public route URLs while changing the filesystem lookup root. A direct folder move without route compatibility would break Playwright tests, local API static serving, team-aware bootstrap static serving, Node test root aliases, and browser imports that still reference root-level `src/`, `toolbox/`, and `assets/`. +The move preserved public route URLs while changing the filesystem lookup root. Repository-root fallback remains available for transition-only compatibility, including browser imports that still reference root-level `src/`. ## Current Browser-Served Surface -Current root-level browser-served entry points and folders include: +Current browser-served entry points and folders now live under `www/`: | Path | Current role | Files | HTML files | Move target | | --- | --- | ---: | ---: | --- | @@ -75,7 +75,7 @@ These URLs should continue working for users and tests during the move: - `/marketplace/index.html` - `/memberships/index.html` -### Rewrite filesystem lookup paths +### Rewritten filesystem lookup paths Static servers and test helpers should map public URLs to `www/` filesystem paths after the move: @@ -172,17 +172,21 @@ Recommended approach for the actual move PR: ## Route Root Compatibility Toggle -`PR_26180_OWNER_007-www-route-root-compatibility` installs the local compatibility switch without moving browser files. +`PR_26180_OWNER_007-www-route-root-compatibility` installed the local compatibility switch without moving browser files. -The future activation toggle is: +`PR_26180_OWNER_008-move-www-application` moves browser-served files into `www/` and makes local static serving prefer `www/` by default. + +The local static serving root is now `www/` by default. The explicit activation toggle remains: ```text GAMEFOUNDRY_LOCAL_WEB_ROOT=www ``` -Default behavior remains current repository-root static serving when `GAMEFOUNDRY_LOCAL_WEB_ROOT` is unset, empty, `.`, `root`, or `repo-root`. +Default behavior is now `www/` static serving when `GAMEFOUNDRY_LOCAL_WEB_ROOT` is unset or empty. + +When `GAMEFOUNDRY_LOCAL_WEB_ROOT=www`, local static serving explicitly prefers `www/` for public browser URLs while retaining repository-root fallback for compatibility during migration. -When `GAMEFOUNDRY_LOCAL_WEB_ROOT=www`, local static serving prefers `www/` for public browser URLs while retaining repository-root fallback for compatibility during migration. +When local validation needs the prior root behavior, `GAMEFOUNDRY_LOCAL_WEB_ROOT=repo-root` resolves static files from the repository root. This toggle is for local runtime and test helpers only. It does not change production deployment, public URLs, API routes, or package commands. diff --git a/dev/reports/PR_26180_OWNER_008-move-www-application_branch-validation.md b/dev/reports/PR_26180_OWNER_008-move-www-application_branch-validation.md new file mode 100644 index 000000000..c2dde918f --- /dev/null +++ b/dev/reports/PR_26180_OWNER_008-move-www-application_branch-validation.md @@ -0,0 +1,26 @@ +# PR_26180_OWNER_008 Branch Validation + +## Result + +PASS + +## Checks + +| Check | Result | +|---|---| +| Startup validation completed | PASS | +| Project Instructions version loaded | PASS: `2026.06.28.007` at task start; PR updates docs to `2026.06.28.008` | +| `PROJECT_BRANCHING_POLICY.md` loaded | PASS | +| Current branch | PASS: `PR_26180_OWNER_008-move-www-application` | +| Stacked base branch | PASS: created from `PR_26180_OWNER_007-www-route-root-compatibility` | +| Worktree before branch creation | PASS: clean | +| Reports path | PASS: `dev/reports/` | +| ZIP path | PASS: `dev/workspace/zips/` | + +## Dependency Order + +1. `PR_26180_OWNER_006-www-migration-map` +2. `PR_26180_OWNER_007-www-route-root-compatibility` +3. `PR_26180_OWNER_008-move-www-application` + +PR008 must be reviewed and merged after PR007. diff --git a/dev/reports/PR_26180_OWNER_008-move-www-application_manual-validation-notes.md b/dev/reports/PR_26180_OWNER_008-move-www-application_manual-validation-notes.md new file mode 100644 index 000000000..9a61fde79 --- /dev/null +++ b/dev/reports/PR_26180_OWNER_008-move-www-application_manual-validation-notes.md @@ -0,0 +1,24 @@ +# PR_26180_OWNER_008 Manual Validation Notes + +## Manual Notes + +`npm run dev:bootstrap -- --team owner` is a long-running local startup command that launches the Owner web/API runtime and may open a browser. It was documented as manual validation rather than left running during this Codex execution. + +Expected manual verification: + +1. Run `npm run dev:bootstrap -- --team owner`. +2. Confirm diagnostics show Owner/default ports: + - Web URL: `http://127.0.0.1:5500` + - API URL: `http://127.0.0.1:5501/api` + - Browser launch: `http://127.0.0.1:5500/index.html` +3. Open: + - `http://127.0.0.1:5500/index.html` + - `http://127.0.0.1:5500/toolbox/index.html` + - `http://127.0.0.1:5500/account/sign-in.html` + - `http://127.0.0.1:5500/admin/system-health.html` + - `http://127.0.0.1:5500/games/index.html` +4. Confirm public URLs remain unchanged while files are served from `www/`. + +## Local Artifact Note + +An ignored local file, `assets/DemoGame-26168-001.gfsp`, keeps a physical `assets/` folder visible in this checkout. It is not tracked and was not moved or committed. diff --git a/dev/reports/PR_26180_OWNER_008-move-www-application_report.md b/dev/reports/PR_26180_OWNER_008-move-www-application_report.md new file mode 100644 index 000000000..66b72b3eb --- /dev/null +++ b/dev/reports/PR_26180_OWNER_008-move-www-application_report.md @@ -0,0 +1,59 @@ +# PR_26180_OWNER_008-move-www-application Report + +## Executive Summary + +PASS. This PR moves the tracked browser-served application surface into `www/` while preserving the public URL contract. + +The move uses the PR007 route-root compatibility helper. Local static serving now prefers `www/` by default, and repository-root fallback remains available for transition-only compatibility such as root `src/` imports. + +## Scope + +- Moved root browser-served files and folders into `www/`. +- Preserved public URLs such as `/index.html`, `/toolbox/index.html`, `/assets/...`, `/account/...`, `/admin/...`, and `/games/...`. +- Did not move API/server application code into `api/`. +- Did not move dev-only tooling into `dev/local-runtime/`. +- Did not change package commands. +- Did not add feature work or product behavior changes. + +## Browser-Served Routes Moved + +- `index.html` -> `www/index.html` +- `account/` -> `www/account/` +- `admin/` -> `www/admin/` +- `assets/` -> `www/assets/` +- `community/` -> `www/community/` +- `company/` -> `www/company/` +- `docs/` -> `www/docs/` +- `games/` -> `www/games/` +- `learn/` -> `www/learn/` +- `legal/` -> `www/legal/` +- `marketplace/` -> `www/marketplace/` +- `memberships/` -> `www/memberships/` +- `owner/` -> `www/owner/` +- `toolbox/` -> `www/toolbox/` + +No tracked root `play/` folder existed. + +## Implementation Notes + +- `DEFAULT_LOCAL_WEB_ROOT` now points to `www`. +- `GAMEFOUNDRY_LOCAL_WEB_ROOT=www` remains the explicit local web-root setting. +- `GAMEFOUNDRY_LOCAL_WEB_ROOT=repo-root` remains available for transition validation. +- Node-side imports and validation scripts that read moved browser assets/toolbox files were updated to use `www/...` filesystem paths. +- Browser-visible route strings were preserved. +- `dev/build/ProjectInstructions` docs and backlog status were updated for PR008. + +## Staged Delta Summary + +- Changed files: 515 +- Renames/moves: 482 +- Modified files: 32 +- Deleted placeholder: 1 (`www/.gitkeep`) + +## Notes + +The root `assets/` folder may still physically exist in this local checkout because of an ignored local file (`assets/DemoGame-26168-001.gfsp`). No tracked browser files remain under the old root browser route folders. + +## Owner Recommendation + +Ready for review as the `www/` application move step in the repository architecture simplification stack. diff --git a/dev/reports/PR_26180_OWNER_008-move-www-application_requirement-checklist.md b/dev/reports/PR_26180_OWNER_008-move-www-application_requirement-checklist.md new file mode 100644 index 000000000..5730b9278 --- /dev/null +++ b/dev/reports/PR_26180_OWNER_008-move-www-application_requirement-checklist.md @@ -0,0 +1,27 @@ +# PR_26180_OWNER_008 Requirement Checklist + +| Requirement | Result | Evidence | +|---|---|---| +| Base on `PR_26180_OWNER_007-www-route-root-compatibility` | PASS | Branch created from PR007. | +| Use PR007 compatibility support | PASS | Local static serving uses shared route-root resolver. | +| Set local web root to `www` where appropriate | PASS | `DEFAULT_LOCAL_WEB_ROOT` now resolves to `www`. | +| Preserve public URLs | PASS | Targeted Node and Playwright route tests pass for preserved route families. | +| Move root HTML pages | PASS | `index.html` moved to `www/index.html`. | +| Move `assets/` | PASS | Tracked files moved to `www/assets/`. | +| Move `toolbox/` | PASS | Tracked files moved to `www/toolbox/`. | +| Move `account/` | PASS | Tracked files moved to `www/account/`. | +| Move `legal/` | PASS | Tracked files moved to `www/legal/`. | +| Move `learn/` | PASS | Tracked files moved to `www/learn/`. | +| Move `play/` | PASS | No tracked root `play/` folder existed. | +| Move `admin/` | PASS | Tracked files moved to `www/admin/`. | +| Move `games/` | PASS | Tracked files moved to `www/games/`. | +| Move other browser-served static routes | PASS | `community/`, `company/`, `docs/`, `marketplace/`, `memberships/`, and `owner/` moved under `www/`. | +| Do not move API/server code | PASS | API/server application files were not moved into `api/`. | +| Do not move dev-only tooling | PASS | Dev-only tooling remained under `dev/`. | +| Do not change product behavior | PASS | Browser route URLs were preserved; changes are path migration only. | +| Required reports created | PASS | Report files exist under `dev/reports/`. | +| Required ZIP created | PASS | ZIP generated under `dev/workspace/zips/`. | + +## Result + +PASS diff --git a/dev/reports/PR_26180_OWNER_008-move-www-application_validation-report.md b/dev/reports/PR_26180_OWNER_008-move-www-application_validation-report.md new file mode 100644 index 000000000..2f26b4dd0 --- /dev/null +++ b/dev/reports/PR_26180_OWNER_008-move-www-application_validation-report.md @@ -0,0 +1,43 @@ +# PR_26180_OWNER_008 Validation Report + +## Required Validation + +| Command | Result | +|---|---| +| `node --check` on 68 changed JS/MJS files | PASS | +| `node ./dev/scripts/run-node-test-files.mjs dev/tests/dev-runtime/StaticWebRootCompatibility.test.mjs` | PASS | +| `npx playwright test dev/tests/playwright/tools/StaticWebRootCompatibility.spec.mjs --reporter=line` | PASS: 2/2 | +| `git diff --check` | PASS | +| `npm run validate:canonical-structure` | PASS | + +## Targeted Route Coverage + +The targeted Playwright smoke confirms 200 responses for: + +- `/index.html` +- `/toolbox/index.html` +- `/assets/theme-v2/css/theme.css` +- `/account/sign-in.html` +- `/admin/system-health.html` +- `/games/index.html` + +The targeted Node test confirms: + +- default local web root resolves to `www` +- `GAMEFOUNDRY_LOCAL_WEB_ROOT=repo-root` resolves to repository root +- public route normalization remains stable +- configurable web root serving works + +## Informational Non-Blocking Checks + +Additional helper checks were attempted and are not part of the required validation lane: + +- `node ./dev/scripts/validate-tool-registry.mjs` failed on existing registry/content assertions unrelated to this path move. +- `node ./dev/scripts/validate-active-tools-surface.mjs` failed on existing active-tool content assertions unrelated to this path move. +- `npm run validate:browser-env-agnostic` failed on existing product-data contract assertions unrelated to this path move. + +Generated report deltas from those exploratory checks were restored and are not part of this PR. + +## Result + +PASS for required validation. diff --git a/dev/reports/codex_changed_files.txt b/dev/reports/codex_changed_files.txt index 5dc4818136fddf568c53c39dcc6c85703bf5f14c..fb58aad6adb8a54c97c723b86f0861968cb0e34e 100644 GIT binary patch literal 46382 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 delta 126 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 diff --git a/dev/scripts/validate-active-tools-surface.mjs b/dev/scripts/validate-active-tools-surface.mjs index a7efb7220..b726bd83b 100644 --- a/dev/scripts/validate-active-tools-surface.mjs +++ b/dev/scripts/validate-active-tools-surface.mjs @@ -5,7 +5,7 @@ import { fileURLToPath } from "node:url"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const repoRoot = path.resolve(__dirname, "../.."); -const toolboxRoot = path.join(repoRoot, "toolbox"); +const toolboxRoot = path.join(repoRoot, "www", "toolbox"); const NON_TOOLBOX_PAGE_FOLDERS = new Set([ "learn", "users", @@ -15,10 +15,10 @@ const NON_TOOLBOX_PAGE_FOLDERS = new Set([ ]); const ACTIVE_NAV_TARGETS = [ - "assets/theme-v2/partials/header-nav.html", - "assets/theme-v2/js/gamefoundry-partials.js", - "toolbox/index.html", - "toolbox/tools-page-accordions.js" + "www/assets/theme-v2/partials/header-nav.html", + "www/assets/theme-v2/js/gamefoundry-partials.js", + "www/toolbox/index.html", + "www/toolbox/tools-page-accordions.js" ]; const RETIRED_ACTIVE_PATTERNS = [ @@ -83,11 +83,11 @@ async function main() { } } - const headerNav = await readText("assets/theme-v2/partials/header-nav.html"); - const partials = await readText("assets/theme-v2/js/gamefoundry-partials.js"); - const toolboxIndex = await readText("toolbox/index.html"); - const toolsAccordions = await readText("toolbox/tools-page-accordions.js"); - const toolRegistry = await readText("toolbox/toolRegistry.js"); + const headerNav = await readText("www/assets/theme-v2/partials/header-nav.html"); + const partials = await readText("www/assets/theme-v2/js/gamefoundry-partials.js"); + const toolboxIndex = await readText("www/toolbox/index.html"); + const toolsAccordions = await readText("www/toolbox/tools-page-accordions.js"); + const toolRegistry = await readText("www/toolbox/toolRegistry.js"); for (const folderName of activeTools) { const route = routeForTool(folderName); diff --git a/dev/scripts/validate-browser-env-agnostic.mjs b/dev/scripts/validate-browser-env-agnostic.mjs index 048d2a51c..64232b2f0 100644 --- a/dev/scripts/validate-browser-env-agnostic.mjs +++ b/dev/scripts/validate-browser-env-agnostic.mjs @@ -1,4 +1,4 @@ -import fs from "node:fs/promises"; +import fs from "node:fs/promises"; import path from "node:path"; const repoRoot = process.cwd(); @@ -6,7 +6,7 @@ const reportPath = path.join(repoRoot, "dev", "reports", "environment_agnostic_b const browserScanRoots = [ "account", "admin", - "assets/theme-v2/js", + "www/assets/theme-v2/js", "toolbox", "src/engine", ]; @@ -56,42 +56,42 @@ const deploymentTernaryDecisionPattern = /(?:GAMEFOUNDRY_(?:ENV|DEPLOYMENT_ENV|S const accountDependencyPattern = new RegExp(`\\b(?:Local(?: DB| API)?|${retiredFileDbToken}|Supabase|provider|localhost|DEV|UAT|PROD|Prod)\\b|data-local-db-|local-db-page-data\\.js`, "i"); const userFacingImplementationPattern = new RegExp(`\\b(?:DEV|UAT|PROD|Local DB|Local API|${retiredFileDbToken}|Supabase|provider)\\b`, "i"); const accountBrowserFiles = new Set([ - "assets/theme-v2/js/account-auth-actions.js", - "assets/theme-v2/js/account-auth-service.js", - "assets/theme-v2/js/account-page-data.js", - "assets/theme-v2/js/login-session.js", + "www/assets/theme-v2/js/account-auth-actions.js", + "www/assets/theme-v2/js/account-auth-service.js", + "www/assets/theme-v2/js/account-page-data.js", + "www/assets/theme-v2/js/login-session.js", ]); const accountAuthPages = Object.freeze([ Object.freeze({ expectedScript: "../assets/theme-v2/js/login-session.js", formAttribute: "data-login-form", - page: "account/sign-in.html", + page: "www/account/sign-in.html", }), Object.freeze({ expectedScript: "../assets/theme-v2/js/account-auth-actions.js", formAttribute: "data-account-auth-form=\"create-account\"", - page: "account/create-account.html", + page: "www/account/create-account.html", }), Object.freeze({ expectedScript: "../assets/theme-v2/js/account-auth-actions.js", formAttribute: "data-account-auth-form=\"password-reset\"", - page: "account/password-reset.html", + page: "www/account/password-reset.html", }), ]); const productApiClientFiles = Object.freeze([ - "assets/js/shared/assets-api-client.js", - "assets/toolbox/colors/js/index.js", - "assets/js/shared/controls-api-client.js", - "assets/toolbox/game-configuration/js/index.js", - "assets/toolbox/game-design/js/index.js", - "assets/js/shared/game-journey-api-client.js", - "toolbox/game-hub/game-hub-api-client.js", - "assets/toolbox/objects/js/index.js", - "assets/toolbox/tags/js/index.js", + "www/assets/js/shared/assets-api-client.js", + "www/assets/toolbox/colors/js/index.js", + "www/assets/js/shared/controls-api-client.js", + "www/assets/toolbox/game-configuration/js/index.js", + "www/assets/toolbox/game-design/js/index.js", + "www/assets/js/shared/game-journey-api-client.js", + "www/toolbox/game-hub/game-hub-api-client.js", + "www/assets/toolbox/objects/js/index.js", + "www/assets/toolbox/tags/js/index.js", ]); -const userFacingUiRoots = Object.freeze(["account", "toolbox"]); +const userFacingUiRoots = Object.freeze(["www/account", "www/toolbox"]); const nonUiCompatibilityFiles = new Set([ - "toolbox/toolRegistry.js", + "www/toolbox/toolRegistry.js", ]); const deprecatedLocalDbDebt = Object.freeze([]); @@ -291,30 +291,30 @@ async function validateAccountServiceContract() { ); } - const authActions = await readRequiredRepoFile("assets/theme-v2/js/account-auth-actions.js", findings, "Account auth actions module is missing"); - requireSnippet(authActions, "assets/theme-v2/js/account-auth-actions.js", "./account-auth-service.js", findings, "Create/reset actions must use the shared account auth service module."); - requireSnippet(authActions, "assets/theme-v2/js/account-auth-actions.js", "requestAccountAuth(endpoint", findings, "Create/reset actions must call requestAccountAuth through the service contract."); - rejectPattern(authActions, "assets/theme-v2/js/account-auth-actions.js", /\bfetch\s*\(/, findings, "Create/reset actions must not call fetch directly."); + const authActions = await readRequiredRepoFile("www/assets/theme-v2/js/account-auth-actions.js", findings, "Account auth actions module is missing"); + requireSnippet(authActions, "www/assets/theme-v2/js/account-auth-actions.js", "./account-auth-service.js", findings, "Create/reset actions must use the shared account auth service module."); + requireSnippet(authActions, "www/assets/theme-v2/js/account-auth-actions.js", "requestAccountAuth(endpoint", findings, "Create/reset actions must call requestAccountAuth through the service contract."); + rejectPattern(authActions, "www/assets/theme-v2/js/account-auth-actions.js", /\bfetch\s*\(/, findings, "Create/reset actions must not call fetch directly."); - const loginSession = await readRequiredRepoFile("assets/theme-v2/js/login-session.js", findings, "Login session module is missing"); - requireSnippet(loginSession, "assets/theme-v2/js/login-session.js", "./account-auth-service.js", findings, "Sign-in flow must use the shared account auth service module."); - requireSnippet(loginSession, "assets/theme-v2/js/login-session.js", "requestAccountAuth(SIGN_IN_ACTION", findings, "Sign-in flow must call requestAccountAuth through the service contract."); - requireSnippet(loginSession, "assets/theme-v2/js/login-session.js", "requestCurrentSession(", findings, "Sign-in flow must resolve sessions through requestCurrentSession."); - rejectPattern(loginSession, "assets/theme-v2/js/login-session.js", /\bfetch\s*\(/, findings, "Sign-in flow must not call fetch directly."); + const loginSession = await readRequiredRepoFile("www/assets/theme-v2/js/login-session.js", findings, "Login session module is missing"); + requireSnippet(loginSession, "www/assets/theme-v2/js/login-session.js", "./account-auth-service.js", findings, "Sign-in flow must use the shared account auth service module."); + requireSnippet(loginSession, "www/assets/theme-v2/js/login-session.js", "requestAccountAuth(SIGN_IN_ACTION", findings, "Sign-in flow must call requestAccountAuth through the service contract."); + requireSnippet(loginSession, "www/assets/theme-v2/js/login-session.js", "requestCurrentSession(", findings, "Sign-in flow must resolve sessions through requestCurrentSession."); + rejectPattern(loginSession, "www/assets/theme-v2/js/login-session.js", /\bfetch\s*\(/, findings, "Sign-in flow must not call fetch directly."); - const accountService = await readRequiredRepoFile("assets/theme-v2/js/account-auth-service.js", findings, "Account auth service module is missing"); - requireSnippet(accountService, "assets/theme-v2/js/account-auth-service.js", "fetchServerApi(`/auth/${path}`", findings, "Account auth service must own configured /api/auth requests."); - requireSnippet(accountService, "assets/theme-v2/js/account-auth-service.js", "fetchServerApi(\"/session/current\"", findings, "Account auth service must own configured /api/session/current requests."); - rejectPattern(accountService, "assets/theme-v2/js/account-auth-service.js", providerLeakPattern, findings, "Account auth service must not expose provider or environment implementation details."); + const accountService = await readRequiredRepoFile("www/assets/theme-v2/js/account-auth-service.js", findings, "Account auth service module is missing"); + requireSnippet(accountService, "www/assets/theme-v2/js/account-auth-service.js", "fetchServerApi(`/auth/${path}`", findings, "Account auth service must own configured /api/auth requests."); + requireSnippet(accountService, "www/assets/theme-v2/js/account-auth-service.js", "fetchServerApi(\"/session/current\"", findings, "Account auth service must own configured /api/session/current requests."); + rejectPattern(accountService, "www/assets/theme-v2/js/account-auth-service.js", providerLeakPattern, findings, "Account auth service must not expose provider or environment implementation details."); return findings; } async function validateProductServiceContract() { const findings = []; - const registryClient = await readRequiredRepoFile("toolbox/tool-registry-api-client.js", findings, "Toolbox registry client is missing"); - requireSnippet(registryClient, "toolbox/tool-registry-api-client.js", "safeRequestServerApi(\"/toolbox/registry/snapshot\")", findings, "Toolbox registry must read through the server API service contract."); - rejectPattern(registryClient, "toolbox/tool-registry-api-client.js", providerLeakPattern, findings, "Toolbox registry client must not expose provider/environment implementation details."); + const registryClient = await readRequiredRepoFile("www/toolbox/tool-registry-api-client.js", findings, "Toolbox registry client is missing"); + requireSnippet(registryClient, "www/toolbox/tool-registry-api-client.js", "safeRequestServerApi(\"/toolbox/registry/snapshot\")", findings, "Toolbox registry must read through the server API service contract."); + rejectPattern(registryClient, "www/toolbox/tool-registry-api-client.js", providerLeakPattern, findings, "Toolbox registry client must not expose provider/environment implementation details."); const votesClient = await readRequiredRepoFile("src/api/toolbox-votes-api-client.js", findings, "Toolbox votes API client is missing"); requireSnippet(votesClient, "src/api/toolbox-votes-api-client.js", "safeRequestServerApi(\"/toolbox/votes/snapshot\")", findings, "Toolbox votes must read through the server API service contract."); diff --git a/dev/scripts/validate-canonical-repository-structure.mjs b/dev/scripts/validate-canonical-repository-structure.mjs index 507d8df89..85f25ee38 100644 --- a/dev/scripts/validate-canonical-repository-structure.mjs +++ b/dev/scripts/validate-canonical-repository-structure.mjs @@ -6,14 +6,14 @@ import { fileURLToPath } from "node:url"; const repoRoot = path.resolve(fileURLToPath(new URL("../..", import.meta.url))); export const APPROVED_LEGACY_JS_PATHS = Object.freeze(new Set([ - "toolbox/game-hub/game-hub-api-client.js", - "toolbox/game-hub/game-hub.js", - "toolbox/messages/message-tts-service-registry.js", - "toolbox/messages/messages-api-client.js", - "toolbox/messages/messages.js", - "toolbox/tool-registry-api-client.js", - "toolbox/toolRegistry.js", - "toolbox/tools-page-accordions.js", + "www/toolbox/game-hub/game-hub-api-client.js", + "www/toolbox/game-hub/game-hub.js", + "www/toolbox/messages/message-tts-service-registry.js", + "www/toolbox/messages/messages-api-client.js", + "www/toolbox/messages/messages.js", + "www/toolbox/tool-registry-api-client.js", + "www/toolbox/toolRegistry.js", + "www/toolbox/tools-page-accordions.js", "src/engine/paletteList.js", ])); @@ -91,8 +91,8 @@ function isCss(filePath) { } function relevantPath(filePath) { - return filePath.startsWith("assets/") || - filePath.startsWith("toolbox/") || + return filePath.startsWith("www/assets/") || + filePath.startsWith("www/toolbox/") || filePath.startsWith("src/engine/") || filePath.startsWith("dev/tests/"); } @@ -102,39 +102,39 @@ function record(severity, area, file, message, expected) { } function isCanonicalAssetJs(filePath) { - return /^assets\/toolbox\/[^/]+\/js\/index\.js$/.test(filePath) || - /^assets\/toolbox\/[^/]+\/js\/[^/]+-worker\.js$/.test(filePath) || - filePath.startsWith("assets/js/shared/") || - filePath.startsWith("assets/theme-v2/js/"); + return /^www\/assets\/toolbox\/[^/]+\/js\/index\.js$/.test(filePath) || + /^www\/assets\/toolbox\/[^/]+\/js\/[^/]+-worker\.js$/.test(filePath) || + filePath.startsWith("www/assets/js/shared/") || + filePath.startsWith("www/assets/theme-v2/js/"); } function isCanonicalAssetCss(filePath) { - return /^assets\/toolbox\/[^/]+\/css\/index\.css$/.test(filePath) || - filePath.startsWith("assets/theme-v2/css/") || - filePath.startsWith("assets/theme-v2/fonts/"); + return /^www\/assets\/toolbox\/[^/]+\/css\/index\.css$/.test(filePath) || + filePath.startsWith("www/assets/theme-v2/css/") || + filePath.startsWith("www/assets/theme-v2/fonts/"); } function auditJavaScript(filePath) { if (!isJavaScript(filePath)) { return null; } - if (filePath.startsWith("assets/") && !isCanonicalAssetJs(filePath)) { + if (filePath.startsWith("www/assets/") && !isCanonicalAssetJs(filePath)) { return record( "FAIL", "JS", filePath, - "JavaScript under assets must use assets/toolbox/{tool}/js/index.js, assets/toolbox/{tool}/js/{worker-name}.js for tool-local workers, assets/js/shared/, or assets/theme-v2/js/.", - "assets/toolbox/{tool}/js/index.js, assets/toolbox/{tool}/js/{worker-name}.js, or assets/js/shared/", + "JavaScript under www/assets must use www/assets/toolbox/{tool}/js/index.js, www/assets/toolbox/{tool}/js/{worker-name}.js for tool-local workers, www/assets/js/shared/, or www/assets/theme-v2/js/.", + "www/assets/toolbox/{tool}/js/index.js, www/assets/toolbox/{tool}/js/{worker-name}.js, or www/assets/js/shared/", ); } - if (filePath.startsWith("toolbox/")) { + if (filePath.startsWith("www/toolbox/")) { if (APPROVED_LEGACY_JS_PATHS.has(filePath)) { return record( "LEGACY", "JS", filePath, "Approved legacy toolbox JavaScript sidecar awaiting canonical migration.", - "assets/toolbox/{tool}/js/index.js, assets/toolbox/{tool}/js/{worker-name}.js, or assets/js/shared/", + "www/assets/toolbox/{tool}/js/index.js, www/assets/toolbox/{tool}/js/{worker-name}.js, or www/assets/js/shared/", ); } return record( @@ -142,7 +142,7 @@ function auditJavaScript(filePath) { "JS", filePath, "New or unapproved toolbox JavaScript sidecar is outside canonical structure.", - "assets/toolbox/{tool}/js/index.js or assets/js/shared/", + "www/assets/toolbox/{tool}/js/index.js or www/assets/js/shared/", ); } if (/^src\/engine\/[^/]+\.m?js$/.test(filePath)) { @@ -170,22 +170,22 @@ function auditCss(filePath) { if (!isCss(filePath)) { return null; } - if (filePath.startsWith("assets/") && !isCanonicalAssetCss(filePath)) { + if (filePath.startsWith("www/assets/") && !isCanonicalAssetCss(filePath)) { return record( "FAIL", "CSS", filePath, - "CSS under assets must use assets/toolbox/{tool}/css/index.css or assets/theme-v2/css/.", - "assets/toolbox/{tool}/css/index.css or assets/theme-v2/css/", + "CSS under www/assets must use www/assets/toolbox/{tool}/css/index.css or www/assets/theme-v2/css/.", + "www/assets/toolbox/{tool}/css/index.css or www/assets/theme-v2/css/", ); } - if (filePath.startsWith("toolbox/")) { + if (filePath.startsWith("www/toolbox/")) { return record( "FAIL", "CSS", filePath, "Toolbox CSS sidecar is outside canonical tool asset structure.", - "assets/toolbox/{tool}/css/index.css", + "www/assets/toolbox/{tool}/css/index.css", ); } if (filePath.startsWith("src/engine/") && APPROVED_LEGACY_CSS_PATHS.has(filePath)) { diff --git a/dev/scripts/validate-tool-registry.mjs b/dev/scripts/validate-tool-registry.mjs index 9d2b3e2bd..d147363eb 100644 --- a/dev/scripts/validate-tool-registry.mjs +++ b/dev/scripts/validate-tool-registry.mjs @@ -1,12 +1,12 @@ import fs from "node:fs/promises"; import path from "node:path"; import { fileURLToPath } from "node:url"; -import { getToolRegistry, getVisibleActiveToolRegistry } from "../toolbox/toolRegistry.js"; +import { getToolRegistry, getVisibleActiveToolRegistry } from "../../www/toolbox/toolRegistry.js"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const repoRoot = path.resolve(__dirname, "../.."); -const toolboxRoot = path.join(repoRoot, "toolbox"); +const toolboxRoot = path.join(repoRoot, "www", "toolbox"); const reportPath = path.join(repoRoot, "dev", "reports", "tool_registry_validation.txt"); const IGNORED_DIRECTORIES = new Set([ diff --git a/dev/tests/dev-runtime/AdminNotesBoundary.test.mjs b/dev/tests/dev-runtime/AdminNotesBoundary.test.mjs index c474d7223..c3c638959 100644 --- a/dev/tests/dev-runtime/AdminNotesBoundary.test.mjs +++ b/dev/tests/dev-runtime/AdminNotesBoundary.test.mjs @@ -1,4 +1,4 @@ -import assert from "node:assert/strict"; +import assert from "node:assert/strict"; import fs from "node:fs"; import path from "node:path"; import process from "node:process"; @@ -200,7 +200,7 @@ test("Owner Notes route is the only production-facing Admin Notes viewer route", }); test("production-facing paths only expose Admin Notes through Owner Notes", () => { - const headerSource = fs.readFileSync(repoPath("assets/theme-v2/partials/header-nav.html"), "utf8"); + const headerSource = fs.readFileSync(repoPath("www/assets/theme-v2/partials/header-nav.html"), "utf8"); assert.doesNotMatch(headerSource, /docs_build\/dev\/admin-notes|admin-notes-dev|data-admin-notes-local-menu|data-admin-my-stuff-menu|My Stuff|Admin Notes/); for (const label of devOnlyAdminLabels) { assert.doesNotMatch(headerSource, new RegExp(`>${label}<\\/a>`), `production Admin menu omits dev-only ${label}`); @@ -274,7 +274,7 @@ test("Admin Notes directory API is read-only, sorted, and restricted to dev/arch }); test("local header partial does not create a competing Admin Notes menu", () => { - const headerPath = repoPath("assets/theme-v2/partials/header-nav.html"); + const headerPath = repoPath("www/assets/theme-v2/partials/header-nav.html"); const source = fs.readFileSync(headerPath, "utf8"); const localHeaderPath = localAdminNotesHeaderPartialPath(repoRoot, headerPath); const servedHeader = fs.readFileSync(localHeaderPath, "utf8"); diff --git a/dev/tests/dev-runtime/ArchitectureCleanupApiNavInvitations.test.mjs b/dev/tests/dev-runtime/ArchitectureCleanupApiNavInvitations.test.mjs index 7f45ada4f..320c53ec0 100644 --- a/dev/tests/dev-runtime/ArchitectureCleanupApiNavInvitations.test.mjs +++ b/dev/tests/dev-runtime/ArchitectureCleanupApiNavInvitations.test.mjs @@ -1,4 +1,4 @@ -import fs from "node:fs"; +import fs from "node:fs"; import http from "node:http"; import test from "node:test"; import assert from "node:assert/strict"; @@ -157,7 +157,7 @@ test("dev-runtime boundary is documented for runtime implementation and not test }); test("Toolbox registry consumes shared metadata without importing dev-runtime", () => { - const registrySource = fs.readFileSync("toolbox/toolRegistry.js", "utf8"); + const registrySource = fs.readFileSync("www/toolbox/toolRegistry.js", "utf8"); const devRuntimeShim = fs.readFileSync("src/dev-runtime/guest-seeds/tool-metadata-inventory.js", "utf8"); assert.match(registrySource, /src\/shared\/toolbox\/tool-metadata-inventory\.js/); assert.doesNotMatch(registrySource, /src\/dev-runtime|src\\dev-runtime|dev-runtime\/guest-seeds/); diff --git a/dev/tests/dev-runtime/ProductDataProviderContractHardening.test.mjs b/dev/tests/dev-runtime/ProductDataProviderContractHardening.test.mjs index 772020f6a..a180a45e5 100644 --- a/dev/tests/dev-runtime/ProductDataProviderContractHardening.test.mjs +++ b/dev/tests/dev-runtime/ProductDataProviderContractHardening.test.mjs @@ -1,4 +1,4 @@ -import assert from "node:assert/strict"; +import assert from "node:assert/strict"; import { existsSync, readFileSync } from "node:fs"; import path from "node:path"; import { test } from "node:test"; @@ -10,7 +10,7 @@ function readRepoFile(filePath) { } function importRegistryClient(label) { - return import(`../../../toolbox/tool-registry-api-client.js?contract=${label}-${Date.now()}-${Math.random()}`); + return import(`../../../www/toolbox/tool-registry-api-client.js?contract=${label}-${Date.now()}-${Math.random()}`); } class RegistrySnapshotXhr { @@ -44,7 +44,7 @@ class RegistrySnapshotXhr { badge: "/assets/theme-v2/images/badges/contract-tool.png", tool: "/assets/theme-v2/images/tools/contract-tool.png", }, - route: "toolbox/contract-tool/index.html", + route: "www/toolbox/contract-tool/index.html", }], imageFallback: "/should-not-own-product-data.svg", readinessByStatus: { beta: "Yes" }, @@ -56,7 +56,7 @@ class RegistrySnapshotXhr { badge: "/assets/theme-v2/images/badges/contract-tool.png", tool: "/assets/theme-v2/images/tools/contract-tool.png", }, - route: "toolbox/contract-tool/index.html", + route: "www/toolbox/contract-tool/index.html", }], }, ok: true, @@ -104,7 +104,7 @@ test("Toolbox registry browser client consumes server API snapshot when availabl }); test("Active browser product-data entrypoints use API or service clients", () => { - const registryClient = readRepoFile("toolbox/tool-registry-api-client.js"); + const registryClient = readRepoFile("www/toolbox/tool-registry-api-client.js"); assert.doesNotMatch(registryClient, /activeTools:\s*\[\]/); assert.doesNotMatch(registryClient, /tools:\s*\[\]/); @@ -115,7 +115,7 @@ test("Active browser product-data entrypoints use API or service clients", () => "assets/toolbox/game-configuration/js/index.js", "assets/toolbox/game-design/js/index.js", "assets/js/shared/game-journey-api-client.js", - "toolbox/game-hub/game-hub-api-client.js", + "www/toolbox/game-hub/game-hub-api-client.js", "assets/toolbox/objects/js/index.js", "assets/toolbox/tags/js/index.js", ]; @@ -127,13 +127,13 @@ test("Active browser product-data entrypoints use API or service clients", () => }); assert.match(readRepoFile("admin/tool-votes.js"), /src\/engine\/api\/toolbox-votes-api-client\.js/); - assert.match(readRepoFile("toolbox/tools-page-accordions.js"), /src\/engine\/api\/toolbox-votes-api-client\.js/); + assert.match(readRepoFile("www/toolbox/tools-page-accordions.js"), /src\/engine\/api\/toolbox-votes-api-client\.js/); assert.match(readRepoFile("assets/theme-v2/js/account-achievements.js"), /createServerRepositoryClient\("game-hub"\)/); [ "admin/tool-votes.js", "assets/theme-v2/js/account-achievements.js", - "toolbox/tools-page-accordions.js", + "www/toolbox/tools-page-accordions.js", ...productApiClients, ].forEach((filePath) => { const contents = readRepoFile(filePath); diff --git a/dev/tests/dev-runtime/StaticWebRootCompatibility.test.mjs b/dev/tests/dev-runtime/StaticWebRootCompatibility.test.mjs index ac4d3e70f..8e2629315 100644 --- a/dev/tests/dev-runtime/StaticWebRootCompatibility.test.mjs +++ b/dev/tests/dev-runtime/StaticWebRootCompatibility.test.mjs @@ -7,6 +7,7 @@ import { startStaticWebServer } from "../../scripts/start-dev.mjs"; import { DEFAULT_LOCAL_WEB_ROOT, LOCAL_WEB_ROOT_ENV, + REPO_ROOT_LOCAL_WEB_ROOT, WWW_LOCAL_WEB_ROOT, resolveBrowserRoutePath, resolveLocalWebRoot, @@ -15,21 +16,21 @@ import { const repoRoot = path.resolve(fileURLToPath(new URL("../../..", import.meta.url))); -test("local web root defaults to repository root and can be pointed at www", () => { +test("local web root defaults to www and can be pointed at the repository root", () => { const defaultRoot = resolveLocalWebRoot({ env: {}, repoRoot }); assert.equal(defaultRoot.relativePath, DEFAULT_LOCAL_WEB_ROOT); - assert.equal(defaultRoot.absolutePath, repoRoot); + assert.equal(defaultRoot.absolutePath, path.join(repoRoot, "www")); assert.equal(defaultRoot.source, "default"); - const wwwRoot = resolveLocalWebRoot({ + const repoRootConfig = resolveLocalWebRoot({ env: { - [LOCAL_WEB_ROOT_ENV]: WWW_LOCAL_WEB_ROOT, + [LOCAL_WEB_ROOT_ENV]: "repo-root", }, repoRoot, }); - assert.equal(wwwRoot.relativePath, WWW_LOCAL_WEB_ROOT); - assert.equal(wwwRoot.absolutePath, path.join(repoRoot, "www")); - assert.equal(wwwRoot.source, "configured"); + assert.equal(repoRootConfig.relativePath, REPO_ROOT_LOCAL_WEB_ROOT); + assert.equal(repoRootConfig.absolutePath, repoRoot); + assert.equal(repoRootConfig.source, "configured"); }); test("browser route compatibility preserves public URLs while normalizing filesystem lookup", () => { @@ -47,10 +48,10 @@ test("static route target can prefer a configured www root before repo-root fall const routeTarget = await resolveStaticRouteTarget({ decodedPath: "/index.html", repoRoot, - webRoot: "www", + webRoot: WWW_LOCAL_WEB_ROOT, }); assert.equal(routeTarget.routePath, "/index.html"); - assert.equal(routeTarget.targetPath, path.join(repoRoot, "index.html")); + assert.equal(routeTarget.targetPath, path.join(repoRoot, "www", "index.html")); assert.equal(routeTarget.webRoot.relativePath, "www"); }); diff --git a/dev/tests/playwright/tools/SpritesToolShell.spec.mjs b/dev/tests/playwright/tools/SpritesToolShell.spec.mjs index 3282b79fa..1029eed28 100644 --- a/dev/tests/playwright/tools/SpritesToolShell.spec.mjs +++ b/dev/tests/playwright/tools/SpritesToolShell.spec.mjs @@ -1,10 +1,10 @@ -import { expect, test } from "@playwright/test"; +import { expect, test } from "@playwright/test"; import fs from "node:fs/promises"; import http from "node:http"; import path from "node:path"; import { fileURLToPath } from "node:url"; import { isBrowserExtensionNoise } from "../../helpers/browserExtensionNoise.mjs"; -import { getToolRegistrySnapshot } from "../../../../toolbox/toolRegistry.js"; +import { getToolRegistrySnapshot } from "../../../../www/toolbox/toolRegistry.js"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); diff --git a/dev/tests/playwright/tools/StaticWebRootCompatibility.spec.mjs b/dev/tests/playwright/tools/StaticWebRootCompatibility.spec.mjs index 072e277c9..3f065cfe4 100644 --- a/dev/tests/playwright/tools/StaticWebRootCompatibility.spec.mjs +++ b/dev/tests/playwright/tools/StaticWebRootCompatibility.spec.mjs @@ -9,14 +9,18 @@ const repoRoot = path.resolve(fileURLToPath(new URL("../../../..", import.meta.u test("repo server preserves current public route URLs with default root serving", async ({ page }) => { const server = await startRepoServer(); try { - const homeResponse = await page.goto(`${server.baseUrl}/index.html`, { waitUntil: "domcontentloaded" }); - expect(homeResponse?.status()).toBe(200); - - const toolboxResponse = await page.goto(`${server.baseUrl}/toolbox/index.html`, { waitUntil: "domcontentloaded" }); - expect(toolboxResponse?.status()).toBe(200); - - const assetResponse = await page.request.get(`${server.baseUrl}/assets/theme-v2/css/theme.css`); - expect(assetResponse.status()).toBe(200); + const routes = [ + "/index.html", + "/toolbox/index.html", + "/assets/theme-v2/css/theme.css", + "/account/sign-in.html", + "/admin/system-health.html", + "/games/index.html", + ]; + for (const route of routes) { + const response = await page.request.get(`${server.baseUrl}${route}`); + expect(response.status(), route).toBe(200); + } } finally { await server.close(); } diff --git a/dev/tests/playwright/tools/ToolDisplayModeSingleLineSummary.spec.mjs b/dev/tests/playwright/tools/ToolDisplayModeSingleLineSummary.spec.mjs index 1494fb2ee..40f1b5d09 100644 --- a/dev/tests/playwright/tools/ToolDisplayModeSingleLineSummary.spec.mjs +++ b/dev/tests/playwright/tools/ToolDisplayModeSingleLineSummary.spec.mjs @@ -1,8 +1,8 @@ -import { expect, test } from "@playwright/test"; +import { expect, test } from "@playwright/test"; import { getToolById, getToolImageSource, -} from "../../../../toolbox/toolRegistry.js"; +} from "../../../../www/toolbox/toolRegistry.js"; import { startRepoServer } from "../../helpers/playwrightRepoServer.mjs"; import { clearPlaywrightStorage, installPlaywrightStorageIsolation } from "../../helpers/playwrightStorageIsolation.mjs"; import { workspaceV2CoverageReporter } from "../../helpers/workspaceV2CoverageReporter.mjs"; diff --git a/dev/tests/playwright/tools/ToolImageRegistry.spec.mjs b/dev/tests/playwright/tools/ToolImageRegistry.spec.mjs index f78d40903..9467c013d 100644 --- a/dev/tests/playwright/tools/ToolImageRegistry.spec.mjs +++ b/dev/tests/playwright/tools/ToolImageRegistry.spec.mjs @@ -1,4 +1,4 @@ -import { expect, test } from "@playwright/test"; +import { expect, test } from "@playwright/test"; import { TOOL_IMAGE_BADGE_ROOT, TOOL_IMAGE_FALLBACK, @@ -10,7 +10,7 @@ import { getToolImageDiagnostics, getToolImageSource, isApprovedToolImagePath -} from "../../../../toolbox/toolRegistry.js"; +} from "../../../../www/toolbox/toolRegistry.js"; import { startRepoServer } from "../../helpers/playwrightRepoServer.mjs"; import { clearPlaywrightStorage, installPlaywrightStorageIsolation } from "../../helpers/playwrightStorageIsolation.mjs"; import { workspaceV2CoverageReporter } from "../../helpers/workspaceV2CoverageReporter.mjs"; diff --git a/dev/tests/playwright/tools/ToolNavigationPrevNext.spec.mjs b/dev/tests/playwright/tools/ToolNavigationPrevNext.spec.mjs index 0e62a7140..1c2379d2f 100644 --- a/dev/tests/playwright/tools/ToolNavigationPrevNext.spec.mjs +++ b/dev/tests/playwright/tools/ToolNavigationPrevNext.spec.mjs @@ -1,8 +1,8 @@ -import { expect, test } from "@playwright/test"; +import { expect, test } from "@playwright/test"; import { TOOL_REGISTRY, getToolRoute, -} from "../../../../toolbox/toolRegistry.js"; +} from "../../../../www/toolbox/toolRegistry.js"; import { startRepoServer } from "../../helpers/playwrightRepoServer.mjs"; import { clearPlaywrightStorage, installPlaywrightStorageIsolation } from "../../helpers/playwrightStorageIsolation.mjs"; import { workspaceV2CoverageReporter } from "../../helpers/workspaceV2CoverageReporter.mjs"; diff --git a/dev/tests/shared/ProjectWorkspaceToolRegistrationValidation.test.mjs b/dev/tests/shared/ProjectWorkspaceToolRegistrationValidation.test.mjs index 7b37d4b8a..23869db22 100644 --- a/dev/tests/shared/ProjectWorkspaceToolRegistrationValidation.test.mjs +++ b/dev/tests/shared/ProjectWorkspaceToolRegistrationValidation.test.mjs @@ -1,4 +1,4 @@ -/* +/* Toolbox Aid David Quesenberry 06/02/2026 @@ -10,10 +10,10 @@ import { } from "../../../src/shared/contracts/tools/toolContractsIndex.js"; import { getActiveToolRegistry, -} from "../../../toolbox/toolRegistry.js"; +} from "../../../www/toolbox/toolRegistry.js"; import { WorkspaceManagerV2ContextService, -} from "../../../toolbox/workspace-manager-v2/js/services/WorkspaceManagerV2ContextService.js"; +} from "../../../www/toolbox/workspace-manager-v2/js/services/WorkspaceManagerV2ContextService.js"; import { validateProjectWorkspaceLaunchBoundary, } from "./ProjectWorkspaceLaunchBoundaryValidation.test.mjs"; diff --git a/dev/tests/shared/tools/ToolContractCoverage.test.mjs b/dev/tests/shared/tools/ToolContractCoverage.test.mjs index e63576d4d..79f9c4d3b 100644 --- a/dev/tests/shared/tools/ToolContractCoverage.test.mjs +++ b/dev/tests/shared/tools/ToolContractCoverage.test.mjs @@ -1,4 +1,4 @@ -/* +/* Toolbox Aid David Quesenberry 06/02/2026 @@ -60,7 +60,7 @@ import { } from "../../../../src/shared/contracts/tools/toolContractsIndex.js"; import { getVisibleActiveToolRegistry, -} from "../../../../toolbox/toolRegistry.js"; +} from "../../../../www/toolbox/toolRegistry.js"; const scenariosPath = fileURLToPath( new URL("../../fixtures/tools/tool-contract-scenarios.json", import.meta.url) diff --git a/dev/tests/tools/NoHiddenToolCouplingValidation.test.mjs b/dev/tests/tools/NoHiddenToolCouplingValidation.test.mjs index fb2806317..e9d9d1020 100644 --- a/dev/tests/tools/NoHiddenToolCouplingValidation.test.mjs +++ b/dev/tests/tools/NoHiddenToolCouplingValidation.test.mjs @@ -1,8 +1,8 @@ -import assert from "node:assert/strict"; +import assert from "node:assert/strict"; import fs from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; -import { getActiveToolRegistry } from "../../../toolbox/toolRegistry.js"; +import { getActiveToolRegistry } from "../../../www/toolbox/toolRegistry.js"; const REPO_ROOT = fileURLToPath(new URL("../../..", import.meta.url)); diff --git a/dev/tests/tools/ObjectVectorFinalRuntimeCleanup.test.mjs b/dev/tests/tools/ObjectVectorFinalRuntimeCleanup.test.mjs index ac4b38434..fe0f92027 100644 --- a/dev/tests/tools/ObjectVectorFinalRuntimeCleanup.test.mjs +++ b/dev/tests/tools/ObjectVectorFinalRuntimeCleanup.test.mjs @@ -1,8 +1,8 @@ -import assert from "node:assert/strict"; +import assert from "node:assert/strict"; import { readFileSync, readdirSync } from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; -import { getToolById } from "../../../toolbox/toolRegistry.js"; +import { getToolById } from "../../../www/toolbox/toolRegistry.js"; const REPO_ROOT = fileURLToPath(new URL("../../..", import.meta.url)); const ACTIVE_OBJECT_VECTOR_PATHS = Object.freeze([ diff --git a/dev/tests/tools/RequiredToolsBaseline.test.mjs b/dev/tests/tools/RequiredToolsBaseline.test.mjs index 1a83c674d..74a48d6e3 100644 --- a/dev/tests/tools/RequiredToolsBaseline.test.mjs +++ b/dev/tests/tools/RequiredToolsBaseline.test.mjs @@ -1,8 +1,8 @@ -import assert from "node:assert/strict"; +import assert from "node:assert/strict"; import { readFileSync, statSync } from "node:fs"; import path from "node:path"; import { fileURLToPath } from "node:url"; -import { getToolById } from "../../../toolbox/toolRegistry.js"; +import { getToolById } from "../../../www/toolbox/toolRegistry.js"; const REPO_ROOT = fileURLToPath(new URL("../../..", import.meta.url)); diff --git a/src/dev-runtime/admin/admin-notes-menu.mjs b/src/dev-runtime/admin/admin-notes-menu.mjs index a5a3bd38e..3e6d13e5d 100644 --- a/src/dev-runtime/admin/admin-notes-menu.mjs +++ b/src/dev-runtime/admin/admin-notes-menu.mjs @@ -5,7 +5,7 @@ export const ADMIN_NOTES_LOCAL_SOURCE_PATH = "/src/dev-runtime/admin/notes.html" export const ADMIN_NOTES_LOCAL_MENU_LABEL = "Notes"; export const ADMIN_MY_STUFF_MENU_LABEL = "My Stuff"; -const HEADER_PARTIAL_PATH = "assets/theme-v2/partials/header-nav.html"; +const HEADER_PARTIAL_PATH = "www/assets/theme-v2/partials/header-nav.html"; const LOCAL_HEADER_PARTIAL_PATH = "src/dev-runtime/admin/header-nav.local.html"; function repoRelativePath(repoRoot, targetPath) { diff --git a/src/dev-runtime/server/static-web-root.mjs b/src/dev-runtime/server/static-web-root.mjs index 0c964d53f..96d7dc91b 100644 --- a/src/dev-runtime/server/static-web-root.mjs +++ b/src/dev-runtime/server/static-web-root.mjs @@ -2,8 +2,9 @@ import fs from "node:fs/promises"; import path from "node:path"; export const LOCAL_WEB_ROOT_ENV = "GAMEFOUNDRY_LOCAL_WEB_ROOT"; -export const DEFAULT_LOCAL_WEB_ROOT = "."; export const WWW_LOCAL_WEB_ROOT = "www"; +export const REPO_ROOT_LOCAL_WEB_ROOT = "."; +export const DEFAULT_LOCAL_WEB_ROOT = WWW_LOCAL_WEB_ROOT; export function isInsideRoot(rootPath, absolutePath) { const relativePath = path.relative(rootPath, absolutePath); @@ -12,9 +13,12 @@ export function isInsideRoot(rootPath, absolutePath) { function normalizeWebRootValue(value) { const normalizedValue = String(value || "").trim(); - if (!normalizedValue || normalizedValue === "." || normalizedValue === "root" || normalizedValue === "repo-root") { + if (!normalizedValue) { return DEFAULT_LOCAL_WEB_ROOT; } + if (normalizedValue === "." || normalizedValue === "root" || normalizedValue === "repo-root") { + return REPO_ROOT_LOCAL_WEB_ROOT; + } return normalizedValue.replace(/\\/g, "/").replace(/^\/+/, "").replace(/\/+$/, "") || DEFAULT_LOCAL_WEB_ROOT; } diff --git a/src/shared/toolbox/assetUsageIntegration.js b/src/shared/toolbox/assetUsageIntegration.js index dc889daae..6eeca19a6 100644 --- a/src/shared/toolbox/assetUsageIntegration.js +++ b/src/shared/toolbox/assetUsageIntegration.js @@ -1,6 +1,6 @@ import LocalStorageService from '../../engine/persistence/LocalStorageService.js'; import { sanitizeText } from "../string/strings.js"; -import { getToolById } from "../../../toolbox/tool-registry-api-client.js"; +import { getToolById } from "../../../www/toolbox/tool-registry-api-client.js"; export const SHARED_ASSET_HANDOFF_KEY = "toolboxaid.shared.assetHandoff"; export const SHARED_PALETTE_HANDOFF_KEY = "toolboxaid.shared.paletteHandoff"; diff --git a/src/shared/toolbox/platformShell.js b/src/shared/toolbox/platformShell.js index 1af785b4e..ada247052 100644 --- a/src/shared/toolbox/platformShell.js +++ b/src/shared/toolbox/platformShell.js @@ -1,4 +1,4 @@ -import { getToolById, getToolRegistry } from "../../../toolbox/tool-registry-api-client.js"; +import { getToolById, getToolRegistry } from "../../../www/toolbox/tool-registry-api-client.js"; import { clearSharedAssetHandoff, clearSharedPaletteHandoff, diff --git a/src/shared/toolbox/projectSystem.js b/src/shared/toolbox/projectSystem.js index 98a8b7f2b..bdb932f79 100644 --- a/src/shared/toolbox/projectSystem.js +++ b/src/shared/toolbox/projectSystem.js @@ -1,4 +1,4 @@ -import { getToolById } from "../../../toolbox/tool-registry-api-client.js"; +import { getToolById } from "../../../www/toolbox/tool-registry-api-client.js"; import { downloadTextFile, readFileText } from '../../engine/persistence/FilePersistenceService.js'; import { ACTIVE_PROJECT_STORAGE_KEY, diff --git a/src/shared/toolbox/toolHostManifest.js b/src/shared/toolbox/toolHostManifest.js index 0f560c255..9bce3c7c6 100644 --- a/src/shared/toolbox/toolHostManifest.js +++ b/src/shared/toolbox/toolHostManifest.js @@ -1,4 +1,4 @@ -import { getActiveToolRegistry, resolveToolIdAlias } from "../../../toolbox/tool-registry-api-client.js"; +import { getActiveToolRegistry, resolveToolIdAlias } from "../../../www/toolbox/tool-registry-api-client.js"; const TOOL_HOST_MANIFEST_SCHEMA = "tools.tool-host-manifest/1"; diff --git a/src/shared/toolbox/toolLaunchSSoTData.js b/src/shared/toolbox/toolLaunchSSoTData.js index 3ec05d33d..9cf2bfd08 100644 --- a/src/shared/toolbox/toolLaunchSSoTData.js +++ b/src/shared/toolbox/toolLaunchSSoTData.js @@ -1,4 +1,4 @@ -import { getActiveToolRegistry } from "../../../toolbox/tool-registry-api-client.js"; +import { getActiveToolRegistry } from "../../../www/toolbox/tool-registry-api-client.js"; import { normalizeText, normalizeToken } from "../string/strings.js"; const ALLOWED_LAUNCH_SOURCES = Object.freeze(["samples", "games", "tools", "workspace", "internal"]); diff --git a/www/.gitkeep b/www/.gitkeep deleted file mode 100644 index 8b1378917..000000000 --- a/www/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - diff --git a/account/achievements.html b/www/account/achievements.html similarity index 100% rename from account/achievements.html rename to www/account/achievements.html diff --git a/account/ai-credits.html b/www/account/ai-credits.html similarity index 100% rename from account/ai-credits.html rename to www/account/ai-credits.html diff --git a/account/create-account.html b/www/account/create-account.html similarity index 100% rename from account/create-account.html rename to www/account/create-account.html diff --git a/account/index.html b/www/account/index.html similarity index 100% rename from account/index.html rename to www/account/index.html diff --git a/account/lost-password.html b/www/account/lost-password.html similarity index 100% rename from account/lost-password.html rename to www/account/lost-password.html diff --git a/account/password-reset.html b/www/account/password-reset.html similarity index 100% rename from account/password-reset.html rename to www/account/password-reset.html diff --git a/account/preferences.html b/www/account/preferences.html similarity index 100% rename from account/preferences.html rename to www/account/preferences.html diff --git a/account/profile.html b/www/account/profile.html similarity index 100% rename from account/profile.html rename to www/account/profile.html diff --git a/account/security.html b/www/account/security.html similarity index 100% rename from account/security.html rename to www/account/security.html diff --git a/account/sign-in.html b/www/account/sign-in.html similarity index 100% rename from account/sign-in.html rename to www/account/sign-in.html diff --git a/account/user-controls-page.js b/www/account/user-controls-page.js similarity index 99% rename from account/user-controls-page.js rename to www/account/user-controls-page.js index d42be3309..e906b0d8d 100644 --- a/account/user-controls-page.js +++ b/www/account/user-controls-page.js @@ -1,14 +1,14 @@ import { createControlsToolApiRepository } from "../assets/js/shared/controls-api-client.js"; -import { getSessionCurrent } from "../src/api/session-api-client.js"; -import InputService from "../src/engine/input/InputService.js"; -import InputCaptureService from "../src/engine/input/InputCaptureService.js"; -import { gamepadProfileInputNames } from "../src/engine/input/GamepadInputClassifier.js"; +import { getSessionCurrent } from "../../src/api/session-api-client.js"; +import InputService from "../../src/engine/input/InputService.js"; +import InputCaptureService from "../../src/engine/input/InputCaptureService.js"; +import { gamepadProfileInputNames } from "../../src/engine/input/GamepadInputClassifier.js"; import { normalizeProfileInputMappings, physicalInputSensitivityDescriptor, normalizedInputIsAnalog, physicalInputIsAnalog, -} from "../src/engine/input/NormalizedInputRegistry.js"; +} from "../../src/engine/input/NormalizedInputRegistry.js"; const DEVICE_POLL_INTERVAL_MS = 1200; const INPUT_CAPTURE_TIMEOUT_MS = 5000; diff --git a/account/user-controls.html b/www/account/user-controls.html similarity index 100% rename from account/user-controls.html rename to www/account/user-controls.html diff --git a/account/user-controls.js b/www/account/user-controls.js similarity index 100% rename from account/user-controls.js rename to www/account/user-controls.js diff --git a/admin/analytics.html b/www/admin/analytics.html similarity index 100% rename from admin/analytics.html rename to www/admin/analytics.html diff --git a/admin/controls.html b/www/admin/controls.html similarity index 100% rename from admin/controls.html rename to www/admin/controls.html diff --git a/admin/db-viewer.html b/www/admin/db-viewer.html similarity index 100% rename from admin/db-viewer.html rename to www/admin/db-viewer.html diff --git a/admin/db-viewer.js b/www/admin/db-viewer.js similarity index 90% rename from admin/db-viewer.js rename to www/admin/db-viewer.js index 0cb5ea7c0..d193d4f82 100644 --- a/admin/db-viewer.js +++ b/www/admin/db-viewer.js @@ -1,4 +1,4 @@ -import { getSessionCurrent } from "../src/api/session-api-client.js"; +import { getSessionCurrent } from "../../src/api/session-api-client.js"; function devRuntimeAllowed() { const host = window.location.hostname; @@ -41,7 +41,7 @@ async function loadDbViewer() { showGatewayStatus(session.diagnostic || "Sign in with an admin account to open DB Viewer."); return; } - const module = await import("../src/api/db-viewer-ui.js"); + const module = await import("../../src/api/db-viewer-ui.js"); module.startDbViewer(document, { session }); } diff --git a/admin/environments.html b/www/admin/environments.html similarity index 100% rename from admin/environments.html rename to www/admin/environments.html diff --git a/admin/game-migration.html b/www/admin/game-migration.html similarity index 100% rename from admin/game-migration.html rename to www/admin/game-migration.html diff --git a/admin/infrastructure.html b/www/admin/infrastructure.html similarity index 100% rename from admin/infrastructure.html rename to www/admin/infrastructure.html diff --git a/admin/invitations.html b/www/admin/invitations.html similarity index 100% rename from admin/invitations.html rename to www/admin/invitations.html diff --git a/admin/moderation.html b/www/admin/moderation.html similarity index 100% rename from admin/moderation.html rename to www/admin/moderation.html diff --git a/admin/operations.html b/www/admin/operations.html similarity index 100% rename from admin/operations.html rename to www/admin/operations.html diff --git a/admin/platform-settings.html b/www/admin/platform-settings.html similarity index 100% rename from admin/platform-settings.html rename to www/admin/platform-settings.html diff --git a/admin/ratings.html b/www/admin/ratings.html similarity index 100% rename from admin/ratings.html rename to www/admin/ratings.html diff --git a/admin/roles.html b/www/admin/roles.html similarity index 100% rename from admin/roles.html rename to www/admin/roles.html diff --git a/admin/site-setup.html b/www/admin/site-setup.html similarity index 100% rename from admin/site-setup.html rename to www/admin/site-setup.html diff --git a/admin/system-health.html b/www/admin/system-health.html similarity index 100% rename from admin/system-health.html rename to www/admin/system-health.html diff --git a/admin/tool-votes.html b/www/admin/tool-votes.html similarity index 100% rename from admin/tool-votes.html rename to www/admin/tool-votes.html diff --git a/admin/tool-votes.js b/www/admin/tool-votes.js similarity index 99% rename from admin/tool-votes.js rename to www/admin/tool-votes.js index e4e587a76..cb000e869 100644 --- a/admin/tool-votes.js +++ b/www/admin/tool-votes.js @@ -2,7 +2,7 @@ import { readToolboxVoteSnapshot, reorderToolboxVoteRows, updateToolboxVoteMetadata, -} from "../src/api/toolbox-votes-api-client.js"; +} from "../../src/api/toolbox-votes-api-client.js"; import { getToolboxContract } from "../toolbox/tool-registry-api-client.js"; const status = document.querySelector("[data-toolbox-votes-status]"); diff --git a/admin/users.html b/www/admin/users.html similarity index 100% rename from admin/users.html rename to www/admin/users.html diff --git a/assets/GFS-Infrastructure v1-2.png b/www/assets/GFS-Infrastructure v1-2.png similarity index 100% rename from assets/GFS-Infrastructure v1-2.png rename to www/assets/GFS-Infrastructure v1-2.png diff --git a/assets/GFS-Infrastructure v1-3.png b/www/assets/GFS-Infrastructure v1-3.png similarity index 100% rename from assets/GFS-Infrastructure v1-3.png rename to www/assets/GFS-Infrastructure v1-3.png diff --git a/assets/js/shared/assets-api-client.js b/www/assets/js/shared/assets-api-client.js similarity index 95% rename from assets/js/shared/assets-api-client.js rename to www/assets/js/shared/assets-api-client.js index 1232aac7c..e7887bd97 100644 --- a/assets/js/shared/assets-api-client.js +++ b/www/assets/js/shared/assets-api-client.js @@ -3,7 +3,7 @@ import { createServerRepositoryClient, readServerToolConstants, requireServerConstant, -} from "../../../src/api/server-api-client.js"; +} from "../../../../src/api/server-api-client.js"; const constants = readServerToolConstants("assets"); diff --git a/assets/js/shared/controls-api-client.js b/www/assets/js/shared/controls-api-client.js similarity index 96% rename from assets/js/shared/controls-api-client.js rename to www/assets/js/shared/controls-api-client.js index 3b382022b..d8c3f767b 100644 --- a/assets/js/shared/controls-api-client.js +++ b/www/assets/js/shared/controls-api-client.js @@ -2,7 +2,7 @@ import { createServerRepositoryClient, readServerToolConstants, requireServerConstant, -} from "../../../src/api/server-api-client.js"; +} from "../../../../src/api/server-api-client.js"; const constants = readServerToolConstants("controls"); diff --git a/assets/js/shared/game-journey-api-client.js b/www/assets/js/shared/game-journey-api-client.js similarity index 90% rename from assets/js/shared/game-journey-api-client.js rename to www/assets/js/shared/game-journey-api-client.js index fba67b725..04f9c7f67 100644 --- a/assets/js/shared/game-journey-api-client.js +++ b/www/assets/js/shared/game-journey-api-client.js @@ -2,11 +2,11 @@ import { createServerRepositoryClient, readServerToolConstants, requireServerConstant, -} from "../../../src/api/server-api-client.js"; +} from "../../../../src/api/server-api-client.js"; export { readGameJourneyCompletionMetrics, updateGameJourneyCompletionMetric, -} from "../../../src/api/game-journey-completion-api-client.js"; +} from "../../../../src/api/game-journey-completion-api-client.js"; const constants = readServerToolConstants("game-journey"); diff --git a/assets/js/shared/status.js b/www/assets/js/shared/status.js similarity index 100% rename from assets/js/shared/status.js rename to www/assets/js/shared/status.js diff --git a/assets/js/shared/tts-profile-store.js b/www/assets/js/shared/tts-profile-store.js similarity index 100% rename from assets/js/shared/tts-profile-store.js rename to www/assets/js/shared/tts-profile-store.js diff --git a/assets/theme-v2/css/accordion.css b/www/assets/theme-v2/css/accordion.css similarity index 100% rename from assets/theme-v2/css/accordion.css rename to www/assets/theme-v2/css/accordion.css diff --git a/assets/theme-v2/css/base.css b/www/assets/theme-v2/css/base.css similarity index 100% rename from assets/theme-v2/css/base.css rename to www/assets/theme-v2/css/base.css diff --git a/assets/theme-v2/css/buttons.css b/www/assets/theme-v2/css/buttons.css similarity index 100% rename from assets/theme-v2/css/buttons.css rename to www/assets/theme-v2/css/buttons.css diff --git a/assets/theme-v2/css/colors.css b/www/assets/theme-v2/css/colors.css similarity index 100% rename from assets/theme-v2/css/colors.css rename to www/assets/theme-v2/css/colors.css diff --git a/assets/theme-v2/css/controls.css b/www/assets/theme-v2/css/controls.css similarity index 100% rename from assets/theme-v2/css/controls.css rename to www/assets/theme-v2/css/controls.css diff --git a/assets/theme-v2/css/dialogs.css b/www/assets/theme-v2/css/dialogs.css similarity index 100% rename from assets/theme-v2/css/dialogs.css rename to www/assets/theme-v2/css/dialogs.css diff --git a/assets/theme-v2/css/forms.css b/www/assets/theme-v2/css/forms.css similarity index 100% rename from assets/theme-v2/css/forms.css rename to www/assets/theme-v2/css/forms.css diff --git a/assets/theme-v2/css/gamefoundrystudio.css b/www/assets/theme-v2/css/gamefoundrystudio.css similarity index 100% rename from assets/theme-v2/css/gamefoundrystudio.css rename to www/assets/theme-v2/css/gamefoundrystudio.css diff --git a/assets/theme-v2/css/icons.css b/www/assets/theme-v2/css/icons.css similarity index 100% rename from assets/theme-v2/css/icons.css rename to www/assets/theme-v2/css/icons.css diff --git a/assets/theme-v2/css/layout.css b/www/assets/theme-v2/css/layout.css similarity index 100% rename from assets/theme-v2/css/layout.css rename to www/assets/theme-v2/css/layout.css diff --git a/assets/theme-v2/css/pages.css b/www/assets/theme-v2/css/pages.css similarity index 100% rename from assets/theme-v2/css/pages.css rename to www/assets/theme-v2/css/pages.css diff --git a/assets/theme-v2/css/panels.css b/www/assets/theme-v2/css/panels.css similarity index 100% rename from assets/theme-v2/css/panels.css rename to www/assets/theme-v2/css/panels.css diff --git a/assets/theme-v2/css/site-colors.css b/www/assets/theme-v2/css/site-colors.css similarity index 100% rename from assets/theme-v2/css/site-colors.css rename to www/assets/theme-v2/css/site-colors.css diff --git a/assets/theme-v2/css/site-controls.css b/www/assets/theme-v2/css/site-controls.css similarity index 100% rename from assets/theme-v2/css/site-controls.css rename to www/assets/theme-v2/css/site-controls.css diff --git a/assets/theme-v2/css/spacing.css b/www/assets/theme-v2/css/spacing.css similarity index 100% rename from assets/theme-v2/css/spacing.css rename to www/assets/theme-v2/css/spacing.css diff --git a/assets/theme-v2/css/status.css b/www/assets/theme-v2/css/status.css similarity index 100% rename from assets/theme-v2/css/status.css rename to www/assets/theme-v2/css/status.css diff --git a/assets/theme-v2/css/tables.css b/www/assets/theme-v2/css/tables.css similarity index 100% rename from assets/theme-v2/css/tables.css rename to www/assets/theme-v2/css/tables.css diff --git a/assets/theme-v2/css/theme.css b/www/assets/theme-v2/css/theme.css similarity index 100% rename from assets/theme-v2/css/theme.css rename to www/assets/theme-v2/css/theme.css diff --git a/assets/theme-v2/css/tokens.css b/www/assets/theme-v2/css/tokens.css similarity index 100% rename from assets/theme-v2/css/tokens.css rename to www/assets/theme-v2/css/tokens.css diff --git a/assets/theme-v2/css/tools.css b/www/assets/theme-v2/css/tools.css similarity index 100% rename from assets/theme-v2/css/tools.css rename to www/assets/theme-v2/css/tools.css diff --git a/assets/theme-v2/css/typography.css b/www/assets/theme-v2/css/typography.css similarity index 100% rename from assets/theme-v2/css/typography.css rename to www/assets/theme-v2/css/typography.css diff --git a/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Bold.ttf b/www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Bold.ttf similarity index 100% rename from assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Bold.ttf rename to www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Bold.ttf diff --git a/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Italic.ttf b/www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Italic.ttf similarity index 100% rename from assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Italic.ttf rename to www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Italic.ttf diff --git a/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Regular.ttf b/www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Regular.ttf similarity index 100% rename from assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Regular.ttf rename to www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFont-Regular.ttf diff --git a/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Bold.ttf b/www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Bold.ttf similarity index 100% rename from assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Bold.ttf rename to www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Bold.ttf diff --git a/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Italic.ttf b/www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Italic.ttf similarity index 100% rename from assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Italic.ttf rename to www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Italic.ttf diff --git a/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Regular.ttf b/www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Regular.ttf similarity index 100% rename from assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Regular.ttf rename to www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontMono-Regular.ttf diff --git a/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Bold.ttf b/www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Bold.ttf similarity index 100% rename from assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Bold.ttf rename to www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Bold.ttf diff --git a/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Italic.ttf b/www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Italic.ttf similarity index 100% rename from assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Italic.ttf rename to www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Italic.ttf diff --git a/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Regular.ttf b/www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Regular.ttf similarity index 100% rename from assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Regular.ttf rename to www/assets/theme-v2/fonts/0xProtoNerdFont/0xProtoNerdFontPropo-Regular.ttf diff --git a/assets/theme-v2/fonts/0xProtoNerdFont/LICENSE b/www/assets/theme-v2/fonts/0xProtoNerdFont/LICENSE similarity index 100% rename from assets/theme-v2/fonts/0xProtoNerdFont/LICENSE rename to www/assets/theme-v2/fonts/0xProtoNerdFont/LICENSE diff --git a/assets/theme-v2/fonts/0xProtoNerdFont/README.md b/www/assets/theme-v2/fonts/0xProtoNerdFont/README.md similarity index 100% rename from assets/theme-v2/fonts/0xProtoNerdFont/README.md rename to www/assets/theme-v2/fonts/0xProtoNerdFont/README.md diff --git a/assets/theme-v2/fonts/fontawesome/css/font-awesome.min.css b/www/assets/theme-v2/fonts/fontawesome/css/font-awesome.min.css similarity index 100% rename from assets/theme-v2/fonts/fontawesome/css/font-awesome.min.css rename to www/assets/theme-v2/fonts/fontawesome/css/font-awesome.min.css diff --git a/assets/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.ttf b/www/assets/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.ttf similarity index 100% rename from assets/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.ttf rename to www/assets/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.ttf diff --git a/assets/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.woff b/www/assets/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.woff similarity index 100% rename from assets/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.woff rename to www/assets/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.woff diff --git a/assets/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.woff2 b/www/assets/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.woff2 similarity index 100% rename from assets/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.woff2 rename to www/assets/theme-v2/fonts/fontawesome/fonts/fontawesome-webfont.woff2 diff --git a/assets/theme-v2/fonts/vector_battle/vector_battle.ttf b/www/assets/theme-v2/fonts/vector_battle/vector_battle.ttf similarity index 100% rename from assets/theme-v2/fonts/vector_battle/vector_battle.ttf rename to www/assets/theme-v2/fonts/vector_battle/vector_battle.ttf diff --git a/assets/theme-v2/images/Tools Dependency Tree.png b/www/assets/theme-v2/images/Tools Dependency Tree.png similarity index 100% rename from assets/theme-v2/images/Tools Dependency Tree.png rename to www/assets/theme-v2/images/Tools Dependency Tree.png diff --git a/assets/theme-v2/images/badges/achievement-1024.png b/www/assets/theme-v2/images/badges/achievement-1024.png similarity index 100% rename from assets/theme-v2/images/badges/achievement-1024.png rename to www/assets/theme-v2/images/badges/achievement-1024.png diff --git a/assets/theme-v2/images/badges/achievement.png b/www/assets/theme-v2/images/badges/achievement.png similarity index 100% rename from assets/theme-v2/images/badges/achievement.png rename to www/assets/theme-v2/images/badges/achievement.png diff --git a/assets/theme-v2/images/badges/ai-assistant-1024.png b/www/assets/theme-v2/images/badges/ai-assistant-1024.png similarity index 100% rename from assets/theme-v2/images/badges/ai-assistant-1024.png rename to www/assets/theme-v2/images/badges/ai-assistant-1024.png diff --git a/assets/theme-v2/images/badges/ai-assistant.png b/www/assets/theme-v2/images/badges/ai-assistant.png similarity index 100% rename from assets/theme-v2/images/badges/ai-assistant.png rename to www/assets/theme-v2/images/badges/ai-assistant.png diff --git a/assets/theme-v2/images/badges/animations-1024.png b/www/assets/theme-v2/images/badges/animations-1024.png similarity index 100% rename from assets/theme-v2/images/badges/animations-1024.png rename to www/assets/theme-v2/images/badges/animations-1024.png diff --git a/assets/theme-v2/images/badges/animations.png b/www/assets/theme-v2/images/badges/animations.png similarity index 100% rename from assets/theme-v2/images/badges/animations.png rename to www/assets/theme-v2/images/badges/animations.png diff --git a/assets/theme-v2/images/badges/assets-1024.png b/www/assets/theme-v2/images/badges/assets-1024.png similarity index 100% rename from assets/theme-v2/images/badges/assets-1024.png rename to www/assets/theme-v2/images/badges/assets-1024.png diff --git a/assets/theme-v2/images/badges/assets.png b/www/assets/theme-v2/images/badges/assets.png similarity index 100% rename from assets/theme-v2/images/badges/assets.png rename to www/assets/theme-v2/images/badges/assets.png diff --git a/assets/theme-v2/images/badges/audio-1024.png b/www/assets/theme-v2/images/badges/audio-1024.png similarity index 100% rename from assets/theme-v2/images/badges/audio-1024.png rename to www/assets/theme-v2/images/badges/audio-1024.png diff --git a/assets/theme-v2/images/badges/audio-effects-1024.png b/www/assets/theme-v2/images/badges/audio-effects-1024.png similarity index 100% rename from assets/theme-v2/images/badges/audio-effects-1024.png rename to www/assets/theme-v2/images/badges/audio-effects-1024.png diff --git a/assets/theme-v2/images/badges/audio-effects.png b/www/assets/theme-v2/images/badges/audio-effects.png similarity index 100% rename from assets/theme-v2/images/badges/audio-effects.png rename to www/assets/theme-v2/images/badges/audio-effects.png diff --git a/assets/theme-v2/images/badges/audio.png b/www/assets/theme-v2/images/badges/audio.png similarity index 100% rename from assets/theme-v2/images/badges/audio.png rename to www/assets/theme-v2/images/badges/audio.png diff --git a/assets/theme-v2/images/badges/build-game-1024.png b/www/assets/theme-v2/images/badges/build-game-1024.png similarity index 100% rename from assets/theme-v2/images/badges/build-game-1024.png rename to www/assets/theme-v2/images/badges/build-game-1024.png diff --git a/assets/theme-v2/images/badges/build-game.png b/www/assets/theme-v2/images/badges/build-game.png similarity index 100% rename from assets/theme-v2/images/badges/build-game.png rename to www/assets/theme-v2/images/badges/build-game.png diff --git a/assets/theme-v2/images/badges/characters-1024.png b/www/assets/theme-v2/images/badges/characters-1024.png similarity index 100% rename from assets/theme-v2/images/badges/characters-1024.png rename to www/assets/theme-v2/images/badges/characters-1024.png diff --git a/assets/theme-v2/images/badges/characters.png b/www/assets/theme-v2/images/badges/characters.png similarity index 100% rename from assets/theme-v2/images/badges/characters.png rename to www/assets/theme-v2/images/badges/characters.png diff --git a/assets/theme-v2/images/badges/cloud-1024.png b/www/assets/theme-v2/images/badges/cloud-1024.png similarity index 100% rename from assets/theme-v2/images/badges/cloud-1024.png rename to www/assets/theme-v2/images/badges/cloud-1024.png diff --git a/assets/theme-v2/images/badges/cloud.png b/www/assets/theme-v2/images/badges/cloud.png similarity index 100% rename from assets/theme-v2/images/badges/cloud.png rename to www/assets/theme-v2/images/badges/cloud.png diff --git a/assets/theme-v2/images/badges/code-1024.png b/www/assets/theme-v2/images/badges/code-1024.png similarity index 100% rename from assets/theme-v2/images/badges/code-1024.png rename to www/assets/theme-v2/images/badges/code-1024.png diff --git a/assets/theme-v2/images/badges/code.png b/www/assets/theme-v2/images/badges/code.png similarity index 100% rename from assets/theme-v2/images/badges/code.png rename to www/assets/theme-v2/images/badges/code.png diff --git a/assets/theme-v2/images/badges/colors-1024.png b/www/assets/theme-v2/images/badges/colors-1024.png similarity index 100% rename from assets/theme-v2/images/badges/colors-1024.png rename to www/assets/theme-v2/images/badges/colors-1024.png diff --git a/assets/theme-v2/images/badges/colors.png b/www/assets/theme-v2/images/badges/colors.png similarity index 100% rename from assets/theme-v2/images/badges/colors.png rename to www/assets/theme-v2/images/badges/colors.png diff --git a/assets/theme-v2/images/badges/community-1024.png b/www/assets/theme-v2/images/badges/community-1024.png similarity index 100% rename from assets/theme-v2/images/badges/community-1024.png rename to www/assets/theme-v2/images/badges/community-1024.png diff --git a/assets/theme-v2/images/badges/community.png b/www/assets/theme-v2/images/badges/community.png similarity index 100% rename from assets/theme-v2/images/badges/community.png rename to www/assets/theme-v2/images/badges/community.png diff --git a/assets/theme-v2/images/badges/controls-1024.png b/www/assets/theme-v2/images/badges/controls-1024.png similarity index 100% rename from assets/theme-v2/images/badges/controls-1024.png rename to www/assets/theme-v2/images/badges/controls-1024.png diff --git a/assets/theme-v2/images/badges/controls.png b/www/assets/theme-v2/images/badges/controls.png similarity index 100% rename from assets/theme-v2/images/badges/controls.png rename to www/assets/theme-v2/images/badges/controls.png diff --git a/assets/theme-v2/images/badges/debug-1024.png b/www/assets/theme-v2/images/badges/debug-1024.png similarity index 100% rename from assets/theme-v2/images/badges/debug-1024.png rename to www/assets/theme-v2/images/badges/debug-1024.png diff --git a/assets/theme-v2/images/badges/debug.png b/www/assets/theme-v2/images/badges/debug.png similarity index 100% rename from assets/theme-v2/images/badges/debug.png rename to www/assets/theme-v2/images/badges/debug.png diff --git a/assets/theme-v2/images/badges/environments-1024.png b/www/assets/theme-v2/images/badges/environments-1024.png similarity index 100% rename from assets/theme-v2/images/badges/environments-1024.png rename to www/assets/theme-v2/images/badges/environments-1024.png diff --git a/assets/theme-v2/images/badges/environments.png b/www/assets/theme-v2/images/badges/environments.png similarity index 100% rename from assets/theme-v2/images/badges/environments.png rename to www/assets/theme-v2/images/badges/environments.png diff --git a/assets/theme-v2/images/badges/events-1024.png b/www/assets/theme-v2/images/badges/events-1024.png similarity index 100% rename from assets/theme-v2/images/badges/events-1024.png rename to www/assets/theme-v2/images/badges/events-1024.png diff --git a/assets/theme-v2/images/badges/events.png b/www/assets/theme-v2/images/badges/events.png similarity index 100% rename from assets/theme-v2/images/badges/events.png rename to www/assets/theme-v2/images/badges/events.png diff --git a/assets/theme-v2/images/badges/fonts-1024.png b/www/assets/theme-v2/images/badges/fonts-1024.png similarity index 100% rename from assets/theme-v2/images/badges/fonts-1024.png rename to www/assets/theme-v2/images/badges/fonts-1024.png diff --git a/assets/theme-v2/images/badges/fonts.png b/www/assets/theme-v2/images/badges/fonts.png similarity index 100% rename from assets/theme-v2/images/badges/fonts.png rename to www/assets/theme-v2/images/badges/fonts.png diff --git a/assets/theme-v2/images/badges/game-configuration-1024.png b/www/assets/theme-v2/images/badges/game-configuration-1024.png similarity index 100% rename from assets/theme-v2/images/badges/game-configuration-1024.png rename to www/assets/theme-v2/images/badges/game-configuration-1024.png diff --git a/assets/theme-v2/images/badges/game-configuration.png b/www/assets/theme-v2/images/badges/game-configuration.png similarity index 100% rename from assets/theme-v2/images/badges/game-configuration.png rename to www/assets/theme-v2/images/badges/game-configuration.png diff --git a/assets/theme-v2/images/badges/game-design-1024.png b/www/assets/theme-v2/images/badges/game-design-1024.png similarity index 100% rename from assets/theme-v2/images/badges/game-design-1024.png rename to www/assets/theme-v2/images/badges/game-design-1024.png diff --git a/assets/theme-v2/images/badges/game-design.png b/www/assets/theme-v2/images/badges/game-design.png similarity index 100% rename from assets/theme-v2/images/badges/game-design.png rename to www/assets/theme-v2/images/badges/game-design.png diff --git a/assets/theme-v2/images/badges/game-hub-1024.png b/www/assets/theme-v2/images/badges/game-hub-1024.png similarity index 100% rename from assets/theme-v2/images/badges/game-hub-1024.png rename to www/assets/theme-v2/images/badges/game-hub-1024.png diff --git a/assets/theme-v2/images/badges/game-hub.png b/www/assets/theme-v2/images/badges/game-hub.png similarity index 100% rename from assets/theme-v2/images/badges/game-hub.png rename to www/assets/theme-v2/images/badges/game-hub.png diff --git a/assets/theme-v2/images/badges/game-migration-1024.png b/www/assets/theme-v2/images/badges/game-migration-1024.png similarity index 100% rename from assets/theme-v2/images/badges/game-migration-1024.png rename to www/assets/theme-v2/images/badges/game-migration-1024.png diff --git a/assets/theme-v2/images/badges/game-migration.png b/www/assets/theme-v2/images/badges/game-migration.png similarity index 100% rename from assets/theme-v2/images/badges/game-migration.png rename to www/assets/theme-v2/images/badges/game-migration.png diff --git a/assets/theme-v2/images/badges/game-testing-1024.png b/www/assets/theme-v2/images/badges/game-testing-1024.png similarity index 100% rename from assets/theme-v2/images/badges/game-testing-1024.png rename to www/assets/theme-v2/images/badges/game-testing-1024.png diff --git a/assets/theme-v2/images/badges/game-testing.png b/www/assets/theme-v2/images/badges/game-testing.png similarity index 100% rename from assets/theme-v2/images/badges/game-testing.png rename to www/assets/theme-v2/images/badges/game-testing.png diff --git a/assets/theme-v2/images/badges/hitboxes-1024.png b/www/assets/theme-v2/images/badges/hitboxes-1024.png similarity index 100% rename from assets/theme-v2/images/badges/hitboxes-1024.png rename to www/assets/theme-v2/images/badges/hitboxes-1024.png diff --git a/assets/theme-v2/images/badges/hitboxes.png b/www/assets/theme-v2/images/badges/hitboxes.png similarity index 100% rename from assets/theme-v2/images/badges/hitboxes.png rename to www/assets/theme-v2/images/badges/hitboxes.png diff --git a/assets/theme-v2/images/badges/languages-1024.png b/www/assets/theme-v2/images/badges/languages-1024.png similarity index 100% rename from assets/theme-v2/images/badges/languages-1024.png rename to www/assets/theme-v2/images/badges/languages-1024.png diff --git a/assets/theme-v2/images/badges/languages.png b/www/assets/theme-v2/images/badges/languages.png similarity index 100% rename from assets/theme-v2/images/badges/languages.png rename to www/assets/theme-v2/images/badges/languages.png diff --git a/assets/theme-v2/images/badges/learn-1024.png b/www/assets/theme-v2/images/badges/learn-1024.png similarity index 100% rename from assets/theme-v2/images/badges/learn-1024.png rename to www/assets/theme-v2/images/badges/learn-1024.png diff --git a/assets/theme-v2/images/badges/learn.png b/www/assets/theme-v2/images/badges/learn.png similarity index 100% rename from assets/theme-v2/images/badges/learn.png rename to www/assets/theme-v2/images/badges/learn.png diff --git a/assets/theme-v2/images/badges/marketplace-1024.png b/www/assets/theme-v2/images/badges/marketplace-1024.png similarity index 100% rename from assets/theme-v2/images/badges/marketplace-1024.png rename to www/assets/theme-v2/images/badges/marketplace-1024.png diff --git a/assets/theme-v2/images/badges/marketplace.png b/www/assets/theme-v2/images/badges/marketplace.png similarity index 100% rename from assets/theme-v2/images/badges/marketplace.png rename to www/assets/theme-v2/images/badges/marketplace.png diff --git a/assets/theme-v2/images/badges/midi-1024.png b/www/assets/theme-v2/images/badges/midi-1024.png similarity index 100% rename from assets/theme-v2/images/badges/midi-1024.png rename to www/assets/theme-v2/images/badges/midi-1024.png diff --git a/assets/theme-v2/images/badges/midi.png b/www/assets/theme-v2/images/badges/midi.png similarity index 100% rename from assets/theme-v2/images/badges/midi.png rename to www/assets/theme-v2/images/badges/midi.png diff --git a/assets/theme-v2/images/badges/music-1024.png b/www/assets/theme-v2/images/badges/music-1024.png similarity index 100% rename from assets/theme-v2/images/badges/music-1024.png rename to www/assets/theme-v2/images/badges/music-1024.png diff --git a/assets/theme-v2/images/badges/music.png b/www/assets/theme-v2/images/badges/music.png similarity index 100% rename from assets/theme-v2/images/badges/music.png rename to www/assets/theme-v2/images/badges/music.png diff --git a/assets/theme-v2/images/badges/objects-1024.png b/www/assets/theme-v2/images/badges/objects-1024.png similarity index 100% rename from assets/theme-v2/images/badges/objects-1024.png rename to www/assets/theme-v2/images/badges/objects-1024.png diff --git a/assets/theme-v2/images/badges/objects.png b/www/assets/theme-v2/images/badges/objects.png similarity index 100% rename from assets/theme-v2/images/badges/objects.png rename to www/assets/theme-v2/images/badges/objects.png diff --git a/assets/theme-v2/images/badges/particles-1024.png b/www/assets/theme-v2/images/badges/particles-1024.png similarity index 100% rename from assets/theme-v2/images/badges/particles-1024.png rename to www/assets/theme-v2/images/badges/particles-1024.png diff --git a/assets/theme-v2/images/badges/particles.png b/www/assets/theme-v2/images/badges/particles.png similarity index 100% rename from assets/theme-v2/images/badges/particles.png rename to www/assets/theme-v2/images/badges/particles.png diff --git a/assets/theme-v2/images/badges/performance-1024.png b/www/assets/theme-v2/images/badges/performance-1024.png similarity index 100% rename from assets/theme-v2/images/badges/performance-1024.png rename to www/assets/theme-v2/images/badges/performance-1024.png diff --git a/assets/theme-v2/images/badges/performance.png b/www/assets/theme-v2/images/badges/performance.png similarity index 100% rename from assets/theme-v2/images/badges/performance.png rename to www/assets/theme-v2/images/badges/performance.png diff --git a/assets/theme-v2/images/badges/platform-settings-1024.png b/www/assets/theme-v2/images/badges/platform-settings-1024.png similarity index 100% rename from assets/theme-v2/images/badges/platform-settings-1024.png rename to www/assets/theme-v2/images/badges/platform-settings-1024.png diff --git a/assets/theme-v2/images/badges/platform-settings.png b/www/assets/theme-v2/images/badges/platform-settings.png similarity index 100% rename from assets/theme-v2/images/badges/platform-settings.png rename to www/assets/theme-v2/images/badges/platform-settings.png diff --git a/assets/theme-v2/images/badges/project-workspace-1024.png b/www/assets/theme-v2/images/badges/project-workspace-1024.png similarity index 100% rename from assets/theme-v2/images/badges/project-workspace-1024.png rename to www/assets/theme-v2/images/badges/project-workspace-1024.png diff --git a/assets/theme-v2/images/badges/project-workspace.png b/www/assets/theme-v2/images/badges/project-workspace.png similarity index 100% rename from assets/theme-v2/images/badges/project-workspace.png rename to www/assets/theme-v2/images/badges/project-workspace.png diff --git a/assets/theme-v2/images/badges/publish-1024.png b/www/assets/theme-v2/images/badges/publish-1024.png similarity index 100% rename from assets/theme-v2/images/badges/publish-1024.png rename to www/assets/theme-v2/images/badges/publish-1024.png diff --git a/assets/theme-v2/images/badges/publish.png b/www/assets/theme-v2/images/badges/publish.png similarity index 100% rename from assets/theme-v2/images/badges/publish.png rename to www/assets/theme-v2/images/badges/publish.png diff --git a/assets/theme-v2/images/badges/ratings-1024.png b/www/assets/theme-v2/images/badges/ratings-1024.png similarity index 100% rename from assets/theme-v2/images/badges/ratings-1024.png rename to www/assets/theme-v2/images/badges/ratings-1024.png diff --git a/assets/theme-v2/images/badges/ratings.png b/www/assets/theme-v2/images/badges/ratings.png similarity index 100% rename from assets/theme-v2/images/badges/ratings.png rename to www/assets/theme-v2/images/badges/ratings.png diff --git a/assets/theme-v2/images/badges/saved-data-1024.png b/www/assets/theme-v2/images/badges/saved-data-1024.png similarity index 100% rename from assets/theme-v2/images/badges/saved-data-1024.png rename to www/assets/theme-v2/images/badges/saved-data-1024.png diff --git a/assets/theme-v2/images/badges/saved-data.png b/www/assets/theme-v2/images/badges/saved-data.png similarity index 100% rename from assets/theme-v2/images/badges/saved-data.png rename to www/assets/theme-v2/images/badges/saved-data.png diff --git a/assets/theme-v2/images/badges/speech-to-text-1024.png b/www/assets/theme-v2/images/badges/speech-to-text-1024.png similarity index 100% rename from assets/theme-v2/images/badges/speech-to-text-1024.png rename to www/assets/theme-v2/images/badges/speech-to-text-1024.png diff --git a/assets/theme-v2/images/badges/speech-to-text.png b/www/assets/theme-v2/images/badges/speech-to-text.png similarity index 100% rename from assets/theme-v2/images/badges/speech-to-text.png rename to www/assets/theme-v2/images/badges/speech-to-text.png diff --git a/assets/theme-v2/images/badges/sprites-1024.png b/www/assets/theme-v2/images/badges/sprites-1024.png similarity index 100% rename from assets/theme-v2/images/badges/sprites-1024.png rename to www/assets/theme-v2/images/badges/sprites-1024.png diff --git a/assets/theme-v2/images/badges/sprites.png b/www/assets/theme-v2/images/badges/sprites.png similarity index 100% rename from assets/theme-v2/images/badges/sprites.png rename to www/assets/theme-v2/images/badges/sprites.png diff --git a/assets/theme-v2/images/badges/tags-1024.png b/www/assets/theme-v2/images/badges/tags-1024.png similarity index 100% rename from assets/theme-v2/images/badges/tags-1024.png rename to www/assets/theme-v2/images/badges/tags-1024.png diff --git a/assets/theme-v2/images/badges/tags.png b/www/assets/theme-v2/images/badges/tags.png similarity index 100% rename from assets/theme-v2/images/badges/tags.png rename to www/assets/theme-v2/images/badges/tags.png diff --git a/assets/theme-v2/images/badges/text-to-speech-1024.png b/www/assets/theme-v2/images/badges/text-to-speech-1024.png similarity index 100% rename from assets/theme-v2/images/badges/text-to-speech-1024.png rename to www/assets/theme-v2/images/badges/text-to-speech-1024.png diff --git a/assets/theme-v2/images/badges/text-to-speech.png b/www/assets/theme-v2/images/badges/text-to-speech.png similarity index 100% rename from assets/theme-v2/images/badges/text-to-speech.png rename to www/assets/theme-v2/images/badges/text-to-speech.png diff --git a/assets/theme-v2/images/badges/users-1024.png b/www/assets/theme-v2/images/badges/users-1024.png similarity index 100% rename from assets/theme-v2/images/badges/users-1024.png rename to www/assets/theme-v2/images/badges/users-1024.png diff --git a/assets/theme-v2/images/badges/users.png b/www/assets/theme-v2/images/badges/users.png similarity index 100% rename from assets/theme-v2/images/badges/users.png rename to www/assets/theme-v2/images/badges/users.png diff --git a/assets/theme-v2/images/badges/videos-1024.png b/www/assets/theme-v2/images/badges/videos-1024.png similarity index 100% rename from assets/theme-v2/images/badges/videos-1024.png rename to www/assets/theme-v2/images/badges/videos-1024.png diff --git a/assets/theme-v2/images/badges/videos.png b/www/assets/theme-v2/images/badges/videos.png similarity index 100% rename from assets/theme-v2/images/badges/videos.png rename to www/assets/theme-v2/images/badges/videos.png diff --git a/assets/theme-v2/images/badges/voices-1024.png b/www/assets/theme-v2/images/badges/voices-1024.png similarity index 100% rename from assets/theme-v2/images/badges/voices-1024.png rename to www/assets/theme-v2/images/badges/voices-1024.png diff --git a/assets/theme-v2/images/badges/voices.png b/www/assets/theme-v2/images/badges/voices.png similarity index 100% rename from assets/theme-v2/images/badges/voices.png rename to www/assets/theme-v2/images/badges/voices.png diff --git a/assets/theme-v2/images/badges/worlds-1024.png b/www/assets/theme-v2/images/badges/worlds-1024.png similarity index 100% rename from assets/theme-v2/images/badges/worlds-1024.png rename to www/assets/theme-v2/images/badges/worlds-1024.png diff --git a/assets/theme-v2/images/badges/worlds.png b/www/assets/theme-v2/images/badges/worlds.png similarity index 100% rename from assets/theme-v2/images/badges/worlds.png rename to www/assets/theme-v2/images/badges/worlds.png diff --git a/assets/theme-v2/images/forge-bot.svg b/www/assets/theme-v2/images/forge-bot.svg similarity index 100% rename from assets/theme-v2/images/forge-bot.svg rename to www/assets/theme-v2/images/forge-bot.svg diff --git a/assets/theme-v2/images/game-foundry-studio-logo.png b/www/assets/theme-v2/images/game-foundry-studio-logo.png similarity index 100% rename from assets/theme-v2/images/game-foundry-studio-logo.png rename to www/assets/theme-v2/images/game-foundry-studio-logo.png diff --git a/assets/theme-v2/images/game-foundry-tools-poster.png b/www/assets/theme-v2/images/game-foundry-tools-poster.png similarity index 100% rename from assets/theme-v2/images/game-foundry-tools-poster.png rename to www/assets/theme-v2/images/game-foundry-tools-poster.png diff --git a/assets/theme-v2/images/game-foundry-tools-poster=2.png b/www/assets/theme-v2/images/game-foundry-tools-poster=2.png similarity index 100% rename from assets/theme-v2/images/game-foundry-tools-poster=2.png rename to www/assets/theme-v2/images/game-foundry-tools-poster=2.png diff --git a/assets/theme-v2/images/gfs-chevron-down.svg b/www/assets/theme-v2/images/gfs-chevron-down.svg similarity index 100% rename from assets/theme-v2/images/gfs-chevron-down.svg rename to www/assets/theme-v2/images/gfs-chevron-down.svg diff --git a/assets/theme-v2/images/gfs-chevron-up.svg b/www/assets/theme-v2/images/gfs-chevron-up.svg similarity index 100% rename from assets/theme-v2/images/gfs-chevron-up.svg rename to www/assets/theme-v2/images/gfs-chevron-up.svg diff --git a/assets/theme-v2/images/image-missing.svg b/www/assets/theme-v2/images/image-missing.svg similarity index 100% rename from assets/theme-v2/images/image-missing.svg rename to www/assets/theme-v2/images/image-missing.svg diff --git a/assets/theme-v2/images/logo-mark.svg b/www/assets/theme-v2/images/logo-mark.svg similarity index 100% rename from assets/theme-v2/images/logo-mark.svg rename to www/assets/theme-v2/images/logo-mark.svg diff --git a/assets/theme-v2/images/mascots/ChatGPT Image May 30, 2026, 07_57_30 PM.png b/www/assets/theme-v2/images/mascots/ChatGPT Image May 30, 2026, 07_57_30 PM.png similarity index 100% rename from assets/theme-v2/images/mascots/ChatGPT Image May 30, 2026, 07_57_30 PM.png rename to www/assets/theme-v2/images/mascots/ChatGPT Image May 30, 2026, 07_57_30 PM.png diff --git a/assets/theme-v2/images/mascots/ChatGPT Image May 30, 2026, 07_57_30 PM2.png b/www/assets/theme-v2/images/mascots/ChatGPT Image May 30, 2026, 07_57_30 PM2.png similarity index 100% rename from assets/theme-v2/images/mascots/ChatGPT Image May 30, 2026, 07_57_30 PM2.png rename to www/assets/theme-v2/images/mascots/ChatGPT Image May 30, 2026, 07_57_30 PM2.png diff --git a/assets/theme-v2/images/mascots/forge-bot-single.png b/www/assets/theme-v2/images/mascots/forge-bot-single.png similarity index 100% rename from assets/theme-v2/images/mascots/forge-bot-single.png rename to www/assets/theme-v2/images/mascots/forge-bot-single.png diff --git a/assets/theme-v2/images/mascots/forgebot.png b/www/assets/theme-v2/images/mascots/forgebot.png similarity index 100% rename from assets/theme-v2/images/mascots/forgebot.png rename to www/assets/theme-v2/images/mascots/forgebot.png diff --git a/assets/theme-v2/images/mascots/foundry-bot.png b/www/assets/theme-v2/images/mascots/foundry-bot.png similarity index 100% rename from assets/theme-v2/images/mascots/foundry-bot.png rename to www/assets/theme-v2/images/mascots/foundry-bot.png diff --git a/assets/theme-v2/images/mascots/game-foundry-mascots-sheet.png b/www/assets/theme-v2/images/mascots/game-foundry-mascots-sheet.png similarity index 100% rename from assets/theme-v2/images/mascots/game-foundry-mascots-sheet.png rename to www/assets/theme-v2/images/mascots/game-foundry-mascots-sheet.png diff --git a/assets/theme-v2/images/mascots/localization-studio.png b/www/assets/theme-v2/images/mascots/localization-studio.png similarity index 100% rename from assets/theme-v2/images/mascots/localization-studio.png rename to www/assets/theme-v2/images/mascots/localization-studio.png diff --git a/assets/theme-v2/images/mascots/pixel-smith.png b/www/assets/theme-v2/images/mascots/pixel-smith.png similarity index 100% rename from assets/theme-v2/images/mascots/pixel-smith.png rename to www/assets/theme-v2/images/mascots/pixel-smith.png diff --git a/assets/theme-v2/images/mascots/spark.png b/www/assets/theme-v2/images/mascots/spark.png similarity index 100% rename from assets/theme-v2/images/mascots/spark.png rename to www/assets/theme-v2/images/mascots/spark.png diff --git a/assets/theme-v2/images/merch/logo-merch-0.png b/www/assets/theme-v2/images/merch/logo-merch-0.png similarity index 100% rename from assets/theme-v2/images/merch/logo-merch-0.png rename to www/assets/theme-v2/images/merch/logo-merch-0.png diff --git a/assets/theme-v2/images/merch/logo-merch-2.png b/www/assets/theme-v2/images/merch/logo-merch-2.png similarity index 100% rename from assets/theme-v2/images/merch/logo-merch-2.png rename to www/assets/theme-v2/images/merch/logo-merch-2.png diff --git a/assets/theme-v2/images/merch/logo-merch-3.png b/www/assets/theme-v2/images/merch/logo-merch-3.png similarity index 100% rename from assets/theme-v2/images/merch/logo-merch-3.png rename to www/assets/theme-v2/images/merch/logo-merch-3.png diff --git a/assets/theme-v2/images/merch/logo-merch-4-like.png b/www/assets/theme-v2/images/merch/logo-merch-4-like.png similarity index 100% rename from assets/theme-v2/images/merch/logo-merch-4-like.png rename to www/assets/theme-v2/images/merch/logo-merch-4-like.png diff --git a/assets/theme-v2/images/merch/logo-merch-5.png b/www/assets/theme-v2/images/merch/logo-merch-5.png similarity index 100% rename from assets/theme-v2/images/merch/logo-merch-5.png rename to www/assets/theme-v2/images/merch/logo-merch-5.png diff --git a/assets/theme-v2/images/merch/logo-trans-back.png b/www/assets/theme-v2/images/merch/logo-trans-back.png similarity index 100% rename from assets/theme-v2/images/merch/logo-trans-back.png rename to www/assets/theme-v2/images/merch/logo-trans-back.png diff --git a/assets/theme-v2/images/tools/achievement-1024.png b/www/assets/theme-v2/images/tools/achievement-1024.png similarity index 100% rename from assets/theme-v2/images/tools/achievement-1024.png rename to www/assets/theme-v2/images/tools/achievement-1024.png diff --git a/assets/theme-v2/images/tools/achievement.png b/www/assets/theme-v2/images/tools/achievement.png similarity index 100% rename from assets/theme-v2/images/tools/achievement.png rename to www/assets/theme-v2/images/tools/achievement.png diff --git a/assets/theme-v2/images/tools/ai-assistant-1024.png b/www/assets/theme-v2/images/tools/ai-assistant-1024.png similarity index 100% rename from assets/theme-v2/images/tools/ai-assistant-1024.png rename to www/assets/theme-v2/images/tools/ai-assistant-1024.png diff --git a/assets/theme-v2/images/tools/ai-assistant.png b/www/assets/theme-v2/images/tools/ai-assistant.png similarity index 100% rename from assets/theme-v2/images/tools/ai-assistant.png rename to www/assets/theme-v2/images/tools/ai-assistant.png diff --git a/assets/theme-v2/images/tools/animation-1024.png b/www/assets/theme-v2/images/tools/animation-1024.png similarity index 100% rename from assets/theme-v2/images/tools/animation-1024.png rename to www/assets/theme-v2/images/tools/animation-1024.png diff --git a/assets/theme-v2/images/tools/animation.png b/www/assets/theme-v2/images/tools/animation.png similarity index 100% rename from assets/theme-v2/images/tools/animation.png rename to www/assets/theme-v2/images/tools/animation.png diff --git a/assets/theme-v2/images/tools/arcade.png b/www/assets/theme-v2/images/tools/arcade.png similarity index 100% rename from assets/theme-v2/images/tools/arcade.png rename to www/assets/theme-v2/images/tools/arcade.png diff --git a/assets/theme-v2/images/tools/asset-studio.png b/www/assets/theme-v2/images/tools/asset-studio.png similarity index 100% rename from assets/theme-v2/images/tools/asset-studio.png rename to www/assets/theme-v2/images/tools/asset-studio.png diff --git a/assets/theme-v2/images/tools/assets-1024.png b/www/assets/theme-v2/images/tools/assets-1024.png similarity index 100% rename from assets/theme-v2/images/tools/assets-1024.png rename to www/assets/theme-v2/images/tools/assets-1024.png diff --git a/assets/theme-v2/images/tools/assets.png b/www/assets/theme-v2/images/tools/assets.png similarity index 100% rename from assets/theme-v2/images/tools/assets.png rename to www/assets/theme-v2/images/tools/assets.png diff --git a/assets/theme-v2/images/tools/audio-1024.png b/www/assets/theme-v2/images/tools/audio-1024.png similarity index 100% rename from assets/theme-v2/images/tools/audio-1024.png rename to www/assets/theme-v2/images/tools/audio-1024.png diff --git a/assets/theme-v2/images/tools/audio-effects-1024.png b/www/assets/theme-v2/images/tools/audio-effects-1024.png similarity index 100% rename from assets/theme-v2/images/tools/audio-effects-1024.png rename to www/assets/theme-v2/images/tools/audio-effects-1024.png diff --git a/assets/theme-v2/images/tools/audio-effects.png b/www/assets/theme-v2/images/tools/audio-effects.png similarity index 100% rename from assets/theme-v2/images/tools/audio-effects.png rename to www/assets/theme-v2/images/tools/audio-effects.png diff --git a/assets/theme-v2/images/tools/audio.png b/www/assets/theme-v2/images/tools/audio.png similarity index 100% rename from assets/theme-v2/images/tools/audio.png rename to www/assets/theme-v2/images/tools/audio.png diff --git a/assets/theme-v2/images/tools/build-game-1024.png b/www/assets/theme-v2/images/tools/build-game-1024.png similarity index 100% rename from assets/theme-v2/images/tools/build-game-1024.png rename to www/assets/theme-v2/images/tools/build-game-1024.png diff --git a/assets/theme-v2/images/tools/build-game.png b/www/assets/theme-v2/images/tools/build-game.png similarity index 100% rename from assets/theme-v2/images/tools/build-game.png rename to www/assets/theme-v2/images/tools/build-game.png diff --git a/assets/theme-v2/images/tools/characters-1024.png b/www/assets/theme-v2/images/tools/characters-1024.png similarity index 100% rename from assets/theme-v2/images/tools/characters-1024.png rename to www/assets/theme-v2/images/tools/characters-1024.png diff --git a/assets/theme-v2/images/tools/characters.png b/www/assets/theme-v2/images/tools/characters.png similarity index 100% rename from assets/theme-v2/images/tools/characters.png rename to www/assets/theme-v2/images/tools/characters.png diff --git a/assets/theme-v2/images/tools/cloud-1024.png b/www/assets/theme-v2/images/tools/cloud-1024.png similarity index 100% rename from assets/theme-v2/images/tools/cloud-1024.png rename to www/assets/theme-v2/images/tools/cloud-1024.png diff --git a/assets/theme-v2/images/tools/cloud-studio.png b/www/assets/theme-v2/images/tools/cloud-studio.png similarity index 100% rename from assets/theme-v2/images/tools/cloud-studio.png rename to www/assets/theme-v2/images/tools/cloud-studio.png diff --git a/assets/theme-v2/images/tools/cloud.png b/www/assets/theme-v2/images/tools/cloud.png similarity index 100% rename from assets/theme-v2/images/tools/cloud.png rename to www/assets/theme-v2/images/tools/cloud.png diff --git a/assets/theme-v2/images/tools/code-1024.png b/www/assets/theme-v2/images/tools/code-1024.png similarity index 100% rename from assets/theme-v2/images/tools/code-1024.png rename to www/assets/theme-v2/images/tools/code-1024.png diff --git a/assets/theme-v2/images/tools/code-studio.png b/www/assets/theme-v2/images/tools/code-studio.png similarity index 100% rename from assets/theme-v2/images/tools/code-studio.png rename to www/assets/theme-v2/images/tools/code-studio.png diff --git a/assets/theme-v2/images/tools/code.png b/www/assets/theme-v2/images/tools/code.png similarity index 100% rename from assets/theme-v2/images/tools/code.png rename to www/assets/theme-v2/images/tools/code.png diff --git a/assets/theme-v2/images/tools/colors-1024.png b/www/assets/theme-v2/images/tools/colors-1024.png similarity index 100% rename from assets/theme-v2/images/tools/colors-1024.png rename to www/assets/theme-v2/images/tools/colors-1024.png diff --git a/assets/theme-v2/images/tools/colors.png b/www/assets/theme-v2/images/tools/colors.png similarity index 100% rename from assets/theme-v2/images/tools/colors.png rename to www/assets/theme-v2/images/tools/colors.png diff --git a/assets/theme-v2/images/tools/community-1024.png b/www/assets/theme-v2/images/tools/community-1024.png similarity index 100% rename from assets/theme-v2/images/tools/community-1024.png rename to www/assets/theme-v2/images/tools/community-1024.png diff --git a/assets/theme-v2/images/tools/community.png b/www/assets/theme-v2/images/tools/community.png similarity index 100% rename from assets/theme-v2/images/tools/community.png rename to www/assets/theme-v2/images/tools/community.png diff --git a/assets/theme-v2/images/tools/controls-1024.png b/www/assets/theme-v2/images/tools/controls-1024.png similarity index 100% rename from assets/theme-v2/images/tools/controls-1024.png rename to www/assets/theme-v2/images/tools/controls-1024.png diff --git a/assets/theme-v2/images/tools/controls.png b/www/assets/theme-v2/images/tools/controls.png similarity index 100% rename from assets/theme-v2/images/tools/controls.png rename to www/assets/theme-v2/images/tools/controls.png diff --git a/assets/theme-v2/images/tools/debug-1024.png b/www/assets/theme-v2/images/tools/debug-1024.png similarity index 100% rename from assets/theme-v2/images/tools/debug-1024.png rename to www/assets/theme-v2/images/tools/debug-1024.png diff --git a/assets/theme-v2/images/tools/debug.png b/www/assets/theme-v2/images/tools/debug.png similarity index 100% rename from assets/theme-v2/images/tools/debug.png rename to www/assets/theme-v2/images/tools/debug.png diff --git a/assets/theme-v2/images/tools/environments-1024.png b/www/assets/theme-v2/images/tools/environments-1024.png similarity index 100% rename from assets/theme-v2/images/tools/environments-1024.png rename to www/assets/theme-v2/images/tools/environments-1024.png diff --git a/assets/theme-v2/images/tools/environments.png b/www/assets/theme-v2/images/tools/environments.png similarity index 100% rename from assets/theme-v2/images/tools/environments.png rename to www/assets/theme-v2/images/tools/environments.png diff --git a/assets/theme-v2/images/tools/events-1024.png b/www/assets/theme-v2/images/tools/events-1024.png similarity index 100% rename from assets/theme-v2/images/tools/events-1024.png rename to www/assets/theme-v2/images/tools/events-1024.png diff --git a/assets/theme-v2/images/tools/events.png b/www/assets/theme-v2/images/tools/events.png similarity index 100% rename from assets/theme-v2/images/tools/events.png rename to www/assets/theme-v2/images/tools/events.png diff --git a/assets/theme-v2/images/tools/fonts-1024.png b/www/assets/theme-v2/images/tools/fonts-1024.png similarity index 100% rename from assets/theme-v2/images/tools/fonts-1024.png rename to www/assets/theme-v2/images/tools/fonts-1024.png diff --git a/assets/theme-v2/images/tools/fonts.png b/www/assets/theme-v2/images/tools/fonts.png similarity index 100% rename from assets/theme-v2/images/tools/fonts.png rename to www/assets/theme-v2/images/tools/fonts.png diff --git a/assets/theme-v2/images/tools/game-builder.png b/www/assets/theme-v2/images/tools/game-builder.png similarity index 100% rename from assets/theme-v2/images/tools/game-builder.png rename to www/assets/theme-v2/images/tools/game-builder.png diff --git a/assets/theme-v2/images/tools/game-configuration-1024.png b/www/assets/theme-v2/images/tools/game-configuration-1024.png similarity index 100% rename from assets/theme-v2/images/tools/game-configuration-1024.png rename to www/assets/theme-v2/images/tools/game-configuration-1024.png diff --git a/assets/theme-v2/images/tools/game-configuration.png b/www/assets/theme-v2/images/tools/game-configuration.png similarity index 100% rename from assets/theme-v2/images/tools/game-configuration.png rename to www/assets/theme-v2/images/tools/game-configuration.png diff --git a/assets/theme-v2/images/tools/game-design-1024.png b/www/assets/theme-v2/images/tools/game-design-1024.png similarity index 100% rename from assets/theme-v2/images/tools/game-design-1024.png rename to www/assets/theme-v2/images/tools/game-design-1024.png diff --git a/assets/theme-v2/images/tools/game-design-studio.png b/www/assets/theme-v2/images/tools/game-design-studio.png similarity index 100% rename from assets/theme-v2/images/tools/game-design-studio.png rename to www/assets/theme-v2/images/tools/game-design-studio.png diff --git a/assets/theme-v2/images/tools/game-design.png b/www/assets/theme-v2/images/tools/game-design.png similarity index 100% rename from assets/theme-v2/images/tools/game-design.png rename to www/assets/theme-v2/images/tools/game-design.png diff --git a/assets/theme-v2/images/tools/game-hub-1024.png b/www/assets/theme-v2/images/tools/game-hub-1024.png similarity index 100% rename from assets/theme-v2/images/tools/game-hub-1024.png rename to www/assets/theme-v2/images/tools/game-hub-1024.png diff --git a/assets/theme-v2/images/tools/game-hub.png b/www/assets/theme-v2/images/tools/game-hub.png similarity index 100% rename from assets/theme-v2/images/tools/game-hub.png rename to www/assets/theme-v2/images/tools/game-hub.png diff --git a/assets/theme-v2/images/tools/game-migration-1024.png b/www/assets/theme-v2/images/tools/game-migration-1024.png similarity index 100% rename from assets/theme-v2/images/tools/game-migration-1024.png rename to www/assets/theme-v2/images/tools/game-migration-1024.png diff --git a/assets/theme-v2/images/tools/game-migration.png b/www/assets/theme-v2/images/tools/game-migration.png similarity index 100% rename from assets/theme-v2/images/tools/game-migration.png rename to www/assets/theme-v2/images/tools/game-migration.png diff --git a/assets/theme-v2/images/tools/game-testing-1024.png b/www/assets/theme-v2/images/tools/game-testing-1024.png similarity index 100% rename from assets/theme-v2/images/tools/game-testing-1024.png rename to www/assets/theme-v2/images/tools/game-testing-1024.png diff --git a/assets/theme-v2/images/tools/game-testing.png b/www/assets/theme-v2/images/tools/game-testing.png similarity index 100% rename from assets/theme-v2/images/tools/game-testing.png rename to www/assets/theme-v2/images/tools/game-testing.png diff --git a/assets/theme-v2/images/tools/hitboxes-1024.png b/www/assets/theme-v2/images/tools/hitboxes-1024.png similarity index 100% rename from assets/theme-v2/images/tools/hitboxes-1024.png rename to www/assets/theme-v2/images/tools/hitboxes-1024.png diff --git a/assets/theme-v2/images/tools/hitboxes.png b/www/assets/theme-v2/images/tools/hitboxes.png similarity index 100% rename from assets/theme-v2/images/tools/hitboxes.png rename to www/assets/theme-v2/images/tools/hitboxes.png diff --git a/assets/theme-v2/images/tools/input-studio.png b/www/assets/theme-v2/images/tools/input-studio.png similarity index 100% rename from assets/theme-v2/images/tools/input-studio.png rename to www/assets/theme-v2/images/tools/input-studio.png diff --git a/assets/theme-v2/images/tools/languages-1024.png b/www/assets/theme-v2/images/tools/languages-1024.png similarity index 100% rename from assets/theme-v2/images/tools/languages-1024.png rename to www/assets/theme-v2/images/tools/languages-1024.png diff --git a/assets/theme-v2/images/tools/languages.png b/www/assets/theme-v2/images/tools/languages.png similarity index 100% rename from assets/theme-v2/images/tools/languages.png rename to www/assets/theme-v2/images/tools/languages.png diff --git a/assets/theme-v2/images/tools/learn-1024.png b/www/assets/theme-v2/images/tools/learn-1024.png similarity index 100% rename from assets/theme-v2/images/tools/learn-1024.png rename to www/assets/theme-v2/images/tools/learn-1024.png diff --git a/assets/theme-v2/images/tools/learn-studio.png b/www/assets/theme-v2/images/tools/learn-studio.png similarity index 100% rename from assets/theme-v2/images/tools/learn-studio.png rename to www/assets/theme-v2/images/tools/learn-studio.png diff --git a/assets/theme-v2/images/tools/learn.png b/www/assets/theme-v2/images/tools/learn.png similarity index 100% rename from assets/theme-v2/images/tools/learn.png rename to www/assets/theme-v2/images/tools/learn.png diff --git a/assets/theme-v2/images/tools/localization-studio.png b/www/assets/theme-v2/images/tools/localization-studio.png similarity index 100% rename from assets/theme-v2/images/tools/localization-studio.png rename to www/assets/theme-v2/images/tools/localization-studio.png diff --git a/assets/theme-v2/images/tools/localizaton.png b/www/assets/theme-v2/images/tools/localizaton.png similarity index 100% rename from assets/theme-v2/images/tools/localizaton.png rename to www/assets/theme-v2/images/tools/localizaton.png diff --git a/assets/theme-v2/images/tools/marketplace-1024.png b/www/assets/theme-v2/images/tools/marketplace-1024.png similarity index 100% rename from assets/theme-v2/images/tools/marketplace-1024.png rename to www/assets/theme-v2/images/tools/marketplace-1024.png diff --git a/assets/theme-v2/images/tools/marketplace.png b/www/assets/theme-v2/images/tools/marketplace.png similarity index 100% rename from assets/theme-v2/images/tools/marketplace.png rename to www/assets/theme-v2/images/tools/marketplace.png diff --git a/assets/theme-v2/images/tools/match_format.png b/www/assets/theme-v2/images/tools/match_format.png similarity index 100% rename from assets/theme-v2/images/tools/match_format.png rename to www/assets/theme-v2/images/tools/match_format.png diff --git a/assets/theme-v2/images/tools/midi-1024.png b/www/assets/theme-v2/images/tools/midi-1024.png similarity index 100% rename from assets/theme-v2/images/tools/midi-1024.png rename to www/assets/theme-v2/images/tools/midi-1024.png diff --git a/assets/theme-v2/images/tools/midi-studio.png b/www/assets/theme-v2/images/tools/midi-studio.png similarity index 100% rename from assets/theme-v2/images/tools/midi-studio.png rename to www/assets/theme-v2/images/tools/midi-studio.png diff --git a/assets/theme-v2/images/tools/midi.png b/www/assets/theme-v2/images/tools/midi.png similarity index 100% rename from assets/theme-v2/images/tools/midi.png rename to www/assets/theme-v2/images/tools/midi.png diff --git a/assets/theme-v2/images/tools/music-1024.png b/www/assets/theme-v2/images/tools/music-1024.png similarity index 100% rename from assets/theme-v2/images/tools/music-1024.png rename to www/assets/theme-v2/images/tools/music-1024.png diff --git a/assets/theme-v2/images/tools/music.png b/www/assets/theme-v2/images/tools/music.png similarity index 100% rename from assets/theme-v2/images/tools/music.png rename to www/assets/theme-v2/images/tools/music.png diff --git a/assets/theme-v2/images/tools/object-vector-studio.png b/www/assets/theme-v2/images/tools/object-vector-studio.png similarity index 100% rename from assets/theme-v2/images/tools/object-vector-studio.png rename to www/assets/theme-v2/images/tools/object-vector-studio.png diff --git a/assets/theme-v2/images/tools/objects-1024.png b/www/assets/theme-v2/images/tools/objects-1024.png similarity index 100% rename from assets/theme-v2/images/tools/objects-1024.png rename to www/assets/theme-v2/images/tools/objects-1024.png diff --git a/assets/theme-v2/images/tools/objects.png b/www/assets/theme-v2/images/tools/objects.png similarity index 100% rename from assets/theme-v2/images/tools/objects.png rename to www/assets/theme-v2/images/tools/objects.png diff --git a/assets/theme-v2/images/tools/palette-manager.png b/www/assets/theme-v2/images/tools/palette-manager.png similarity index 100% rename from assets/theme-v2/images/tools/palette-manager.png rename to www/assets/theme-v2/images/tools/palette-manager.png diff --git a/assets/theme-v2/images/tools/particle-studio.png b/www/assets/theme-v2/images/tools/particle-studio.png similarity index 100% rename from assets/theme-v2/images/tools/particle-studio.png rename to www/assets/theme-v2/images/tools/particle-studio.png diff --git a/assets/theme-v2/images/tools/particles-1024.png b/www/assets/theme-v2/images/tools/particles-1024.png similarity index 100% rename from assets/theme-v2/images/tools/particles-1024.png rename to www/assets/theme-v2/images/tools/particles-1024.png diff --git a/assets/theme-v2/images/tools/particles.png b/www/assets/theme-v2/images/tools/particles.png similarity index 100% rename from assets/theme-v2/images/tools/particles.png rename to www/assets/theme-v2/images/tools/particles.png diff --git a/assets/theme-v2/images/tools/performance-1024.png b/www/assets/theme-v2/images/tools/performance-1024.png similarity index 100% rename from assets/theme-v2/images/tools/performance-1024.png rename to www/assets/theme-v2/images/tools/performance-1024.png diff --git a/assets/theme-v2/images/tools/performance.png b/www/assets/theme-v2/images/tools/performance.png similarity index 100% rename from assets/theme-v2/images/tools/performance.png rename to www/assets/theme-v2/images/tools/performance.png diff --git a/assets/theme-v2/images/tools/platform-settings-1024.png b/www/assets/theme-v2/images/tools/platform-settings-1024.png similarity index 100% rename from assets/theme-v2/images/tools/platform-settings-1024.png rename to www/assets/theme-v2/images/tools/platform-settings-1024.png diff --git a/assets/theme-v2/images/tools/platform-settings.png b/www/assets/theme-v2/images/tools/platform-settings.png similarity index 100% rename from assets/theme-v2/images/tools/platform-settings.png rename to www/assets/theme-v2/images/tools/platform-settings.png diff --git a/assets/theme-v2/images/tools/project-workspace-1024.png b/www/assets/theme-v2/images/tools/project-workspace-1024.png similarity index 100% rename from assets/theme-v2/images/tools/project-workspace-1024.png rename to www/assets/theme-v2/images/tools/project-workspace-1024.png diff --git a/assets/theme-v2/images/tools/project-workspace.png b/www/assets/theme-v2/images/tools/project-workspace.png similarity index 100% rename from assets/theme-v2/images/tools/project-workspace.png rename to www/assets/theme-v2/images/tools/project-workspace.png diff --git a/assets/theme-v2/images/tools/publish-1024.png b/www/assets/theme-v2/images/tools/publish-1024.png similarity index 100% rename from assets/theme-v2/images/tools/publish-1024.png rename to www/assets/theme-v2/images/tools/publish-1024.png diff --git a/assets/theme-v2/images/tools/publish-studio.png b/www/assets/theme-v2/images/tools/publish-studio.png similarity index 100% rename from assets/theme-v2/images/tools/publish-studio.png rename to www/assets/theme-v2/images/tools/publish-studio.png diff --git a/assets/theme-v2/images/tools/publish.png b/www/assets/theme-v2/images/tools/publish.png similarity index 100% rename from assets/theme-v2/images/tools/publish.png rename to www/assets/theme-v2/images/tools/publish.png diff --git a/assets/theme-v2/images/tools/ratings-1024.png b/www/assets/theme-v2/images/tools/ratings-1024.png similarity index 100% rename from assets/theme-v2/images/tools/ratings-1024.png rename to www/assets/theme-v2/images/tools/ratings-1024.png diff --git a/assets/theme-v2/images/tools/ratings.png b/www/assets/theme-v2/images/tools/ratings.png similarity index 100% rename from assets/theme-v2/images/tools/ratings.png rename to www/assets/theme-v2/images/tools/ratings.png diff --git a/assets/theme-v2/images/tools/saved-data-1024.png b/www/assets/theme-v2/images/tools/saved-data-1024.png similarity index 100% rename from assets/theme-v2/images/tools/saved-data-1024.png rename to www/assets/theme-v2/images/tools/saved-data-1024.png diff --git a/assets/theme-v2/images/tools/saved-data.png b/www/assets/theme-v2/images/tools/saved-data.png similarity index 100% rename from assets/theme-v2/images/tools/saved-data.png rename to www/assets/theme-v2/images/tools/saved-data.png diff --git a/assets/theme-v2/images/tools/settings-studio.png b/www/assets/theme-v2/images/tools/settings-studio.png similarity index 100% rename from assets/theme-v2/images/tools/settings-studio.png rename to www/assets/theme-v2/images/tools/settings-studio.png diff --git a/assets/theme-v2/images/tools/sound-studio.png b/www/assets/theme-v2/images/tools/sound-studio.png similarity index 100% rename from assets/theme-v2/images/tools/sound-studio.png rename to www/assets/theme-v2/images/tools/sound-studio.png diff --git a/assets/theme-v2/images/tools/speech-to-text-1024.png b/www/assets/theme-v2/images/tools/speech-to-text-1024.png similarity index 100% rename from assets/theme-v2/images/tools/speech-to-text-1024.png rename to www/assets/theme-v2/images/tools/speech-to-text-1024.png diff --git a/assets/theme-v2/images/tools/speech-to-text.png b/www/assets/theme-v2/images/tools/speech-to-text.png similarity index 100% rename from assets/theme-v2/images/tools/speech-to-text.png rename to www/assets/theme-v2/images/tools/speech-to-text.png diff --git a/assets/theme-v2/images/tools/sprites-1024.png b/www/assets/theme-v2/images/tools/sprites-1024.png similarity index 100% rename from assets/theme-v2/images/tools/sprites-1024.png rename to www/assets/theme-v2/images/tools/sprites-1024.png diff --git a/assets/theme-v2/images/tools/sprites.png b/www/assets/theme-v2/images/tools/sprites.png similarity index 100% rename from assets/theme-v2/images/tools/sprites.png rename to www/assets/theme-v2/images/tools/sprites.png diff --git a/assets/theme-v2/images/tools/storage-inspector.png b/www/assets/theme-v2/images/tools/storage-inspector.png similarity index 100% rename from assets/theme-v2/images/tools/storage-inspector.png rename to www/assets/theme-v2/images/tools/storage-inspector.png diff --git a/assets/theme-v2/images/tools/tags-1024.png b/www/assets/theme-v2/images/tools/tags-1024.png similarity index 100% rename from assets/theme-v2/images/tools/tags-1024.png rename to www/assets/theme-v2/images/tools/tags-1024.png diff --git a/assets/theme-v2/images/tools/tags.png b/www/assets/theme-v2/images/tools/tags.png similarity index 100% rename from assets/theme-v2/images/tools/tags.png rename to www/assets/theme-v2/images/tools/tags.png diff --git a/assets/theme-v2/images/tools/text-to-speech.png b/www/assets/theme-v2/images/tools/text-to-speech.png similarity index 100% rename from assets/theme-v2/images/tools/text-to-speech.png rename to www/assets/theme-v2/images/tools/text-to-speech.png diff --git a/assets/theme-v2/images/tools/users-1024.png b/www/assets/theme-v2/images/tools/users-1024.png similarity index 100% rename from assets/theme-v2/images/tools/users-1024.png rename to www/assets/theme-v2/images/tools/users-1024.png diff --git a/assets/theme-v2/images/tools/users.png b/www/assets/theme-v2/images/tools/users.png similarity index 100% rename from assets/theme-v2/images/tools/users.png rename to www/assets/theme-v2/images/tools/users.png diff --git a/assets/theme-v2/images/tools/videos-1024.png b/www/assets/theme-v2/images/tools/videos-1024.png similarity index 100% rename from assets/theme-v2/images/tools/videos-1024.png rename to www/assets/theme-v2/images/tools/videos-1024.png diff --git a/assets/theme-v2/images/tools/videos.png b/www/assets/theme-v2/images/tools/videos.png similarity index 100% rename from assets/theme-v2/images/tools/videos.png rename to www/assets/theme-v2/images/tools/videos.png diff --git a/assets/theme-v2/images/tools/voices-1024.png b/www/assets/theme-v2/images/tools/voices-1024.png similarity index 100% rename from assets/theme-v2/images/tools/voices-1024.png rename to www/assets/theme-v2/images/tools/voices-1024.png diff --git a/assets/theme-v2/images/tools/voices.png b/www/assets/theme-v2/images/tools/voices.png similarity index 100% rename from assets/theme-v2/images/tools/voices.png rename to www/assets/theme-v2/images/tools/voices.png diff --git a/assets/theme-v2/images/tools/world-vector-studio.png b/www/assets/theme-v2/images/tools/world-vector-studio.png similarity index 100% rename from assets/theme-v2/images/tools/world-vector-studio.png rename to www/assets/theme-v2/images/tools/world-vector-studio.png diff --git a/assets/theme-v2/images/tools/worlds-1024.png b/www/assets/theme-v2/images/tools/worlds-1024.png similarity index 100% rename from assets/theme-v2/images/tools/worlds-1024.png rename to www/assets/theme-v2/images/tools/worlds-1024.png diff --git a/assets/theme-v2/images/tools/worlds.png b/www/assets/theme-v2/images/tools/worlds.png similarity index 100% rename from assets/theme-v2/images/tools/worlds.png rename to www/assets/theme-v2/images/tools/worlds.png diff --git a/assets/theme-v2/images/youtube_banner.png b/www/assets/theme-v2/images/youtube_banner.png similarity index 100% rename from assets/theme-v2/images/youtube_banner.png rename to www/assets/theme-v2/images/youtube_banner.png diff --git a/assets/theme-v2/images/youtube_video.png b/www/assets/theme-v2/images/youtube_video.png similarity index 100% rename from assets/theme-v2/images/youtube_video.png rename to www/assets/theme-v2/images/youtube_video.png diff --git a/assets/theme-v2/js/account-achievements.js b/www/assets/theme-v2/js/account-achievements.js similarity index 96% rename from assets/theme-v2/js/account-achievements.js rename to www/assets/theme-v2/js/account-achievements.js index 184e4af67..7b7d8813b 100644 --- a/assets/theme-v2/js/account-achievements.js +++ b/www/assets/theme-v2/js/account-achievements.js @@ -1,5 +1,5 @@ -import { createServerRepositoryClient } from "../../../src/api/server-api-client.js"; -import { getSessionCurrent } from "../../../src/api/session-api-client.js"; +import { createServerRepositoryClient } from "../../../../src/api/server-api-client.js"; +import { getSessionCurrent } from "../../../../src/api/session-api-client.js"; const tabs = Array.from(document.querySelectorAll("[data-achievements-tab]")); const panels = Array.from(document.querySelectorAll("[data-achievements-panel]")); diff --git a/assets/theme-v2/js/account-ai-credits.js b/www/assets/theme-v2/js/account-ai-credits.js similarity index 98% rename from assets/theme-v2/js/account-ai-credits.js rename to www/assets/theme-v2/js/account-ai-credits.js index be8db53fa..8cc01d6c8 100644 --- a/assets/theme-v2/js/account-ai-credits.js +++ b/www/assets/theme-v2/js/account-ai-credits.js @@ -1,4 +1,4 @@ -import { readAiCreditDisplay } from "../../../src/api/ai-credits-api-client.js"; +import { readAiCreditDisplay } from "../../../../src/api/ai-credits-api-client.js"; function text(value, fallback = "N/A") { return value === undefined || value === null || value === "" ? fallback : String(value); diff --git a/assets/theme-v2/js/account-auth-actions.js b/www/assets/theme-v2/js/account-auth-actions.js similarity index 100% rename from assets/theme-v2/js/account-auth-actions.js rename to www/assets/theme-v2/js/account-auth-actions.js diff --git a/assets/theme-v2/js/account-auth-service.js b/www/assets/theme-v2/js/account-auth-service.js similarity index 97% rename from assets/theme-v2/js/account-auth-service.js rename to www/assets/theme-v2/js/account-auth-service.js index 6b2fe6b69..88979d020 100644 --- a/assets/theme-v2/js/account-auth-service.js +++ b/www/assets/theme-v2/js/account-auth-service.js @@ -1,4 +1,4 @@ -import { fetchServerApi } from "../../../src/api/public-config-client.js"; +import { fetchServerApi } from "../../../../src/api/public-config-client.js"; export const ACCOUNT_SERVICE_READY_MESSAGE = "Account service is available."; export const ACCOUNT_IDENTITY_SETUP_MESSAGE = "Account identity setup is incomplete. Please contact support."; diff --git a/assets/theme-v2/js/account-controls.js b/www/assets/theme-v2/js/account-controls.js similarity index 100% rename from assets/theme-v2/js/account-controls.js rename to www/assets/theme-v2/js/account-controls.js diff --git a/assets/theme-v2/js/account-page-data.js b/www/assets/theme-v2/js/account-page-data.js similarity index 100% rename from assets/theme-v2/js/account-page-data.js rename to www/assets/theme-v2/js/account-page-data.js diff --git a/assets/theme-v2/js/admin-db-status-panel.js b/www/assets/theme-v2/js/admin-db-status-panel.js similarity index 93% rename from assets/theme-v2/js/admin-db-status-panel.js rename to www/assets/theme-v2/js/admin-db-status-panel.js index 8549bd204..4bf8b1af2 100644 --- a/assets/theme-v2/js/admin-db-status-panel.js +++ b/www/assets/theme-v2/js/admin-db-status-panel.js @@ -1,4 +1,4 @@ -import { safeRequestServerApi } from "../../../src/api/server-api-client.js"; +import { safeRequestServerApi } from "../../../../src/api/server-api-client.js"; const fields = { api: document.querySelector("[data-admin-db-status-api]"), diff --git a/assets/theme-v2/js/admin-infrastructure.js b/www/assets/theme-v2/js/admin-infrastructure.js similarity index 96% rename from assets/theme-v2/js/admin-infrastructure.js rename to www/assets/theme-v2/js/admin-infrastructure.js index b470c84df..a0d9a52c0 100644 --- a/assets/theme-v2/js/admin-infrastructure.js +++ b/www/assets/theme-v2/js/admin-infrastructure.js @@ -1,6 +1,6 @@ import { readAdminInfrastructureStoragePathStatus -} from "../../../src/api/admin-infrastructure-api-client.js"; +} from "../../../../src/api/admin-infrastructure-api-client.js"; const STORAGE_PATH_LANES = Object.freeze([ Object.freeze({ lane: "DEV", path: "/dev/projects/" }), diff --git a/assets/theme-v2/js/admin-invitations.js b/www/assets/theme-v2/js/admin-invitations.js similarity index 99% rename from assets/theme-v2/js/admin-invitations.js rename to www/assets/theme-v2/js/admin-invitations.js index 3e3c9e829..c48e7dc5b 100644 --- a/assets/theme-v2/js/admin-invitations.js +++ b/www/assets/theme-v2/js/admin-invitations.js @@ -2,7 +2,7 @@ import { createAdminBetaInvite, readAdminInvites, revokeAdminBetaInvite -} from "../../../src/api/admin-invitations-api-client.js"; +} from "../../../../src/api/admin-invitations-api-client.js"; import { formatStatusMessage } from "../../js/shared/status.js"; function text(value) { diff --git a/assets/theme-v2/js/admin-operations.js b/www/assets/theme-v2/js/admin-operations.js similarity index 99% rename from assets/theme-v2/js/admin-operations.js rename to www/assets/theme-v2/js/admin-operations.js index fd669562f..8f517e3f6 100644 --- a/assets/theme-v2/js/admin-operations.js +++ b/www/assets/theme-v2/js/admin-operations.js @@ -1,7 +1,7 @@ import { readAdminOperationsStatus, runAdminOperationAction -} from "../../../src/api/admin-operations-api-client.js"; +} from "../../../../src/api/admin-operations-api-client.js"; import { formatStatusMessage } from "../../js/shared/status.js"; class AdminOperationsController { diff --git a/assets/theme-v2/js/admin-owner-navigation.js b/www/assets/theme-v2/js/admin-owner-navigation.js similarity index 97% rename from assets/theme-v2/js/admin-owner-navigation.js rename to www/assets/theme-v2/js/admin-owner-navigation.js index 0f6a8e9d1..78edb153a 100644 --- a/assets/theme-v2/js/admin-owner-navigation.js +++ b/www/assets/theme-v2/js/admin-owner-navigation.js @@ -1,7 +1,7 @@ import { getAdminNavigationItems, getOwnerNavigationItems, -} from "../../../src/api/admin-owner-navigation.js"; +} from "../../../../src/api/admin-owner-navigation.js"; function currentPagePath() { return window.location.pathname.replace(/^\/+/, "") || "index.html"; diff --git a/assets/theme-v2/js/admin-platform-settings.js b/www/assets/theme-v2/js/admin-platform-settings.js similarity index 98% rename from assets/theme-v2/js/admin-platform-settings.js rename to www/assets/theme-v2/js/admin-platform-settings.js index 5e3625cb6..9d60e1520 100644 --- a/assets/theme-v2/js/admin-platform-settings.js +++ b/www/assets/theme-v2/js/admin-platform-settings.js @@ -1,7 +1,7 @@ import { readAdminPlatformBanner, updateAdminPlatformBanner -} from "../../../src/api/platform-settings-api-client.js"; +} from "../../../../src/api/platform-settings-api-client.js"; class AdminPlatformSettingsController { constructor(root) { diff --git a/assets/theme-v2/js/admin-service-page-data.js b/www/assets/theme-v2/js/admin-service-page-data.js similarity index 98% rename from assets/theme-v2/js/admin-service-page-data.js rename to www/assets/theme-v2/js/admin-service-page-data.js index e95e2c0a1..47f75e93a 100644 --- a/assets/theme-v2/js/admin-service-page-data.js +++ b/www/assets/theme-v2/js/admin-service-page-data.js @@ -1,4 +1,4 @@ -import { getDbViewerSnapshot } from "../../../src/api/db-viewer-api-client.js"; +import { getDbViewerSnapshot } from "../../../../src/api/db-viewer-api-client.js"; const SERVICE_START_ACTION = "Start the API-backed server, then reload this page."; diff --git a/assets/theme-v2/js/admin-setup-actions.js b/www/assets/theme-v2/js/admin-setup-actions.js similarity index 95% rename from assets/theme-v2/js/admin-setup-actions.js rename to www/assets/theme-v2/js/admin-setup-actions.js index 84f39fcd9..7870b2564 100644 --- a/assets/theme-v2/js/admin-setup-actions.js +++ b/www/assets/theme-v2/js/admin-setup-actions.js @@ -1,4 +1,4 @@ -import { readAdminSetupStatus } from "../../../src/api/admin-setup-api-client.js"; +import { readAdminSetupStatus } from "../../../../src/api/admin-setup-api-client.js"; import { formatStatusMessage } from "../../js/shared/status.js"; const refreshButtons = Array.from(document.querySelectorAll("[data-admin-setup-refresh]")); diff --git a/assets/theme-v2/js/admin-system-health.js b/www/assets/theme-v2/js/admin-system-health.js similarity index 99% rename from assets/theme-v2/js/admin-system-health.js rename to www/assets/theme-v2/js/admin-system-health.js index 49e0593b1..fdfd2940e 100644 --- a/assets/theme-v2/js/admin-system-health.js +++ b/www/assets/theme-v2/js/admin-system-health.js @@ -2,7 +2,7 @@ import { readAdminSystemHealthStatus, runAdminSystemHealthAction, runAdminSystemHealthStorageExpandedValidation, -} from "../../../src/api/admin-system-health-api-client.js"; +} from "../../../../src/api/admin-system-health-api-client.js"; import { applyStatusNode, normalizeStatusValue, diff --git a/assets/theme-v2/js/gamefoundry-partials.js b/www/assets/theme-v2/js/gamefoundry-partials.js similarity index 100% rename from assets/theme-v2/js/gamefoundry-partials.js rename to www/assets/theme-v2/js/gamefoundry-partials.js diff --git a/assets/theme-v2/js/image-zoom-dialog.js b/www/assets/theme-v2/js/image-zoom-dialog.js similarity index 100% rename from assets/theme-v2/js/image-zoom-dialog.js rename to www/assets/theme-v2/js/image-zoom-dialog.js diff --git a/assets/theme-v2/js/login-session.js b/www/assets/theme-v2/js/login-session.js similarity index 100% rename from assets/theme-v2/js/login-session.js rename to www/assets/theme-v2/js/login-session.js diff --git a/assets/theme-v2/js/marketplace-page.js b/www/assets/theme-v2/js/marketplace-page.js similarity index 99% rename from assets/theme-v2/js/marketplace-page.js rename to www/assets/theme-v2/js/marketplace-page.js index ec11a365c..b9d04726a 100644 --- a/assets/theme-v2/js/marketplace-page.js +++ b/www/assets/theme-v2/js/marketplace-page.js @@ -1,7 +1,7 @@ import { readMarketplaceCategories, readMarketplaceEntitlements, -} from "../../../src/api/marketplace-api-client.js"; +} from "../../../../src/api/marketplace-api-client.js"; const ACTIONS = Object.freeze([ { id: "browse", label: "Browse Marketplace" }, diff --git a/assets/theme-v2/js/memberships-page.js b/www/assets/theme-v2/js/memberships-page.js similarity index 98% rename from assets/theme-v2/js/memberships-page.js rename to www/assets/theme-v2/js/memberships-page.js index 6a49fa6ec..722389a27 100644 --- a/assets/theme-v2/js/memberships-page.js +++ b/www/assets/theme-v2/js/memberships-page.js @@ -1,4 +1,4 @@ -import { readMembershipCatalog } from "../../../src/api/memberships-api-client.js"; +import { readMembershipCatalog } from "../../../../src/api/memberships-api-client.js"; function text(value, fallback = "N/A") { return value === undefined || value === null || value === "" ? fallback : String(value); diff --git a/assets/theme-v2/js/owner-ai-credits.js b/www/assets/theme-v2/js/owner-ai-credits.js similarity index 99% rename from assets/theme-v2/js/owner-ai-credits.js rename to www/assets/theme-v2/js/owner-ai-credits.js index 19fbb3f3a..0f687a3e0 100644 --- a/assets/theme-v2/js/owner-ai-credits.js +++ b/www/assets/theme-v2/js/owner-ai-credits.js @@ -1,7 +1,7 @@ import { readOwnerAiCreditSettings, updateOwnerAiCreditSettings, -} from "../../../src/api/owner-ai-credits-api-client.js"; +} from "../../../../src/api/owner-ai-credits-api-client.js"; function text(value, fallback = "N/A") { return value === undefined || value === null || value === "" ? fallback : String(value); diff --git a/assets/theme-v2/js/owner-memberships.js b/www/assets/theme-v2/js/owner-memberships.js similarity index 99% rename from assets/theme-v2/js/owner-memberships.js rename to www/assets/theme-v2/js/owner-memberships.js index d60658d27..ba9d895da 100644 --- a/assets/theme-v2/js/owner-memberships.js +++ b/www/assets/theme-v2/js/owner-memberships.js @@ -1,7 +1,7 @@ import { readOwnerMembershipSettings, updateOwnerMembershipSettings, -} from "../../../src/api/owner-memberships-api-client.js"; +} from "../../../../src/api/owner-memberships-api-client.js"; const PLAN_NUMBER_FIELDS = Object.freeze([ Object.freeze({ field: "monthlyPriceCents", label: "Price cents", max: 1000000, min: 0 }), diff --git a/assets/theme-v2/js/theme-icons.js b/www/assets/theme-v2/js/theme-icons.js similarity index 100% rename from assets/theme-v2/js/theme-icons.js rename to www/assets/theme-v2/js/theme-icons.js diff --git a/assets/theme-v2/js/tool-display-mode.js b/www/assets/theme-v2/js/tool-display-mode.js similarity index 100% rename from assets/theme-v2/js/tool-display-mode.js rename to www/assets/theme-v2/js/tool-display-mode.js diff --git a/assets/theme-v2/js/toolbox-status-bar.js b/www/assets/theme-v2/js/toolbox-status-bar.js similarity index 100% rename from assets/theme-v2/js/toolbox-status-bar.js rename to www/assets/theme-v2/js/toolbox-status-bar.js diff --git a/assets/theme-v2/partials/account-side-nav.html b/www/assets/theme-v2/partials/account-side-nav.html similarity index 100% rename from assets/theme-v2/partials/account-side-nav.html rename to www/assets/theme-v2/partials/account-side-nav.html diff --git a/assets/theme-v2/partials/footer.html b/www/assets/theme-v2/partials/footer.html similarity index 100% rename from assets/theme-v2/partials/footer.html rename to www/assets/theme-v2/partials/footer.html diff --git a/assets/theme-v2/partials/header-nav.html b/www/assets/theme-v2/partials/header-nav.html similarity index 100% rename from assets/theme-v2/partials/header-nav.html rename to www/assets/theme-v2/partials/header-nav.html diff --git a/assets/theme-v2/partials/page-shell.html b/www/assets/theme-v2/partials/page-shell.html similarity index 100% rename from assets/theme-v2/partials/page-shell.html rename to www/assets/theme-v2/partials/page-shell.html diff --git a/assets/theme-v2/partials/tool-shell.html b/www/assets/theme-v2/partials/tool-shell.html similarity index 100% rename from assets/theme-v2/partials/tool-shell.html rename to www/assets/theme-v2/partials/tool-shell.html diff --git a/assets/theme-v2/svg/README.md b/www/assets/theme-v2/svg/README.md similarity index 100% rename from assets/theme-v2/svg/README.md rename to www/assets/theme-v2/svg/README.md diff --git a/assets/theme-v2/svg/gfs-add.svg b/www/assets/theme-v2/svg/gfs-add.svg similarity index 100% rename from assets/theme-v2/svg/gfs-add.svg rename to www/assets/theme-v2/svg/gfs-add.svg diff --git a/assets/theme-v2/svg/gfs-chevron-down.svg b/www/assets/theme-v2/svg/gfs-chevron-down.svg similarity index 100% rename from assets/theme-v2/svg/gfs-chevron-down.svg rename to www/assets/theme-v2/svg/gfs-chevron-down.svg diff --git a/assets/theme-v2/svg/gfs-chevron-left.svg b/www/assets/theme-v2/svg/gfs-chevron-left.svg similarity index 100% rename from assets/theme-v2/svg/gfs-chevron-left.svg rename to www/assets/theme-v2/svg/gfs-chevron-left.svg diff --git a/assets/theme-v2/svg/gfs-chevron-right.svg b/www/assets/theme-v2/svg/gfs-chevron-right.svg similarity index 100% rename from assets/theme-v2/svg/gfs-chevron-right.svg rename to www/assets/theme-v2/svg/gfs-chevron-right.svg diff --git a/assets/theme-v2/svg/gfs-chevron-up.svg b/www/assets/theme-v2/svg/gfs-chevron-up.svg similarity index 100% rename from assets/theme-v2/svg/gfs-chevron-up.svg rename to www/assets/theme-v2/svg/gfs-chevron-up.svg diff --git a/assets/theme-v2/svg/gfs-close.svg b/www/assets/theme-v2/svg/gfs-close.svg similarity index 100% rename from assets/theme-v2/svg/gfs-close.svg rename to www/assets/theme-v2/svg/gfs-close.svg diff --git a/assets/theme-v2/svg/gfs-error.svg b/www/assets/theme-v2/svg/gfs-error.svg similarity index 100% rename from assets/theme-v2/svg/gfs-error.svg rename to www/assets/theme-v2/svg/gfs-error.svg diff --git a/assets/theme-v2/svg/gfs-exit-fullscreen.svg b/www/assets/theme-v2/svg/gfs-exit-fullscreen.svg similarity index 100% rename from assets/theme-v2/svg/gfs-exit-fullscreen.svg rename to www/assets/theme-v2/svg/gfs-exit-fullscreen.svg diff --git a/assets/theme-v2/svg/gfs-fullscreen.svg b/www/assets/theme-v2/svg/gfs-fullscreen.svg similarity index 100% rename from assets/theme-v2/svg/gfs-fullscreen.svg rename to www/assets/theme-v2/svg/gfs-fullscreen.svg diff --git a/assets/theme-v2/svg/gfs-info.svg b/www/assets/theme-v2/svg/gfs-info.svg similarity index 100% rename from assets/theme-v2/svg/gfs-info.svg rename to www/assets/theme-v2/svg/gfs-info.svg diff --git a/assets/theme-v2/svg/gfs-menu.svg b/www/assets/theme-v2/svg/gfs-menu.svg similarity index 100% rename from assets/theme-v2/svg/gfs-menu.svg rename to www/assets/theme-v2/svg/gfs-menu.svg diff --git a/assets/theme-v2/svg/gfs-search.svg b/www/assets/theme-v2/svg/gfs-search.svg similarity index 100% rename from assets/theme-v2/svg/gfs-search.svg rename to www/assets/theme-v2/svg/gfs-search.svg diff --git a/assets/theme-v2/svg/gfs-settings.svg b/www/assets/theme-v2/svg/gfs-settings.svg similarity index 100% rename from assets/theme-v2/svg/gfs-settings.svg rename to www/assets/theme-v2/svg/gfs-settings.svg diff --git a/assets/theme-v2/svg/gfs-subtract.svg b/www/assets/theme-v2/svg/gfs-subtract.svg similarity index 100% rename from assets/theme-v2/svg/gfs-subtract.svg rename to www/assets/theme-v2/svg/gfs-subtract.svg diff --git a/assets/theme-v2/svg/gfs-success.svg b/www/assets/theme-v2/svg/gfs-success.svg similarity index 100% rename from assets/theme-v2/svg/gfs-success.svg rename to www/assets/theme-v2/svg/gfs-success.svg diff --git a/assets/theme-v2/svg/gfs-trash.svg b/www/assets/theme-v2/svg/gfs-trash.svg similarity index 100% rename from assets/theme-v2/svg/gfs-trash.svg rename to www/assets/theme-v2/svg/gfs-trash.svg diff --git a/assets/theme-v2/svg/gfs-warning.svg b/www/assets/theme-v2/svg/gfs-warning.svg similarity index 100% rename from assets/theme-v2/svg/gfs-warning.svg rename to www/assets/theme-v2/svg/gfs-warning.svg diff --git a/assets/toolbox/assets/js/assets-upload-worker.js b/www/assets/toolbox/assets/js/assets-upload-worker.js similarity index 100% rename from assets/toolbox/assets/js/assets-upload-worker.js rename to www/assets/toolbox/assets/js/assets-upload-worker.js diff --git a/assets/toolbox/assets/js/index.js b/www/assets/toolbox/assets/js/index.js similarity index 99% rename from assets/toolbox/assets/js/index.js rename to www/assets/toolbox/assets/js/index.js index d09e88a81..0c937283c 100644 --- a/assets/toolbox/assets/js/index.js +++ b/www/assets/toolbox/assets/js/index.js @@ -3,7 +3,7 @@ import { ASSET_USAGE_OPTIONS, createAssetToolApiRepository } from "../../../js/shared/assets-api-client.js"; -import { getSessionCurrent } from "../../../../src/api/session-api-client.js"; +import { getSessionCurrent } from "../../../../../src/api/session-api-client.js"; const repository = createAssetToolApiRepository(); const params = new URLSearchParams(window.location.search); diff --git a/assets/toolbox/colors/js/index.js b/www/assets/toolbox/colors/js/index.js similarity index 99% rename from assets/toolbox/colors/js/index.js rename to www/assets/toolbox/colors/js/index.js index dcc0631e5..533dcdc6c 100644 --- a/assets/toolbox/colors/js/index.js +++ b/www/assets/toolbox/colors/js/index.js @@ -3,7 +3,7 @@ import { createServerRepositoryClient, readServerToolConstants, requireServerConstant, -} from "../../../../src/api/server-api-client.js"; +} from "../../../../../src/api/server-api-client.js"; const constants = readServerToolConstants("palette"); diff --git a/assets/toolbox/controls/js/index.js b/www/assets/toolbox/controls/js/index.js similarity index 99% rename from assets/toolbox/controls/js/index.js rename to www/assets/toolbox/controls/js/index.js index 6a648b878..1f5ded8c5 100644 --- a/assets/toolbox/controls/js/index.js +++ b/www/assets/toolbox/controls/js/index.js @@ -9,7 +9,7 @@ import { import { normalizeNormalizedInput, normalizedInputOptions, -} from "../../../../src/engine/input/NormalizedInputRegistry.js"; +} from "../../../../../src/engine/input/NormalizedInputRegistry.js"; const GAME_CONTROL_NORMALIZED_INPUT_IDS = new Set(GAME_CONTROL_NORMALIZED_INPUTS); diff --git a/assets/toolbox/events/js/index.js b/www/assets/toolbox/events/js/index.js similarity index 99% rename from assets/toolbox/events/js/index.js rename to www/assets/toolbox/events/js/index.js index 837198395..83139ba2f 100644 --- a/assets/toolbox/events/js/index.js +++ b/www/assets/toolbox/events/js/index.js @@ -1,7 +1,7 @@ import { requireServerApiData, safeRequestServerApi, -} from "../../../../src/api/server-api-client.js"; +} from "../../../../../src/api/server-api-client.js"; const NEW_ROW_KEY = "__new__"; const TABLE_COLSPAN = 5; diff --git a/assets/toolbox/game-configuration/js/index.js b/www/assets/toolbox/game-configuration/js/index.js similarity index 98% rename from assets/toolbox/game-configuration/js/index.js rename to www/assets/toolbox/game-configuration/js/index.js index 08328dc52..f930d1643 100644 --- a/assets/toolbox/game-configuration/js/index.js +++ b/www/assets/toolbox/game-configuration/js/index.js @@ -1,9 +1,9 @@ -import { getSessionCurrent } from "../../../../src/api/session-api-client.js"; +import { getSessionCurrent } from "../../../../../src/api/session-api-client.js"; import { createServerRepositoryClient, readServerToolConstants, requireServerConstant, -} from "../../../../src/api/server-api-client.js"; +} from "../../../../../src/api/server-api-client.js"; const constants = readServerToolConstants("game-configuration"); diff --git a/assets/toolbox/game-crew/js/index.js b/www/assets/toolbox/game-crew/js/index.js similarity index 97% rename from assets/toolbox/game-crew/js/index.js rename to www/assets/toolbox/game-crew/js/index.js index 90dae26d4..ac623aaa2 100644 --- a/assets/toolbox/game-crew/js/index.js +++ b/www/assets/toolbox/game-crew/js/index.js @@ -1,9 +1,9 @@ -import { getSessionCurrent } from "../../../../src/api/session-api-client.js"; +import { getSessionCurrent } from "../../../../../src/api/session-api-client.js"; import { createServerRepositoryClient, readServerToolConstants, requireServerConstant, -} from "../../../../src/api/server-api-client.js"; +} from "../../../../../src/api/server-api-client.js"; const constants = readServerToolConstants("game-crew"); diff --git a/assets/toolbox/game-design/js/index.js b/www/assets/toolbox/game-design/js/index.js similarity index 99% rename from assets/toolbox/game-design/js/index.js rename to www/assets/toolbox/game-design/js/index.js index 120a3a168..80e4e2932 100644 --- a/assets/toolbox/game-design/js/index.js +++ b/www/assets/toolbox/game-design/js/index.js @@ -1,9 +1,9 @@ -import { getSessionCurrent } from "../../../../src/api/session-api-client.js"; +import { getSessionCurrent } from "../../../../../src/api/session-api-client.js"; import { createServerRepositoryClient, readServerToolConstants, requireServerConstant, -} from "../../../../src/api/server-api-client.js"; +} from "../../../../../src/api/server-api-client.js"; const constants = readServerToolConstants("game-design"); diff --git a/assets/toolbox/game-journey/js/index.js b/www/assets/toolbox/game-journey/js/index.js similarity index 99% rename from assets/toolbox/game-journey/js/index.js rename to www/assets/toolbox/game-journey/js/index.js index c2c4f1d05..d5486ee29 100644 --- a/assets/toolbox/game-journey/js/index.js +++ b/www/assets/toolbox/game-journey/js/index.js @@ -11,7 +11,7 @@ import { getActiveToolRegistry, getToolRegistryApiDiagnostic, } from "../../../../toolbox/tool-registry-api-client.js"; -import { createServerRepositoryClient } from "../../../../src/api/server-api-client.js"; +import { createServerRepositoryClient } from "../../../../../src/api/server-api-client.js"; const repository = createGameJourneyApiRepository(); const objectsRepository = createServerRepositoryClient("objects"); diff --git a/assets/toolbox/hitboxes/js/index.js b/www/assets/toolbox/hitboxes/js/index.js similarity index 99% rename from assets/toolbox/hitboxes/js/index.js rename to www/assets/toolbox/hitboxes/js/index.js index 84c948ef7..e398e822a 100644 --- a/assets/toolbox/hitboxes/js/index.js +++ b/www/assets/toolbox/hitboxes/js/index.js @@ -1,10 +1,10 @@ -import { getSessionCurrent } from "../../../../src/api/session-api-client.js"; -import { createServerRepositoryClient } from "../../../../src/api/server-api-client.js"; +import { getSessionCurrent } from "../../../../../src/api/session-api-client.js"; +import { createServerRepositoryClient } from "../../../../../src/api/server-api-client.js"; import { aabbContactState, normalizeBoundingBox, sweptAabb, -} from "../../../../src/engine/collision/hitboxCollision.js"; +} from "../../../../../src/engine/collision/hitboxCollision.js"; const EMPTY_STATE = "Create an Object and assign a sprite or vector before editing hitboxes."; const DEV_PENDING_RENDER = "DEV-safe visual placeholder tied to the Object record; asset rendering is pending."; diff --git a/assets/toolbox/idea-board/js/index.js b/www/assets/toolbox/idea-board/js/index.js similarity index 99% rename from assets/toolbox/idea-board/js/index.js rename to www/assets/toolbox/idea-board/js/index.js index 5b33ae05d..5981cb3a0 100644 --- a/assets/toolbox/idea-board/js/index.js +++ b/www/assets/toolbox/idea-board/js/index.js @@ -1,5 +1,5 @@ -import { createServerRepositoryClient } from "../../../../src/api/server-api-client.js"; -import { getSessionCurrent } from "../../../../src/api/session-api-client.js"; +import { createServerRepositoryClient } from "../../../../../src/api/server-api-client.js"; +import { getSessionCurrent } from "../../../../../src/api/session-api-client.js"; import { createThemeIcon, themeIconFileName } from "../../../theme-v2/js/theme-icons.js"; const editableStatusOptions = Object.freeze(["New", "Exploring", "Refining", "Ready"]); diff --git a/assets/toolbox/objects/js/index.js b/www/assets/toolbox/objects/js/index.js similarity index 99% rename from assets/toolbox/objects/js/index.js rename to www/assets/toolbox/objects/js/index.js index 96644bf92..2eb7b4670 100644 --- a/assets/toolbox/objects/js/index.js +++ b/www/assets/toolbox/objects/js/index.js @@ -1,15 +1,15 @@ -import { getSessionCurrent } from "../../../../src/api/session-api-client.js"; +import { getSessionCurrent } from "../../../../../src/api/session-api-client.js"; import { createServerRepositoryClient, readServerToolConstants, requireServerConstant, -} from "../../../../src/api/server-api-client.js"; +} from "../../../../../src/api/server-api-client.js"; import { OBJECT_MODEL_TRAIT_LIST, getObjectModelTrait, getObjectModelType, validateObjectDefinition, -} from "../../../../src/engine/object-model/index.js"; +} from "../../../../../src/engine/object-model/index.js"; import { createAssetToolApiRepository } from "../../../js/shared/assets-api-client.js"; import { listMessages } from "../../../../toolbox/messages/messages-api-client.js"; diff --git a/assets/toolbox/sprites/js/index.js b/www/assets/toolbox/sprites/js/index.js similarity index 100% rename from assets/toolbox/sprites/js/index.js rename to www/assets/toolbox/sprites/js/index.js diff --git a/assets/toolbox/tags/js/index.js b/www/assets/toolbox/tags/js/index.js similarity index 98% rename from assets/toolbox/tags/js/index.js rename to www/assets/toolbox/tags/js/index.js index 9ac5305c0..a23a5188b 100644 --- a/assets/toolbox/tags/js/index.js +++ b/www/assets/toolbox/tags/js/index.js @@ -1,9 +1,9 @@ -import { getSessionCurrent } from "../../../../src/api/session-api-client.js"; +import { getSessionCurrent } from "../../../../../src/api/session-api-client.js"; import { createServerRepositoryClient, readServerToolConstants, requireServerConstant, -} from "../../../../src/api/server-api-client.js"; +} from "../../../../../src/api/server-api-client.js"; const constants = readServerToolConstants("tags"); diff --git a/assets/toolbox/text-to-speech/js/index.js b/www/assets/toolbox/text-to-speech/js/index.js similarity index 99% rename from assets/toolbox/text-to-speech/js/index.js rename to www/assets/toolbox/text-to-speech/js/index.js index 15aa331e0..59811655c 100644 --- a/assets/toolbox/text-to-speech/js/index.js +++ b/www/assets/toolbox/text-to-speech/js/index.js @@ -1,7 +1,7 @@ import { textToSpeechLanguageOptionsFromVoices, TextToSpeechEngine, -} from "../../../../src/engine/audio/TextToSpeechEngine.js"; +} from "../../../../../src/engine/audio/TextToSpeechEngine.js"; import { TEXT_TO_SPEECH_AGE_FILTER_OPTIONS, TEXT_TO_SPEECH_DEFAULTS, @@ -9,14 +9,14 @@ import { TEXT_TO_SPEECH_LANGUAGE_OPTIONS, TEXT_TO_SPEECH_RANGE_DEFAULTS, TEXT_TO_SPEECH_SSML_LIKE_PRESET_OPTIONS -} from "../../../../src/engine/audio/TextToSpeechDefaults.js"; +} from "../../../../../src/engine/audio/TextToSpeechDefaults.js"; import { createTtsProfile, deleteTtsProfile, listTtsProfiles, updateTtsProfile, } from "../../../../toolbox/messages/messages-api-client.js"; -import { getSessionCurrent } from "../../../../src/api/session-api-client.js"; +import { getSessionCurrent } from "../../../../../src/api/session-api-client.js"; const TTS_OWNERSHIP = Object.freeze({ DESIGN: "Design", diff --git a/community/assets.html b/www/community/assets.html similarity index 100% rename from community/assets.html rename to www/community/assets.html diff --git a/community/index.html b/www/community/index.html similarity index 100% rename from community/index.html rename to www/community/index.html diff --git a/community/publish.html b/www/community/publish.html similarity index 100% rename from community/publish.html rename to www/community/publish.html diff --git a/company/about.html b/www/company/about.html similarity index 100% rename from company/about.html rename to www/company/about.html diff --git a/company/contact.html b/www/company/contact.html similarity index 100% rename from company/contact.html rename to www/company/contact.html diff --git a/company/how-we-build.html b/www/company/how-we-build.html similarity index 100% rename from company/how-we-build.html rename to www/company/how-we-build.html diff --git a/company/mission.html b/www/company/mission.html similarity index 100% rename from company/mission.html rename to www/company/mission.html diff --git a/company/release-notes.html b/www/company/release-notes.html similarity index 100% rename from company/release-notes.html rename to www/company/release-notes.html diff --git a/company/roadmap.html b/www/company/roadmap.html similarity index 100% rename from company/roadmap.html rename to www/company/roadmap.html diff --git a/company/vision.html b/www/company/vision.html similarity index 100% rename from company/vision.html rename to www/company/vision.html diff --git a/docs/README.md b/www/docs/README.md similarity index 100% rename from docs/README.md rename to www/docs/README.md diff --git a/docs/faq.html b/www/docs/faq.html similarity index 100% rename from docs/faq.html rename to www/docs/faq.html diff --git a/docs/index.html b/www/docs/index.html similarity index 100% rename from docs/index.html rename to www/docs/index.html diff --git a/docs/reference.html b/www/docs/reference.html similarity index 100% rename from docs/reference.html rename to www/docs/reference.html diff --git a/docs/support.html b/www/docs/support.html similarity index 100% rename from docs/support.html rename to www/docs/support.html diff --git a/games/action/index.html b/www/games/action/index.html similarity index 100% rename from games/action/index.html rename to www/games/action/index.html diff --git a/games/adventure/index.html b/www/games/adventure/index.html similarity index 100% rename from games/adventure/index.html rename to www/games/adventure/index.html diff --git a/games/arcade/index.html b/www/games/arcade/index.html similarity index 100% rename from games/arcade/index.html rename to www/games/arcade/index.html diff --git a/games/assets/images/game-forgequest.svg b/www/games/assets/images/game-forgequest.svg similarity index 100% rename from games/assets/images/game-forgequest.svg rename to www/games/assets/images/game-forgequest.svg diff --git a/games/assets/images/game-iceberg.svg b/www/games/assets/images/game-iceberg.svg similarity index 100% rename from games/assets/images/game-iceberg.svg rename to www/games/assets/images/game-iceberg.svg diff --git a/games/assets/images/game-nebula.svg b/www/games/assets/images/game-nebula.svg similarity index 100% rename from games/assets/images/game-nebula.svg rename to www/games/assets/images/game-nebula.svg diff --git a/games/assets/images/game-retrobot.svg b/www/games/assets/images/game-retrobot.svg similarity index 100% rename from games/assets/images/game-retrobot.svg rename to www/games/assets/images/game-retrobot.svg diff --git a/games/index.html b/www/games/index.html similarity index 100% rename from games/index.html rename to www/games/index.html diff --git a/games/puzzle/index.html b/www/games/puzzle/index.html similarity index 100% rename from games/puzzle/index.html rename to www/games/puzzle/index.html diff --git a/games/racing/index.html b/www/games/racing/index.html similarity index 100% rename from games/racing/index.html rename to www/games/racing/index.html diff --git a/games/retro/index.html b/www/games/retro/index.html similarity index 100% rename from games/retro/index.html rename to www/games/retro/index.html diff --git a/games/strategy/index.html b/www/games/strategy/index.html similarity index 100% rename from games/strategy/index.html rename to www/games/strategy/index.html diff --git a/index.html b/www/index.html similarity index 100% rename from index.html rename to www/index.html diff --git a/learn/assets/index.html b/www/learn/assets/index.html similarity index 100% rename from learn/assets/index.html rename to www/learn/assets/index.html diff --git a/learn/audio/index.html b/www/learn/audio/index.html similarity index 100% rename from learn/audio/index.html rename to www/learn/audio/index.html diff --git a/learn/colors/index.html b/www/learn/colors/index.html similarity index 100% rename from learn/colors/index.html rename to www/learn/colors/index.html diff --git a/learn/game-configuration/index.html b/www/learn/game-configuration/index.html similarity index 100% rename from learn/game-configuration/index.html rename to www/learn/game-configuration/index.html diff --git a/learn/game-design/index.html b/www/learn/game-design/index.html similarity index 100% rename from learn/game-design/index.html rename to www/learn/game-design/index.html diff --git a/learn/game-hub/index.html b/www/learn/game-hub/index.html similarity index 100% rename from learn/game-hub/index.html rename to www/learn/game-hub/index.html diff --git a/learn/getting-started/index.html b/www/learn/getting-started/index.html similarity index 100% rename from learn/getting-started/index.html rename to www/learn/getting-started/index.html diff --git a/learn/index.html b/www/learn/index.html similarity index 100% rename from learn/index.html rename to www/learn/index.html diff --git a/learn/objects/index.html b/www/learn/objects/index.html similarity index 100% rename from learn/objects/index.html rename to www/learn/objects/index.html diff --git a/learn/publish/index.html b/www/learn/publish/index.html similarity index 100% rename from learn/publish/index.html rename to www/learn/publish/index.html diff --git a/learn/worlds/index.html b/www/learn/worlds/index.html similarity index 100% rename from learn/worlds/index.html rename to www/learn/worlds/index.html diff --git a/legal/community-guidelines.html b/www/legal/community-guidelines.html similarity index 100% rename from legal/community-guidelines.html rename to www/legal/community-guidelines.html diff --git a/legal/community-guidelines.md b/www/legal/community-guidelines.md similarity index 100% rename from legal/community-guidelines.md rename to www/legal/community-guidelines.md diff --git a/legal/cookie-policy.html b/www/legal/cookie-policy.html similarity index 100% rename from legal/cookie-policy.html rename to www/legal/cookie-policy.html diff --git a/legal/cookie-policy.md b/www/legal/cookie-policy.md similarity index 100% rename from legal/cookie-policy.md rename to www/legal/cookie-policy.md diff --git a/legal/cookies-policy.html b/www/legal/cookies-policy.html similarity index 100% rename from legal/cookies-policy.html rename to www/legal/cookies-policy.html diff --git a/legal/copyright-policy.html b/www/legal/copyright-policy.html similarity index 100% rename from legal/copyright-policy.html rename to www/legal/copyright-policy.html diff --git a/legal/copyright-policy.md b/www/legal/copyright-policy.md similarity index 100% rename from legal/copyright-policy.md rename to www/legal/copyright-policy.md diff --git a/legal/dmca-policy.html b/www/legal/dmca-policy.html similarity index 100% rename from legal/dmca-policy.html rename to www/legal/dmca-policy.html diff --git a/legal/dmca-policy.md b/www/legal/dmca-policy.md similarity index 100% rename from legal/dmca-policy.md rename to www/legal/dmca-policy.md diff --git a/legal/index.html b/www/legal/index.html similarity index 100% rename from legal/index.html rename to www/legal/index.html diff --git a/legal/index.md b/www/legal/index.md similarity index 100% rename from legal/index.md rename to www/legal/index.md diff --git a/legal/legal-nav.js b/www/legal/legal-nav.js similarity index 100% rename from legal/legal-nav.js rename to www/legal/legal-nav.js diff --git a/legal/privacy-policy.html b/www/legal/privacy-policy.html similarity index 100% rename from legal/privacy-policy.html rename to www/legal/privacy-policy.html diff --git a/legal/privacy-policy.md b/www/legal/privacy-policy.md similarity index 100% rename from legal/privacy-policy.md rename to www/legal/privacy-policy.md diff --git a/legal/terms-of-service.html b/www/legal/terms-of-service.html similarity index 100% rename from legal/terms-of-service.html rename to www/legal/terms-of-service.html diff --git a/legal/terms-of-service.md b/www/legal/terms-of-service.md similarity index 100% rename from legal/terms-of-service.md rename to www/legal/terms-of-service.md diff --git a/legal/terms.html b/www/legal/terms.html similarity index 100% rename from legal/terms.html rename to www/legal/terms.html diff --git a/marketplace/index.html b/www/marketplace/index.html similarity index 100% rename from marketplace/index.html rename to www/marketplace/index.html diff --git a/memberships/index.html b/www/memberships/index.html similarity index 100% rename from memberships/index.html rename to www/memberships/index.html diff --git a/owner/ai-credits.html b/www/owner/ai-credits.html similarity index 100% rename from owner/ai-credits.html rename to www/owner/ai-credits.html diff --git a/owner/branding.html b/www/owner/branding.html similarity index 100% rename from owner/branding.html rename to www/owner/branding.html diff --git a/owner/design-system.html b/www/owner/design-system.html similarity index 100% rename from owner/design-system.html rename to www/owner/design-system.html diff --git a/owner/grouping-colors.html b/www/owner/grouping-colors.html similarity index 100% rename from owner/grouping-colors.html rename to www/owner/grouping-colors.html diff --git a/owner/memberships.html b/www/owner/memberships.html similarity index 100% rename from owner/memberships.html rename to www/owner/memberships.html diff --git a/owner/notes.html b/www/owner/notes.html similarity index 100% rename from owner/notes.html rename to www/owner/notes.html diff --git a/owner/site-settings.html b/www/owner/site-settings.html similarity index 100% rename from owner/site-settings.html rename to www/owner/site-settings.html diff --git a/owner/themes.html b/www/owner/themes.html similarity index 100% rename from owner/themes.html rename to www/owner/themes.html diff --git a/toolbox/achievements/index.html b/www/toolbox/achievements/index.html similarity index 100% rename from toolbox/achievements/index.html rename to www/toolbox/achievements/index.html diff --git a/toolbox/ai-assistant/index.html b/www/toolbox/ai-assistant/index.html similarity index 100% rename from toolbox/ai-assistant/index.html rename to www/toolbox/ai-assistant/index.html diff --git a/toolbox/animations/index.html b/www/toolbox/animations/index.html similarity index 100% rename from toolbox/animations/index.html rename to www/toolbox/animations/index.html diff --git a/toolbox/assets/index.html b/www/toolbox/assets/index.html similarity index 100% rename from toolbox/assets/index.html rename to www/toolbox/assets/index.html diff --git a/toolbox/audio-effects/index.html b/www/toolbox/audio-effects/index.html similarity index 100% rename from toolbox/audio-effects/index.html rename to www/toolbox/audio-effects/index.html diff --git a/toolbox/audio/index.html b/www/toolbox/audio/index.html similarity index 100% rename from toolbox/audio/index.html rename to www/toolbox/audio/index.html diff --git a/toolbox/build-game/index.html b/www/toolbox/build-game/index.html similarity index 100% rename from toolbox/build-game/index.html rename to www/toolbox/build-game/index.html diff --git a/toolbox/characters/index.html b/www/toolbox/characters/index.html similarity index 100% rename from toolbox/characters/index.html rename to www/toolbox/characters/index.html diff --git a/toolbox/cloud/index.html b/www/toolbox/cloud/index.html similarity index 100% rename from toolbox/cloud/index.html rename to www/toolbox/cloud/index.html diff --git a/toolbox/code/index.html b/www/toolbox/code/index.html similarity index 100% rename from toolbox/code/index.html rename to www/toolbox/code/index.html diff --git a/toolbox/colors/index.html b/www/toolbox/colors/index.html similarity index 100% rename from toolbox/colors/index.html rename to www/toolbox/colors/index.html diff --git a/toolbox/community/index.html b/www/toolbox/community/index.html similarity index 100% rename from toolbox/community/index.html rename to www/toolbox/community/index.html diff --git a/toolbox/controls/index.html b/www/toolbox/controls/index.html similarity index 100% rename from toolbox/controls/index.html rename to www/toolbox/controls/index.html diff --git a/toolbox/debug/index.html b/www/toolbox/debug/index.html similarity index 100% rename from toolbox/debug/index.html rename to www/toolbox/debug/index.html diff --git a/toolbox/environments/index.html b/www/toolbox/environments/index.html similarity index 100% rename from toolbox/environments/index.html rename to www/toolbox/environments/index.html diff --git a/toolbox/events/index.html b/www/toolbox/events/index.html similarity index 100% rename from toolbox/events/index.html rename to www/toolbox/events/index.html diff --git a/toolbox/fonts/index.html b/www/toolbox/fonts/index.html similarity index 100% rename from toolbox/fonts/index.html rename to www/toolbox/fonts/index.html diff --git a/toolbox/game-configuration/index.html b/www/toolbox/game-configuration/index.html similarity index 100% rename from toolbox/game-configuration/index.html rename to www/toolbox/game-configuration/index.html diff --git a/toolbox/game-crew/index.html b/www/toolbox/game-crew/index.html similarity index 100% rename from toolbox/game-crew/index.html rename to www/toolbox/game-crew/index.html diff --git a/toolbox/game-design/index.html b/www/toolbox/game-design/index.html similarity index 100% rename from toolbox/game-design/index.html rename to www/toolbox/game-design/index.html diff --git a/toolbox/game-hub/game-hub-api-client.js b/www/toolbox/game-hub/game-hub-api-client.js similarity index 96% rename from toolbox/game-hub/game-hub-api-client.js rename to www/toolbox/game-hub/game-hub-api-client.js index 6088a99d0..849864f5d 100644 --- a/toolbox/game-hub/game-hub-api-client.js +++ b/www/toolbox/game-hub/game-hub-api-client.js @@ -4,7 +4,7 @@ import { readServerToolConstants, requireServerConstant, safeRequestServerApi, -} from "../../src/api/server-api-client.js"; +} from "../../../src/api/server-api-client.js"; const constants = readServerToolConstants("game-hub"); diff --git a/toolbox/game-hub/game-hub.js b/www/toolbox/game-hub/game-hub.js similarity index 99% rename from toolbox/game-hub/game-hub.js rename to www/toolbox/game-hub/game-hub.js index 2d761a0e6..fb62eae9c 100644 --- a/toolbox/game-hub/game-hub.js +++ b/www/toolbox/game-hub/game-hub.js @@ -4,7 +4,7 @@ import { GAME_HUB_GAME_STATUSES, createGameHubApiRepository, } from "./game-hub-api-client.js"; -import { getSessionCurrent } from "../../src/api/session-api-client.js"; +import { getSessionCurrent } from "../../../src/api/session-api-client.js"; const repository = createGameHubApiRepository(); diff --git a/toolbox/game-hub/index.html b/www/toolbox/game-hub/index.html similarity index 100% rename from toolbox/game-hub/index.html rename to www/toolbox/game-hub/index.html diff --git a/toolbox/game-journey/index.html b/www/toolbox/game-journey/index.html similarity index 100% rename from toolbox/game-journey/index.html rename to www/toolbox/game-journey/index.html diff --git a/toolbox/game-migration/index.html b/www/toolbox/game-migration/index.html similarity index 100% rename from toolbox/game-migration/index.html rename to www/toolbox/game-migration/index.html diff --git a/toolbox/game-testing/index.html b/www/toolbox/game-testing/index.html similarity index 100% rename from toolbox/game-testing/index.html rename to www/toolbox/game-testing/index.html diff --git a/toolbox/hitboxes/index.html b/www/toolbox/hitboxes/index.html similarity index 100% rename from toolbox/hitboxes/index.html rename to www/toolbox/hitboxes/index.html diff --git a/toolbox/idea-board/index.html b/www/toolbox/idea-board/index.html similarity index 100% rename from toolbox/idea-board/index.html rename to www/toolbox/idea-board/index.html diff --git a/toolbox/index.html b/www/toolbox/index.html similarity index 100% rename from toolbox/index.html rename to www/toolbox/index.html diff --git a/toolbox/input-mapping-v2/index.html b/www/toolbox/input-mapping-v2/index.html similarity index 100% rename from toolbox/input-mapping-v2/index.html rename to www/toolbox/input-mapping-v2/index.html diff --git a/toolbox/languages/index.html b/www/toolbox/languages/index.html similarity index 100% rename from toolbox/languages/index.html rename to www/toolbox/languages/index.html diff --git a/toolbox/marketplace/index.html b/www/toolbox/marketplace/index.html similarity index 100% rename from toolbox/marketplace/index.html rename to www/toolbox/marketplace/index.html diff --git a/toolbox/messages/index.html b/www/toolbox/messages/index.html similarity index 100% rename from toolbox/messages/index.html rename to www/toolbox/messages/index.html diff --git a/toolbox/messages/message-tts-service-registry.js b/www/toolbox/messages/message-tts-service-registry.js similarity index 93% rename from toolbox/messages/message-tts-service-registry.js rename to www/toolbox/messages/message-tts-service-registry.js index 46567b77d..27182602f 100644 --- a/toolbox/messages/message-tts-service-registry.js +++ b/www/toolbox/messages/message-tts-service-registry.js @@ -1,4 +1,4 @@ -import { TextToSpeechEngine } from "../../src/engine/audio/TextToSpeechEngine.js"; +import { TextToSpeechEngine } from "../../../src/engine/audio/TextToSpeechEngine.js"; const BROWSER_SPEECH_SYNTHESIS_SERVICE_KEY = "browser-speech-synthesis"; diff --git a/toolbox/messages/messages-api-client.js b/www/toolbox/messages/messages-api-client.js similarity index 98% rename from toolbox/messages/messages-api-client.js rename to www/toolbox/messages/messages-api-client.js index e82f97285..be6c35e14 100644 --- a/toolbox/messages/messages-api-client.js +++ b/www/toolbox/messages/messages-api-client.js @@ -1,7 +1,7 @@ import { requireServerApiData, safeRequestServerApi, -} from "../../src/api/server-api-client.js"; +} from "../../../src/api/server-api-client.js"; function readData(path, context) { return requireServerApiData(safeRequestServerApi(path), context); diff --git a/toolbox/messages/messages.js b/www/toolbox/messages/messages.js similarity index 99% rename from toolbox/messages/messages.js rename to www/toolbox/messages/messages.js index d4c6cd532..8e0a6fd78 100644 --- a/toolbox/messages/messages.js +++ b/www/toolbox/messages/messages.js @@ -11,7 +11,7 @@ import { updateMessageSegment, validatePublishConfiguration, } from "./messages-api-client.js"; -import { getSessionCurrent } from "../../src/api/session-api-client.js"; +import { getSessionCurrent } from "../../../src/api/session-api-client.js"; const NEW_ROW_KEY = "__new__"; const MESSAGE_TABLE_COLSPAN = 8; diff --git a/toolbox/midi/index.html b/www/toolbox/midi/index.html similarity index 100% rename from toolbox/midi/index.html rename to www/toolbox/midi/index.html diff --git a/toolbox/music/index.html b/www/toolbox/music/index.html similarity index 100% rename from toolbox/music/index.html rename to www/toolbox/music/index.html diff --git a/toolbox/objects/index.html b/www/toolbox/objects/index.html similarity index 100% rename from toolbox/objects/index.html rename to www/toolbox/objects/index.html diff --git a/toolbox/particles/index.html b/www/toolbox/particles/index.html similarity index 100% rename from toolbox/particles/index.html rename to www/toolbox/particles/index.html diff --git a/toolbox/performance/index.html b/www/toolbox/performance/index.html similarity index 100% rename from toolbox/performance/index.html rename to www/toolbox/performance/index.html diff --git a/toolbox/platform-settings/index.html b/www/toolbox/platform-settings/index.html similarity index 100% rename from toolbox/platform-settings/index.html rename to www/toolbox/platform-settings/index.html diff --git a/toolbox/project-workspace/index.html b/www/toolbox/project-workspace/index.html similarity index 100% rename from toolbox/project-workspace/index.html rename to www/toolbox/project-workspace/index.html diff --git a/toolbox/publish/index.html b/www/toolbox/publish/index.html similarity index 100% rename from toolbox/publish/index.html rename to www/toolbox/publish/index.html diff --git a/toolbox/ratings/index.html b/www/toolbox/ratings/index.html similarity index 100% rename from toolbox/ratings/index.html rename to www/toolbox/ratings/index.html diff --git a/toolbox/saved-data/index.html b/www/toolbox/saved-data/index.html similarity index 100% rename from toolbox/saved-data/index.html rename to www/toolbox/saved-data/index.html diff --git a/toolbox/speech-to-text/index.html b/www/toolbox/speech-to-text/index.html similarity index 100% rename from toolbox/speech-to-text/index.html rename to www/toolbox/speech-to-text/index.html diff --git a/toolbox/sprites/index.html b/www/toolbox/sprites/index.html similarity index 100% rename from toolbox/sprites/index.html rename to www/toolbox/sprites/index.html diff --git a/toolbox/tags/index.html b/www/toolbox/tags/index.html similarity index 100% rename from toolbox/tags/index.html rename to www/toolbox/tags/index.html diff --git a/toolbox/text-to-speech/index.html b/www/toolbox/text-to-speech/index.html similarity index 100% rename from toolbox/text-to-speech/index.html rename to www/toolbox/text-to-speech/index.html diff --git a/toolbox/tool-registry-api-client.js b/www/toolbox/tool-registry-api-client.js similarity index 99% rename from toolbox/tool-registry-api-client.js rename to www/toolbox/tool-registry-api-client.js index da774908c..baccac61b 100644 --- a/toolbox/tool-registry-api-client.js +++ b/www/toolbox/tool-registry-api-client.js @@ -1,7 +1,7 @@ import { requireServerApiData, safeRequestServerApi, -} from "../src/api/server-api-client.js"; +} from "../../src/api/server-api-client.js"; let registrySnapshot = null; let registryDiagnostic = ""; diff --git a/toolbox/toolRegistry.js b/www/toolbox/toolRegistry.js similarity index 96% rename from toolbox/toolRegistry.js rename to www/toolbox/toolRegistry.js index 5f1fbead6..69de63147 100644 --- a/toolbox/toolRegistry.js +++ b/www/toolbox/toolRegistry.js @@ -25,7 +25,7 @@ import { getVisibleActiveToolRegistry, isApprovedToolImagePath, toolRegistryMetadataDiagnostic, -} from "../src/shared/toolbox/tool-metadata-inventory.js"; +} from "../../src/shared/toolbox/tool-metadata-inventory.js"; export { TOOL_IMAGE_BADGE_ROOT, diff --git a/toolbox/tools-page-accordions.js b/www/toolbox/tools-page-accordions.js similarity index 99% rename from toolbox/tools-page-accordions.js rename to www/toolbox/tools-page-accordions.js index 15ff7d3c2..6733777e2 100644 --- a/toolbox/tools-page-accordions.js +++ b/www/toolbox/tools-page-accordions.js @@ -4,11 +4,11 @@ import { } from "./game-hub/game-hub-api-client.js"; import { readGameJourneyCompletionMetrics -} from "../src/api/game-journey-completion-api-client.js"; +} from "../../src/api/game-journey-completion-api-client.js"; import { castToolboxVote, readToolboxVoteSnapshot -} from "../src/api/toolbox-votes-api-client.js"; +} from "../../src/api/toolbox-votes-api-client.js"; import { TOOL_IMAGE_FALLBACK, getActiveToolRegistry, @@ -19,7 +19,7 @@ import { getToolboxContract, toolRegistryMetadataDiagnostic } from "./tool-registry-api-client.js"; -import { getSessionCurrent } from "../src/api/session-api-client.js"; +import { getSessionCurrent } from "../../src/api/session-api-client.js"; (function () { const list = document.querySelector("[data-tools-accordion-list]"); diff --git a/toolbox/users/index.html b/www/toolbox/users/index.html similarity index 100% rename from toolbox/users/index.html rename to www/toolbox/users/index.html diff --git a/toolbox/videos/index.html b/www/toolbox/videos/index.html similarity index 100% rename from toolbox/videos/index.html rename to www/toolbox/videos/index.html diff --git a/toolbox/voices/index.html b/www/toolbox/voices/index.html similarity index 100% rename from toolbox/voices/index.html rename to www/toolbox/voices/index.html diff --git a/toolbox/worlds/index.html b/www/toolbox/worlds/index.html similarity index 100% rename from toolbox/worlds/index.html rename to www/toolbox/worlds/index.html