From 3ae4d1c3dba66ccf102581bb0a8f4a1caf33bfd5 Mon Sep 17 00:00:00 2001 From: wtclaude Date: Wed, 22 Jul 2026 16:14:52 -0500 Subject: [PATCH] docs(tree): add per-repo PROJECT_TREE snapshots + index them Add auto-generated project-tree snapshots for the website, link, and Android-app repos under docs//PROJECT_TREE.md, and link them from the README (adding a previously-missing android/ section). These files are maintained going forward by the sync-project-tree CI workflow in each source repo, which opens a PR here whenever the tracked layout changes. Co-Authored-By: Claude --- README.md | 14 ++ android/PROJECT_TREE.md | 316 ++++++++++++++++++++++++ link/PROJECT_TREE.md | 44 ++++ website/PROJECT_TREE.md | 532 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 906 insertions(+) create mode 100644 android/PROJECT_TREE.md create mode 100644 link/PROJECT_TREE.md create mode 100644 website/PROJECT_TREE.md diff --git a/README.md b/README.md index a46f75d..9ceffd5 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,8 @@ so they live in one place, independent of either codebase. ``` website/ docs from the shard website (Node/Express + MariaDB + React/Vite) link/ docs from the ServUO bridge (C# plugin + Rust sidecar + Node WS) +android/ docs from the native Android client (Kotlin + Jetpack Compose) +ci/ cross-cutting CI/quality notes ``` ### `website/` @@ -18,6 +20,7 @@ link/ docs from the ServUO bridge (C# plugin + Rust sidecar + Node WS) | [HERO_EDITOR.md](website/HERO_EDITOR.md) | Hero canvas editor feature spec | | [WIKI_UPGRADE.md](website/WIKI_UPGRADE.md) | Wiki subsystem upgrade notes | | [website-README.md](website/website-README.md) | Snapshot of the website repo's README (setup/run reference) | +| [PROJECT_TREE.md](website/PROJECT_TREE.md) | Auto-generated snapshot of the repo's tracked file layout | ### `link/` | Doc | What it covers | @@ -29,6 +32,17 @@ link/ docs from the ServUO bridge (C# plugin + Rust sidecar + Node WS) | [PLAN.md](link/PLAN.md) | uo-link build plan | | [RESEARCH.md](link/RESEARCH.md) | Research notes | | [link-README.md](link/link-README.md) | Snapshot of the link repo's README | +| [PROJECT_TREE.md](link/PROJECT_TREE.md) | Auto-generated snapshot of the repo's tracked file layout | + +### `android/` +| Doc | What it covers | +|---|---| +| [PLAN.md](android/PLAN.md) | Android client build plan / milestones | +| [COVERAGE_PLAN.md](android/COVERAGE_PLAN.md) | Test-coverage rollout plan | +| [APP_LINKS.md](android/APP_LINKS.md) | Android App Links / deep-link setup | +| [theme-plan.md](android/theme-plan.md) | Theming plan | +| [TRUSTED_DEVICES_APP_HANDOFF.md](android/TRUSTED_DEVICES_APP_HANDOFF.md) | Trusted-devices app handoff notes | +| [PROJECT_TREE.md](android/PROJECT_TREE.md) | Auto-generated snapshot of the repo's tracked file layout | ## Provenance diff --git a/android/PROJECT_TREE.md b/android/PROJECT_TREE.md new file mode 100644 index 0000000..656d871 --- /dev/null +++ b/android/PROJECT_TREE.md @@ -0,0 +1,316 @@ +# Android App — Project Tree + +> **Auto-generated.** This file is maintained by the `sync-project-tree` CI workflow in +> the [`RunicGateway/Android-app`](https://gitea.whitlocktech.com/RunicGateway/Android-app) repository, which +> opens a pull request here whenever the tracked file layout on `main` changes. Do not edit +> by hand — changes will be overwritten by the next sync. + +A snapshot of the tracked files in the repository (build output, dependencies, and other +git-ignored paths are excluded). + +```text +Android-app-main/ +└── android-app/ + ├── .gitea/ + │ └── workflows/ + │ ├── pr-checks.yml + │ ├── release.yml + │ └── sonarqube.yml + ├── app/ + │ ├── licenses/ + │ │ └── Cinzel-OFL.txt + │ ├── src/ + │ │ ├── debug/ + │ │ │ └── res/ + │ │ │ └── xml/ + │ │ │ └── network_security_config.xml + │ │ ├── main/ + │ │ │ ├── java/ + │ │ │ │ └── com/ + │ │ │ │ └── runicgateway/ + │ │ │ │ └── app/ + │ │ │ │ ├── core/ + │ │ │ │ │ ├── auth/ + │ │ │ │ │ │ ├── sso/ + │ │ │ │ │ │ │ ├── EncryptedPendingSsoStore.kt + │ │ │ │ │ │ │ ├── PendingSsoStore.kt + │ │ │ │ │ │ │ ├── Pkce.kt + │ │ │ │ │ │ │ └── SsoAuthManager.kt + │ │ │ │ │ │ ├── DeviceNameProvider.kt + │ │ │ │ │ │ ├── EncryptedTokenStore.kt + │ │ │ │ │ │ ├── EncryptedTrustTokenStore.kt + │ │ │ │ │ │ ├── Session.kt + │ │ │ │ │ │ ├── SessionManager.kt + │ │ │ │ │ │ ├── TokenStore.kt + │ │ │ │ │ │ └── TrustTokenStore.kt + │ │ │ │ │ ├── net/ + │ │ │ │ │ │ ├── AuthInterceptor.kt + │ │ │ │ │ │ ├── BaseUrlHolder.kt + │ │ │ │ │ │ ├── HostSelectionInterceptor.kt + │ │ │ │ │ │ ├── Http.kt + │ │ │ │ │ │ ├── ServerUrl.kt + │ │ │ │ │ │ ├── ShardStreamClient.kt + │ │ │ │ │ │ ├── ShardStreamEvent.kt + │ │ │ │ │ │ ├── TokenAuthenticator.kt + │ │ │ │ │ │ └── UserAgentInterceptor.kt + │ │ │ │ │ ├── prefs/ + │ │ │ │ │ │ └── ServerPreferences.kt + │ │ │ │ │ ├── push/ + │ │ │ │ │ │ ├── NtfyStreamClient.kt + │ │ │ │ │ │ ├── NtfyTopic.kt + │ │ │ │ │ │ ├── PushManager.kt + │ │ │ │ │ │ ├── PushNotifier.kt + │ │ │ │ │ │ ├── PushPreferences.kt + │ │ │ │ │ │ ├── PushService.kt + │ │ │ │ │ │ ├── PushStreams.kt + │ │ │ │ │ │ └── PushTickle.kt + │ │ │ │ │ ├── result/ + │ │ │ │ │ │ └── ApiResult.kt + │ │ │ │ │ ├── web/ + │ │ │ │ │ │ ├── WebHandoff.kt + │ │ │ │ │ │ └── WebsiteUrls.kt + │ │ │ │ │ └── AppConfig.kt + │ │ │ │ ├── data/ + │ │ │ │ │ ├── api/ + │ │ │ │ │ │ ├── dto/ + │ │ │ │ │ │ │ ├── AccountDto.kt + │ │ │ │ │ │ │ ├── AdminDto.kt + │ │ │ │ │ │ │ ├── AuthDto.kt + │ │ │ │ │ │ │ ├── ContactDto.kt + │ │ │ │ │ │ │ ├── NotificationsDto.kt + │ │ │ │ │ │ │ ├── PageDto.kt + │ │ │ │ │ │ │ ├── PlayerShardDto.kt + │ │ │ │ │ │ │ ├── PostDto.kt + │ │ │ │ │ │ │ ├── PublicDto.kt + │ │ │ │ │ │ │ ├── ShardDto.kt + │ │ │ │ │ │ │ ├── SsoDto.kt + │ │ │ │ │ │ │ └── WikiDto.kt + │ │ │ │ │ │ ├── AdminApi.kt + │ │ │ │ │ │ ├── AuthApi.kt + │ │ │ │ │ │ ├── AuthRefreshApi.kt + │ │ │ │ │ │ ├── MeApi.kt + │ │ │ │ │ │ ├── NotificationsApi.kt + │ │ │ │ │ │ ├── PlayerShardApi.kt + │ │ │ │ │ │ ├── PublicApi.kt + │ │ │ │ │ │ └── SsoApi.kt + │ │ │ │ │ └── repository/ + │ │ │ │ │ ├── AccountRepository.kt + │ │ │ │ │ ├── AdminRepository.kt + │ │ │ │ │ ├── AuthRepository.kt + │ │ │ │ │ ├── ConnectionRepository.kt + │ │ │ │ │ ├── ContactRepository.kt + │ │ │ │ │ ├── ContentRepository.kt + │ │ │ │ │ ├── NotificationsRepository.kt + │ │ │ │ │ ├── PlayerShardRepository.kt + │ │ │ │ │ ├── SettingsRepository.kt + │ │ │ │ │ ├── ShardRepository.kt + │ │ │ │ │ └── WikiRepository.kt + │ │ │ │ ├── di/ + │ │ │ │ │ ├── AppModule.kt + │ │ │ │ │ ├── NetworkModule.kt + │ │ │ │ │ └── StorageModule.kt + │ │ │ │ ├── ui/ + │ │ │ │ │ ├── admin/ + │ │ │ │ │ │ ├── AdminContentScreen.kt + │ │ │ │ │ │ ├── AdminContentViewModel.kt + │ │ │ │ │ │ ├── AdminDashboardScreen.kt + │ │ │ │ │ │ ├── AdminDashboardViewModel.kt + │ │ │ │ │ │ ├── AdminModerationScreen.kt + │ │ │ │ │ │ ├── AdminModerationViewModel.kt + │ │ │ │ │ │ ├── AdminSupportScreen.kt + │ │ │ │ │ │ └── AdminSupportViewModel.kt + │ │ │ │ │ ├── auth/ + │ │ │ │ │ │ ├── AccountScreen.kt + │ │ │ │ │ │ ├── AccountViewModel.kt + │ │ │ │ │ │ ├── LoginScreen.kt + │ │ │ │ │ │ ├── LoginViewModel.kt + │ │ │ │ │ │ ├── RecoveryCodesScreen.kt + │ │ │ │ │ │ ├── RecoveryCodesViewModel.kt + │ │ │ │ │ │ ├── TrustedDevicesScreen.kt + │ │ │ │ │ │ └── TrustedDevicesViewModel.kt + │ │ │ │ │ ├── components/ + │ │ │ │ │ │ ├── HtmlText.kt + │ │ │ │ │ │ ├── StateViews.kt + │ │ │ │ │ │ └── ThemeComponents.kt + │ │ │ │ │ ├── connect/ + │ │ │ │ │ │ ├── ConnectScreen.kt + │ │ │ │ │ │ └── ConnectViewModel.kt + │ │ │ │ │ ├── contact/ + │ │ │ │ │ │ ├── ContactScreen.kt + │ │ │ │ │ │ └── ContactViewModel.kt + │ │ │ │ │ ├── home/ + │ │ │ │ │ │ ├── HomeScreen.kt + │ │ │ │ │ │ └── HomeViewModel.kt + │ │ │ │ │ ├── navigation/ + │ │ │ │ │ │ ├── Menu.kt + │ │ │ │ │ │ └── Routes.kt + │ │ │ │ │ ├── news/ + │ │ │ │ │ │ ├── NewsScreen.kt + │ │ │ │ │ │ ├── NewsViewModel.kt + │ │ │ │ │ │ ├── PostScreen.kt + │ │ │ │ │ │ └── PostViewModel.kt + │ │ │ │ │ ├── notifications/ + │ │ │ │ │ │ ├── NotificationsScreen.kt + │ │ │ │ │ │ └── NotificationsViewModel.kt + │ │ │ │ │ ├── page/ + │ │ │ │ │ │ ├── BlockRenderer.kt + │ │ │ │ │ │ ├── PageScreen.kt + │ │ │ │ │ │ └── PageViewModel.kt + │ │ │ │ │ ├── player/ + │ │ │ │ │ │ ├── CharacterSheetScreen.kt + │ │ │ │ │ │ ├── CharactersScreen.kt + │ │ │ │ │ │ ├── CharactersViewModel.kt + │ │ │ │ │ │ ├── CharacterViewModel.kt + │ │ │ │ │ │ ├── MyHousesScreen.kt + │ │ │ │ │ │ ├── MyHousesViewModel.kt + │ │ │ │ │ │ ├── VendorsScreen.kt + │ │ │ │ │ │ └── VendorsViewModel.kt + │ │ │ │ │ ├── session/ + │ │ │ │ │ │ └── SessionViewModel.kt + │ │ │ │ │ ├── shard/ + │ │ │ │ │ │ ├── ChampsScreen.kt + │ │ │ │ │ │ ├── ChampsViewModel.kt + │ │ │ │ │ │ ├── FrameFields.kt + │ │ │ │ │ │ ├── GovernorsScreen.kt + │ │ │ │ │ │ ├── GovernorsViewModel.kt + │ │ │ │ │ │ ├── GuildsScreen.kt + │ │ │ │ │ │ ├── GuildsViewModel.kt + │ │ │ │ │ │ ├── HousesScreen.kt + │ │ │ │ │ │ ├── HousesViewModel.kt + │ │ │ │ │ │ ├── LiveBoard.kt + │ │ │ │ │ │ ├── ShardComponents.kt + │ │ │ │ │ │ ├── ShardEventText.kt + │ │ │ │ │ │ ├── ShardScreen.kt + │ │ │ │ │ │ └── ShardViewModel.kt + │ │ │ │ │ ├── theme/ + │ │ │ │ │ │ ├── BrandColor.kt + │ │ │ │ │ │ ├── Color.kt + │ │ │ │ │ │ ├── Font.kt + │ │ │ │ │ │ ├── Theme.kt + │ │ │ │ │ │ └── Type.kt + │ │ │ │ │ ├── wiki/ + │ │ │ │ │ │ ├── WikiPageScreen.kt + │ │ │ │ │ │ ├── WikiPageViewModel.kt + │ │ │ │ │ │ ├── WikiScreen.kt + │ │ │ │ │ │ └── WikiViewModel.kt + │ │ │ │ │ ├── AppViewModel.kt + │ │ │ │ │ ├── LocalAssetResolver.kt + │ │ │ │ │ ├── RunicApp.kt + │ │ │ │ │ └── UiState.kt + │ │ │ │ ├── MainActivity.kt + │ │ │ │ └── RunicGatewayApp.kt + │ │ │ ├── res/ + │ │ │ │ ├── drawable/ + │ │ │ │ │ └── ic_launcher_background.xml + │ │ │ │ ├── drawable-anydpi/ + │ │ │ │ │ └── ic_stat_name.xml + │ │ │ │ ├── drawable-hdpi/ + │ │ │ │ │ └── ic_stat_name.png + │ │ │ │ ├── drawable-mdpi/ + │ │ │ │ │ └── ic_stat_name.png + │ │ │ │ ├── drawable-xhdpi/ + │ │ │ │ │ └── ic_stat_name.png + │ │ │ │ ├── drawable-xxhdpi/ + │ │ │ │ │ └── ic_stat_name.png + │ │ │ │ ├── font/ + │ │ │ │ │ └── cinzel_variable.ttf + │ │ │ │ ├── mipmap-anydpi-v26/ + │ │ │ │ │ ├── ic_launcher_round.xml + │ │ │ │ │ └── ic_launcher.xml + │ │ │ │ ├── mipmap-hdpi/ + │ │ │ │ │ ├── ic_launcher_foreground.webp + │ │ │ │ │ ├── ic_launcher_round.webp + │ │ │ │ │ └── ic_launcher.webp + │ │ │ │ ├── mipmap-mdpi/ + │ │ │ │ │ ├── ic_launcher_foreground.webp + │ │ │ │ │ ├── ic_launcher_round.webp + │ │ │ │ │ └── ic_launcher.webp + │ │ │ │ ├── mipmap-xhdpi/ + │ │ │ │ │ ├── ic_launcher_foreground.webp + │ │ │ │ │ ├── ic_launcher_round.webp + │ │ │ │ │ └── ic_launcher.webp + │ │ │ │ ├── mipmap-xxhdpi/ + │ │ │ │ │ ├── ic_launcher_foreground.webp + │ │ │ │ │ ├── ic_launcher_round.webp + │ │ │ │ │ └── ic_launcher.webp + │ │ │ │ ├── mipmap-xxxhdpi/ + │ │ │ │ │ ├── ic_launcher_foreground.webp + │ │ │ │ │ ├── ic_launcher_round.webp + │ │ │ │ │ └── ic_launcher.webp + │ │ │ │ ├── values/ + │ │ │ │ │ ├── colors.xml + │ │ │ │ │ ├── strings.xml + │ │ │ │ │ └── themes.xml + │ │ │ │ └── xml/ + │ │ │ │ ├── backup_rules.xml + │ │ │ │ ├── data_extraction_rules.xml + │ │ │ │ └── network_security_config.xml + │ │ │ ├── AndroidManifest.xml + │ │ │ └── ic_launcher-playstore.png + │ │ └── test/ + │ │ └── java/ + │ │ └── com/ + │ │ └── runicgateway/ + │ │ └── app/ + │ │ ├── core/ + │ │ │ ├── auth/ + │ │ │ │ ├── sso/ + │ │ │ │ │ ├── PkceTest.kt + │ │ │ │ │ └── SsoAuthManagerTest.kt + │ │ │ │ └── SessionManagerTest.kt + │ │ │ ├── net/ + │ │ │ │ ├── HostRewriteTest.kt + │ │ │ │ ├── ServerUrlTest.kt + │ │ │ │ └── ShardStreamClientTest.kt + │ │ │ ├── push/ + │ │ │ │ ├── NtfyTopicTest.kt + │ │ │ │ └── PushTickleTest.kt + │ │ │ └── result/ + │ │ │ └── ApiResultTest.kt + │ │ ├── data/ + │ │ │ ├── api/ + │ │ │ │ └── dto/ + │ │ │ │ ├── AccountDtoTest.kt + │ │ │ │ ├── AuthDtoTest.kt + │ │ │ │ ├── NotificationsDtoTest.kt + │ │ │ │ ├── PlayerShardDtoTest.kt + │ │ │ │ └── ShardDtoTest.kt + │ │ │ └── repository/ + │ │ │ ├── AccountTrustedDevicesTest.kt + │ │ │ └── ConnectionVersionGuardTest.kt + │ │ ├── ui/ + │ │ │ ├── navigation/ + │ │ │ │ └── MenuAccessTest.kt + │ │ │ ├── notifications/ + │ │ │ │ └── NotificationRoutingTest.kt + │ │ │ ├── player/ + │ │ │ │ └── CharacterSheetHelpersTest.kt + │ │ │ ├── shard/ + │ │ │ │ ├── LiveBoardTest.kt + │ │ │ │ └── ShardEventTextTest.kt + │ │ │ ├── theme/ + │ │ │ │ └── BrandColorTest.kt + │ │ │ └── UiStateTest.kt + │ │ └── ScaffoldSanityTest.kt + │ ├── build.gradle.kts + │ └── proguard-rules.pro + ├── gradle/ + │ ├── wrapper/ + │ │ ├── gradle-wrapper.jar + │ │ └── gradle-wrapper.properties + │ └── libs.versions.toml + ├── .gitattributes + ├── .gitignore + ├── build.gradle.kts + ├── CODE_OF_CONDUCT.md + ├── CONTRIBUTING.md + ├── CONTRIBUTORS.md + ├── gradle.properties + ├── gradlew + ├── gradlew.bat + ├── LICENSE.md + ├── README.md + ├── SECURITY.md + ├── settings.gradle.kts + └── sonar-project.properties +``` diff --git a/link/PROJECT_TREE.md b/link/PROJECT_TREE.md new file mode 100644 index 0000000..8fdc13c --- /dev/null +++ b/link/PROJECT_TREE.md @@ -0,0 +1,44 @@ +# uo-link — Project Tree + +> **Auto-generated.** This file is maintained by the `sync-project-tree` CI workflow in +> the [`RunicGateway/link`](https://gitea.whitlocktech.com/RunicGateway/link) repository, which +> opens a pull request here whenever the tracked file layout on `main` changes. Do not edit +> by hand — changes will be overwritten by the next sync. + +A snapshot of the tracked files in the repository (build output, dependencies, and other +git-ignored paths are excluded). + +```text +link-main/ +└── link/ + ├── .gitea/ + │ ├── ISSUE_TEMPLATE/ + │ │ ├── bug_report.md + │ │ ├── config.yaml + │ │ └── feature_request.md + │ ├── workflows/ + │ │ ├── release.yml + │ │ └── sonarqube.yml + │ └── PULL_REQUEST_TEMPLATE.md + ├── sidecar/ + │ ├── src/ + │ │ ├── config.rs + │ │ ├── main.rs + │ │ ├── rpc.rs + │ │ ├── shard.rs + │ │ ├── store.rs + │ │ └── web.rs + │ ├── .gitignore + │ ├── Cargo.lock + │ ├── Cargo.toml + │ ├── README.md + │ └── sidecar.toml.example + ├── .gitignore + ├── CODE_OF_CONDUCT.md + ├── CONTRIBUTING.md + ├── CONTRIBUTORS.md + ├── LICENSE.md + ├── README.md + ├── SECURITY.md + └── sonar-project.properties +``` diff --git a/website/PROJECT_TREE.md b/website/PROJECT_TREE.md new file mode 100644 index 0000000..5f51d25 --- /dev/null +++ b/website/PROJECT_TREE.md @@ -0,0 +1,532 @@ +# Website — Project Tree + +> **Auto-generated.** This file is maintained by the `sync-project-tree` CI workflow in +> the [`RunicGateway/website`](https://gitea.whitlocktech.com/RunicGateway/website) repository, which +> opens a pull request here whenever the tracked file layout on `main` changes. Do not edit +> by hand — changes will be overwritten by the next sync. + +A snapshot of the tracked files in the repository (build output, dependencies, and other +git-ignored paths are excluded). + +```text +website-main (4)/ +└── website/ + ├── .claude/ + │ └── launch.json + ├── .gitea/ + │ ├── ISSUE_TEMPLATE/ + │ │ ├── bug_report.md + │ │ ├── config.yaml + │ │ └── feature_request.md + │ ├── workflows/ + │ │ ├── build-images.yml + │ │ ├── pr-checks.yml + │ │ └── sonarqube.yml + │ └── PULL_REQUEST_TEMPLATE.md + ├── bot/ + │ ├── src/ + │ │ ├── discord/ + │ │ │ ├── commands/ + │ │ │ │ ├── announce.command.js + │ │ │ │ ├── autorole.command.js + │ │ │ │ ├── ban.command.js + │ │ │ │ ├── filter.command.js + │ │ │ │ ├── filterallow.command.js + │ │ │ │ ├── index.js + │ │ │ │ ├── invite.command.js + │ │ │ │ ├── kick.command.js + │ │ │ │ ├── modlog.command.js + │ │ │ │ ├── mute.command.js + │ │ │ │ ├── news.command.js + │ │ │ │ ├── ping.command.js + │ │ │ │ ├── role.command.js + │ │ │ │ ├── rolemenu.command.js + │ │ │ │ ├── roles.command.js + │ │ │ │ ├── schedule.command.js + │ │ │ │ ├── warn.command.js + │ │ │ │ ├── warnings.command.js + │ │ │ │ └── wiki.command.js + │ │ │ ├── discordManager.js + │ │ │ ├── guildMemberAdd.js + │ │ │ ├── guildMemberRemove.js + │ │ │ ├── inviteTracker.js + │ │ │ ├── messageFilter.js + │ │ │ ├── modLog.js + │ │ │ ├── newsAnnounce.js + │ │ │ └── roleMenuHandler.js + │ │ ├── filter/ + │ │ │ ├── filterCache.js + │ │ │ ├── inviteFilter.js + │ │ │ ├── normalize.js + │ │ │ └── spamFilter.js + │ │ ├── internal/ + │ │ │ ├── internal.controller.js + │ │ │ ├── internal.routes.js + │ │ │ └── requireInternalKey.js + │ │ ├── invites/ + │ │ │ ├── inviteRotator.js + │ │ │ └── inviteScheduler.js + │ │ ├── model/ + │ │ │ ├── filterAllowlist.js + │ │ │ ├── filterHits.js + │ │ │ ├── filterWords.js + │ │ │ ├── guildConfig.js + │ │ │ ├── inviteLog.js + │ │ │ ├── memberEvents.js + │ │ │ ├── roleMenus.js + │ │ │ ├── scheduledMessages.js + │ │ │ ├── spamHits.js + │ │ │ ├── tempRoles.js + │ │ │ └── warnings.js + │ │ ├── roles/ + │ │ │ └── tempRoleSweeper.js + │ │ ├── scheduler/ + │ │ │ └── scheduler.js + │ │ ├── site/ + │ │ │ └── siteApiClient.js + │ │ ├── utils/ + │ │ │ ├── duration.js + │ │ │ └── logger.js + │ │ ├── app.js + │ │ ├── bootstrap.js + │ │ ├── brand.js + │ │ ├── db.js + │ │ └── server.js + │ ├── .env.example + │ ├── .gitignore + │ ├── Dockerfile + │ ├── package-lock.json + │ └── package.json + ├── brand/ + │ └── README.md + ├── client/ + │ ├── public/ + │ │ ├── assets/ + │ │ │ └── img/ + │ │ │ ├── favicon.ico + │ │ │ ├── hero-moon.png + │ │ │ ├── runic-emblem.png + │ │ │ └── uomysticmoon-main-hero.png + │ │ └── robots.txt + │ ├── src/ + │ │ ├── api/ + │ │ │ └── client.js + │ │ ├── blocks/ + │ │ │ ├── types/ + │ │ │ │ ├── cta.jsx + │ │ │ │ ├── divider.jsx + │ │ │ │ ├── heading.jsx + │ │ │ │ ├── image.jsx + │ │ │ │ ├── quote.jsx + │ │ │ │ ├── richText.jsx + │ │ │ │ └── twoColumn.jsx + │ │ │ ├── BlockRenderer.jsx + │ │ │ ├── editorKit.jsx + │ │ │ ├── index.js + │ │ │ └── registry.js + │ │ ├── components/ + │ │ │ ├── security/ + │ │ │ │ ├── RecoveryCodesDisplay.jsx + │ │ │ │ ├── RecoveryCodesPanel.jsx + │ │ │ │ ├── TrustedDevicesPanel.jsx + │ │ │ │ └── TrustLimitModal.jsx + │ │ │ ├── CharacterSheet.jsx + │ │ │ ├── CharacterStats.jsx + │ │ │ ├── CreateGameAccountForm.jsx + │ │ │ ├── GameAccounts.jsx + │ │ │ ├── HeroElement.jsx + │ │ │ ├── MaintenanceGate.jsx + │ │ │ ├── Modal.jsx + │ │ │ ├── MoonDot.jsx + │ │ │ ├── PageHeader.jsx + │ │ │ ├── PageState.jsx + │ │ │ ├── PlayersOnline.jsx + │ │ │ ├── ProviderIcon.jsx + │ │ │ ├── PublicLayout.jsx + │ │ │ ├── RequireAuth.jsx + │ │ │ ├── RequirePlayer.jsx + │ │ │ ├── RichTextEditor.jsx + │ │ │ ├── RoleGate.jsx + │ │ │ ├── ShardAccountActions.jsx + │ │ │ ├── SiteFooter.jsx + │ │ │ ├── SiteHeader.jsx + │ │ │ └── VendorSales.jsx + │ │ ├── contexts/ + │ │ │ ├── AuthContext.jsx + │ │ │ └── SiteContext.jsx + │ │ ├── data/ + │ │ │ ├── cityCrests.js + │ │ │ └── regionBuckets.js + │ │ ├── lib/ + │ │ │ ├── format.js + │ │ │ ├── heroLayout.js + │ │ │ ├── shardEvents.js + │ │ │ ├── useAsync.js + │ │ │ └── useShardFeed.js + │ │ ├── routes/ + │ │ │ ├── admin/ + │ │ │ │ ├── views/ + │ │ │ │ │ ├── AccountAdmin.jsx + │ │ │ │ │ ├── ActivityAdmin.jsx + │ │ │ │ │ ├── AdminCharacter.jsx + │ │ │ │ │ ├── AdminCharacters.jsx + │ │ │ │ │ ├── Appeals.jsx + │ │ │ │ │ ├── AuthProvidersAdmin.jsx + │ │ │ │ │ ├── BotActivityAdmin.jsx + │ │ │ │ │ ├── Dashboard.jsx + │ │ │ │ │ ├── DiscordBotAdmin.jsx + │ │ │ │ │ ├── EmailDelivery.jsx + │ │ │ │ │ ├── HeroEditor.jsx + │ │ │ │ │ ├── HousesAdmin.jsx + │ │ │ │ │ ├── InvitesAdmin.jsx + │ │ │ │ │ ├── Moderation.jsx + │ │ │ │ │ ├── ModerationUser.jsx + │ │ │ │ │ ├── PageBuilder.jsx + │ │ │ │ │ ├── PagesAdmin.jsx + │ │ │ │ │ ├── PostEditor.jsx + │ │ │ │ │ ├── PostsAdmin.jsx + │ │ │ │ │ ├── SettingsAdmin.jsx + │ │ │ │ │ ├── ShardAdmin.jsx + │ │ │ │ │ ├── ShardOps.jsx + │ │ │ │ │ ├── UserDetail.jsx + │ │ │ │ │ ├── UserEditor.jsx + │ │ │ │ │ ├── UsersAdmin.jsx + │ │ │ │ │ ├── WikiAdmin.jsx + │ │ │ │ │ ├── WikiCategories.jsx + │ │ │ │ │ ├── WikiEditor.jsx + │ │ │ │ │ └── WikiHistory.jsx + │ │ │ │ ├── AdminLayout.jsx + │ │ │ │ └── AdminLogin.jsx + │ │ │ ├── player/ + │ │ │ │ ├── AcceptInvite.jsx + │ │ │ │ ├── ForgotPassword.jsx + │ │ │ │ ├── PlayerAccount.jsx + │ │ │ │ ├── PlayerAppeals.jsx + │ │ │ │ ├── PlayerCharacter.jsx + │ │ │ │ ├── PlayerCharacters.jsx + │ │ │ │ ├── PlayerLogin.jsx + │ │ │ │ ├── PlayerPortalLayout.jsx + │ │ │ │ ├── PlayerRegister.jsx + │ │ │ │ ├── PlayerShell.jsx + │ │ │ │ └── ResetPassword.jsx + │ │ │ ├── public/ + │ │ │ │ ├── About.jsx + │ │ │ │ ├── ChampSpawns.jsx + │ │ │ │ ├── CmsPage.jsx + │ │ │ │ ├── FiveOnFriday.jsx + │ │ │ │ ├── Governors.jsx + │ │ │ │ ├── Guilds.jsx + │ │ │ │ ├── Houses.jsx + │ │ │ │ ├── Maintenance.jsx + │ │ │ │ ├── News.jsx + │ │ │ │ ├── Newsletter.jsx + │ │ │ │ ├── NewsletterIssue.jsx + │ │ │ │ ├── Portal.jsx + │ │ │ │ ├── Screenshots.jsx + │ │ │ │ ├── Shard.jsx + │ │ │ │ ├── ShardActivity.jsx + │ │ │ │ ├── Status.jsx + │ │ │ │ └── Website.jsx + │ │ │ └── wiki/ + │ │ │ ├── Wiki.jsx + │ │ │ └── WikiArticle.jsx + │ │ ├── styles/ + │ │ │ └── theme.css + │ │ ├── App.jsx + │ │ └── main.jsx + │ ├── test/ + │ │ ├── apiClient.test.js + │ │ ├── format.test.js + │ │ ├── heroLayout.test.js + │ │ ├── regionBuckets.test.js + │ │ └── shardEvents.test.js + │ ├── index.html + │ ├── package-lock.json + │ ├── package.json + │ └── vite.config.js + ├── ntfy/ + │ └── server.yml + ├── scripts/ + │ ├── dev/ + │ │ ├── README.md + │ │ ├── seed-sso-provider.js + │ │ ├── sso-bridge-smoketest.js + │ │ └── stub-idp.js + │ └── sonar-test-reporter.mjs + ├── server/ + │ ├── db/ + │ │ ├── schema.sql + │ │ └── seed.js + │ ├── src/ + │ │ ├── auth/ + │ │ │ ├── providers/ + │ │ │ │ ├── base.provider.js + │ │ │ │ ├── discord.provider.js + │ │ │ │ ├── genericOidc.provider.js + │ │ │ │ ├── google.provider.js + │ │ │ │ ├── local.provider.js + │ │ │ │ ├── oauth2.provider.js + │ │ │ │ └── registry.js + │ │ │ ├── session.middleware.js + │ │ │ ├── session.service.js + │ │ │ ├── ssoState.js + │ │ │ ├── token.js + │ │ │ └── usernamePolicy.js + │ │ ├── blocks/ + │ │ │ ├── types/ + │ │ │ │ ├── cta.js + │ │ │ │ ├── divider.js + │ │ │ │ ├── heading.js + │ │ │ │ ├── image.js + │ │ │ │ ├── quote.js + │ │ │ │ ├── richText.js + │ │ │ │ └── twoColumn.js + │ │ │ ├── index.js + │ │ │ ├── propHelpers.js + │ │ │ ├── registry.js + │ │ │ ├── sanitizeBlocks.js + │ │ │ └── validateBlocks.js + │ │ ├── config/ + │ │ │ ├── brand.js + │ │ │ ├── notificationStreams.js + │ │ │ └── version.js + │ │ ├── middleware/ + │ │ │ ├── botScore.js + │ │ │ ├── loginProtection.js + │ │ │ ├── noindex.js + │ │ │ ├── rateLimit.js + │ │ │ ├── requireInternalKey.js + │ │ │ ├── siteMode.js + │ │ │ └── validate.js + │ │ ├── model/ + │ │ │ ├── activity/ + │ │ │ │ ├── activity.db.js + │ │ │ │ └── activity.model.js + │ │ │ ├── announceJobs/ + │ │ │ │ ├── announceJobs.db.js + │ │ │ │ ├── announceJobs.logic.js + │ │ │ │ └── announceJobs.model.js + │ │ │ ├── appeals/ + │ │ │ │ ├── appeals.db.js + │ │ │ │ ├── appeals.model.js + │ │ │ │ └── appeals.pure.js + │ │ │ ├── authProviders/ + │ │ │ │ ├── authProviders.db.js + │ │ │ │ └── authProviders.model.js + │ │ │ ├── botConfig/ + │ │ │ │ ├── botConfig.db.js + │ │ │ │ └── botConfig.model.js + │ │ │ ├── emailConfig/ + │ │ │ │ ├── emailConfig.db.js + │ │ │ │ └── emailConfig.model.js + │ │ │ ├── invites/ + │ │ │ │ ├── invites.db.js + │ │ │ │ └── invites.model.js + │ │ │ ├── mobileAuthBridge/ + │ │ │ │ ├── mobileAuthBridge.db.js + │ │ │ │ └── mobileAuthBridge.model.js + │ │ │ ├── mobileSessions/ + │ │ │ │ ├── mobileSessions.db.js + │ │ │ │ └── mobileSessions.model.js + │ │ │ ├── moderation/ + │ │ │ │ ├── moderation.db.js + │ │ │ │ ├── moderation.model.js + │ │ │ │ └── moderation.pure.js + │ │ │ ├── modNotes/ + │ │ │ │ ├── modNotes.db.js + │ │ │ │ └── modNotes.model.js + │ │ │ ├── notificationSubs/ + │ │ │ │ ├── notificationSubs.db.js + │ │ │ │ └── notificationSubs.model.js + │ │ │ ├── pages/ + │ │ │ │ ├── pages.db.js + │ │ │ │ ├── pages.model.js + │ │ │ │ └── reservedSlugs.js + │ │ │ ├── passwordResets/ + │ │ │ │ ├── passwordResets.db.js + │ │ │ │ └── passwordResets.model.js + │ │ │ ├── posts/ + │ │ │ │ ├── posts.db.js + │ │ │ │ └── posts.model.js + │ │ │ ├── pushDevices/ + │ │ │ │ ├── pushDevices.db.js + │ │ │ │ └── pushDevices.model.js + │ │ │ ├── recoveryCodes/ + │ │ │ │ ├── recoveryCodes.db.js + │ │ │ │ └── recoveryCodes.model.js + │ │ │ ├── revokedSessions/ + │ │ │ │ ├── revokedSessions.db.js + │ │ │ │ └── revokedSessions.model.js + │ │ │ ├── settings/ + │ │ │ │ ├── settings.db.js + │ │ │ │ └── settings.model.js + │ │ │ ├── shardEvents/ + │ │ │ │ ├── shardEvents.db.js + │ │ │ │ └── shardEvents.model.js + │ │ │ ├── shardLinks/ + │ │ │ │ ├── shardLinks.db.js + │ │ │ │ └── shardLinks.model.js + │ │ │ ├── shardState/ + │ │ │ │ ├── shardState.db.js + │ │ │ │ └── shardState.model.js + │ │ │ ├── trustedDevices/ + │ │ │ │ ├── trustedDevices.db.js + │ │ │ │ └── trustedDevices.model.js + │ │ │ ├── uoLinkConfig/ + │ │ │ │ ├── uoLinkConfig.db.js + │ │ │ │ └── uoLinkConfig.model.js + │ │ │ ├── userIdentities/ + │ │ │ │ ├── userIdentities.db.js + │ │ │ │ └── userIdentities.model.js + │ │ │ ├── users/ + │ │ │ │ ├── users.db.js + │ │ │ │ └── users.model.js + │ │ │ ├── wiki/ + │ │ │ │ ├── wiki.db.js + │ │ │ │ ├── wiki.links.js + │ │ │ │ └── wiki.model.js + │ │ │ └── singletonConfigDb.js + │ │ ├── router/ + │ │ │ ├── v1/ + │ │ │ │ ├── admin/ + │ │ │ │ │ ├── account.controller.js + │ │ │ │ │ ├── admin.controller.js + │ │ │ │ │ ├── admin.routes.js + │ │ │ │ │ ├── authProviders.controller.js + │ │ │ │ │ ├── botActivity.controller.js + │ │ │ │ │ ├── discordBot.controller.js + │ │ │ │ │ ├── emailConfig.controller.js + │ │ │ │ │ ├── invites.controller.js + │ │ │ │ │ ├── moderation.controller.js + │ │ │ │ │ ├── pages.controller.js + │ │ │ │ │ ├── shardOps.controller.js + │ │ │ │ │ ├── uoLink.controller.js + │ │ │ │ │ └── usersShard.controller.js + │ │ │ │ ├── auth/ + │ │ │ │ │ ├── auth.controller.js + │ │ │ │ │ ├── auth.routes.js + │ │ │ │ │ ├── invite.controller.js + │ │ │ │ │ ├── me.routes.js + │ │ │ │ │ ├── mobile.controller.js + │ │ │ │ │ ├── mobile.routes.js + │ │ │ │ │ ├── mobileSso.controller.js + │ │ │ │ │ ├── mobileSso.routes.js + │ │ │ │ │ ├── notifications.controller.js + │ │ │ │ │ ├── notifications.routes.js + │ │ │ │ │ ├── passwordReset.controller.js + │ │ │ │ │ ├── sso.controller.js + │ │ │ │ │ ├── sso.routes.js + │ │ │ │ │ └── trustDevice.helper.js + │ │ │ │ ├── internal/ + │ │ │ │ │ ├── internal.controller.js + │ │ │ │ │ └── internal.routes.js + │ │ │ │ ├── player/ + │ │ │ │ │ ├── appeals.controller.js + │ │ │ │ │ ├── player.routes.js + │ │ │ │ │ └── shard.controller.js + │ │ │ │ ├── public/ + │ │ │ │ │ ├── public.controller.js + │ │ │ │ │ ├── public.routes.js + │ │ │ │ │ └── shard.controller.js + │ │ │ │ └── v1.router.js + │ │ │ ├── api.router.js + │ │ │ └── wellKnown.controller.js + │ │ ├── utils/ + │ │ │ ├── announceWorker.js + │ │ │ ├── auth.js + │ │ │ ├── botInternalClient.js + │ │ │ ├── botInternalKey.js + │ │ │ ├── db.js + │ │ │ ├── logger.js + │ │ │ ├── mailer.js + │ │ │ ├── newsGump.js + │ │ │ ├── pushDispatch.js + │ │ │ ├── sanitizeHtml.js + │ │ │ ├── secretBox.js + │ │ │ ├── shardBroadcast.js + │ │ │ ├── shardIngest.js + │ │ │ ├── shardSales.js + │ │ │ ├── totp.js + │ │ │ ├── trustProxy.js + │ │ │ ├── uoLinkClient.js + │ │ │ └── uoLinkSocket.js + │ │ ├── app.js + │ │ ├── internalApp.js + │ │ └── server.js + │ ├── swagger/ + │ │ ├── swagger-output.json + │ │ └── swagger.js + │ ├── test/ + │ │ ├── _helper.js + │ │ ├── adminTrustedDevices.test.js + │ │ ├── adminUserShard.test.js + │ │ ├── announceJobs.test.js + │ │ ├── appeals.pure.test.js + │ │ ├── appeals.test.js + │ │ ├── appLinks.test.js + │ │ ├── authController.test.js + │ │ ├── authMe.test.js + │ │ ├── authTrustedDevice.test.js + │ │ ├── botInternalKey.test.js + │ │ ├── botScore.test.js + │ │ ├── emailConfig.model.test.js + │ │ ├── honeypot.test.js + │ │ ├── inviteController.test.js + │ │ ├── invites.test.js + │ │ ├── loginProtection.test.js + │ │ ├── mailer.test.js + │ │ ├── mobileAuthBridge.model.test.js + │ │ ├── mobileDeviceSessions.test.js + │ │ ├── mobileSession.test.js + │ │ ├── mobileSsoBridge.test.js + │ │ ├── moderation.model.test.js + │ │ ├── moderation.test.js + │ │ ├── newsGump.test.js + │ │ ├── notificationsRoutes.test.js + │ │ ├── pages.model.test.js + │ │ ├── passwordResetController.test.js + │ │ ├── passwordResets.test.js + │ │ ├── playerAccounts.test.js + │ │ ├── playerRouteAccess.test.js + │ │ ├── providers.test.js + │ │ ├── publicBrand.test.js + │ │ ├── publicController.test.js + │ │ ├── publicShardOnline.test.js + │ │ ├── publicVersion.test.js + │ │ ├── pushDispatch.test.js + │ │ ├── recoveryCodes.test.js + │ │ ├── registry.test.js + │ │ ├── requireInternalKey.test.js + │ │ ├── secretBox.test.js + │ │ ├── selfTrustedDevices.test.js + │ │ ├── session.test.js + │ │ ├── shardControllerPublic.test.js + │ │ ├── shardIngest.champsPages.test.js + │ │ ├── shardIngest.protocol2.test.js + │ │ ├── shardState.governorTerms.test.js + │ │ ├── shardState.model.test.js + │ │ ├── ssoCallback.test.js + │ │ ├── ssoState.test.js + │ │ ├── totp.test.js + │ │ ├── trustedDevices.test.js + │ │ ├── trustProxy.test.js + │ │ └── usernamePolicy.test.js + │ ├── .env.example + │ ├── package-lock.json + │ └── package.json + ├── .dockerignore + ├── .env.example + ├── .env.uomysticmoon.example + ├── .gitignore + ├── CODE_OF_CONDUCT.md + ├── CONTRIBUTING.md + ├── CONTRIBUTORS.md + ├── docker-compose.dev.yml + ├── docker-compose.yml + ├── Dockerfile + ├── LICENSE.md + ├── package.json + ├── README.md + ├── SECURITY.md + └── sonar-project.properties +``` -- 2.49.1