@underpostnet/cyberia 3.3.73 → 3.3.76

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/.env.example +17 -5
  2. package/.github/workflows/coverall.cyberia.ci.yml +5 -0
  3. package/.github/workflows/docker-image.cyberia-client.ci.yml +1 -1
  4. package/.github/workflows/docker-image.cyberia-client.dev.ci.yml +1 -1
  5. package/.github/workflows/docker-image.cyberia-server.ci.yml +1 -1
  6. package/.github/workflows/docker-image.cyberia-server.dev.ci.yml +1 -1
  7. package/.github/workflows/docker-image.engine-cyberia.ci.yml +1 -1
  8. package/.github/workflows/docker-image.engine-cyberia.dev.ci.yml +1 -1
  9. package/.github/workflows/publish.cyberia.ci.yml +44 -0
  10. package/AGENTS.md +61 -12
  11. package/CHANGELOG.md +126 -41
  12. package/CLI-HELP.md +19 -12
  13. package/Dockerfile +1 -1
  14. package/Dockerfile.dev +1 -1
  15. package/Dockerfile.test +2 -2
  16. package/README.md +28 -28
  17. package/bin/build.js +37 -17
  18. package/bin/cyberia.js +1247 -1373
  19. package/bin/index.js +1247 -1373
  20. package/compose.env +17 -5
  21. package/conf.js +7 -3
  22. package/deploy/cyberia-client/deploy.sh +10 -11
  23. package/deploy/cyberia-client/package.sh +0 -1
  24. package/deploy/cyberia-client/state.sh +3 -2
  25. package/deploy/cyberia-server/deploy.sh +10 -11
  26. package/deploy/cyberia-server/package.sh +0 -1
  27. package/deploy/cyberia-server/state.sh +3 -2
  28. package/deploy/dd-cyberia/deploy.sh +5 -5
  29. package/deploy/dd-cyberia/init.sh +15 -14
  30. package/deploy/dd-cyberia/package.sh +0 -1
  31. package/deploy/dd-cyberia/state.sh +2 -2
  32. package/deploy/dd-cyberia/sync-deploy.sh +139 -75
  33. package/deploy/lib/config.sh +29 -0
  34. package/deploy/lib/github-actions-logging.sh +92 -76
  35. package/deploy/lib/host.sh +27 -18
  36. package/deploy/lib/state.sh +4 -1
  37. package/deploy/pwa-microservices-template/deploy.sh +10 -8
  38. package/deploy/release/deploy.sh +0 -2
  39. package/deployment.yaml +1 -1
  40. package/docker-compose.yml +23 -17
  41. package/hardhat/package-lock.json +2 -2
  42. package/hardhat/package.json +1 -1
  43. package/manifests/cronjobs/dd-cron/dd-cron-backup.yaml +1 -1
  44. package/manifests/cronjobs/dd-cron/dd-cron-vultr.yaml +1 -1
  45. package/manifests/deployment/dd-cyberia-development/deployment.yaml +1 -1
  46. package/manifests/deployment/dd-default-development/deployment.yaml +2 -2
  47. package/manifests/deployment/mongo-express/deployment.yaml +46 -27
  48. package/manifests/deployment/mongo-express/kustomization.yaml +9 -0
  49. package/manifests/deployment/mongo-express/mongo-express-nodeport.yaml +18 -0
  50. package/manifests/deployment/mongo-express/service.yaml +16 -0
  51. package/manifests/deployment/mongo-express-no-auth/disable-mongodb-auth.yaml +16 -0
  52. package/manifests/deployment/mongo-express-no-auth/kustomization.yaml +16 -0
  53. package/package.json +19 -17
  54. package/scripts/test-monitor.sh +3 -3
  55. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.controller.js +14 -9
  56. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.model.js +36 -5
  57. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.router.js +5 -0
  58. package/src/api/atlas-sprite-sheet/atlas-sprite-sheet.service.js +88 -184
  59. package/src/api/cyberia-action/cyberia-action.router.js +2 -2
  60. package/src/api/cyberia-action/cyberia-action.service.js +3 -4
  61. package/src/api/cyberia-audio/cyberia-audio.controller.js +6 -0
  62. package/src/api/cyberia-audio/cyberia-audio.model.js +61 -0
  63. package/src/api/cyberia-audio/cyberia-audio.router.js +21 -0
  64. package/src/api/cyberia-audio/cyberia-audio.service.js +220 -0
  65. package/src/api/cyberia-client-hints/cyberia-client-hints.controller.js +1 -3
  66. package/src/api/cyberia-client-hints/cyberia-client-hints.model.js +10 -19
  67. package/src/api/cyberia-client-hints/cyberia-client-hints.router.js +12 -34
  68. package/src/api/cyberia-client-hints/cyberia-client-hints.service.js +15 -32
  69. package/src/api/cyberia-dialogue/cyberia-dialogue.model.js +1 -1
  70. package/src/api/cyberia-dialogue/cyberia-dialogue.router.js +1 -1
  71. package/src/api/cyberia-entity/cyberia-entity.model.js +2 -0
  72. package/src/api/cyberia-entity/cyberia-entity.service.js +1 -1
  73. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.controller.js +8 -2
  74. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.model.js +31 -20
  75. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.router.js +16 -1
  76. package/src/api/cyberia-entity-type-default/cyberia-entity-type-default.service.js +466 -3
  77. package/src/api/cyberia-instance/cyberia-fallback-capture.js +87 -51
  78. package/src/api/cyberia-instance/cyberia-fallback-world.js +21 -40
  79. package/src/api/cyberia-instance/cyberia-instance-boot.service.js +5 -5
  80. package/src/api/cyberia-instance/cyberia-instance-items.js +98 -0
  81. package/src/api/cyberia-instance/cyberia-instance-map.service.js +34 -141
  82. package/src/api/cyberia-instance/cyberia-instance.controller.js +1 -4
  83. package/src/api/cyberia-instance/cyberia-instance.model.js +0 -14
  84. package/src/api/cyberia-instance/cyberia-instance.router.js +3 -16
  85. package/src/api/cyberia-instance/cyberia-instance.service.js +3 -43
  86. package/src/api/cyberia-instance/cyberia-world-generator.js +8 -13
  87. package/src/api/cyberia-instance-conf/cyberia-instance-conf.model.js +49 -75
  88. package/src/api/cyberia-instance-conf/cyberia-instance-conf.service.js +74 -1
  89. package/src/api/cyberia-map/cyberia-map.service.js +6 -2
  90. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.controller.js +31 -0
  91. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.model.js +56 -0
  92. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.router.js +33 -0
  93. package/src/api/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +189 -0
  94. package/src/api/cyberia-quest/cyberia-quest.router.js +3 -3
  95. package/src/api/cyberia-quest/cyberia-quest.service.js +3 -3
  96. package/src/api/cyberia-quest-progress/cyberia-quest-progress.model.js +1 -1
  97. package/src/api/cyberia-server-defaults/cyberia-server-defaults.js +403 -188
  98. package/src/api/cyberia-skill/cyberia-skill.model.js +6 -6
  99. package/src/api/file/file.ref.js +153 -0
  100. package/src/api/file/file.ref.json +11 -2
  101. package/src/api/object-layer/object-layer.model.js +47 -12
  102. package/src/api/object-layer/object-layer.router.js +10 -3
  103. package/src/api/object-layer/object-layer.service.js +113 -120
  104. package/src/cli/app.js +12 -1
  105. package/src/cli/client.js +2 -2
  106. package/src/cli/cluster.js +7 -0
  107. package/src/cli/deploy.js +4 -4
  108. package/src/cli/docker-compose.js +1 -1
  109. package/src/cli/fs-selection.js +115 -0
  110. package/src/cli/fs.js +158 -342
  111. package/src/cli/index.js +22 -10
  112. package/src/cli/repository.js +28 -0
  113. package/src/cli/run.js +71 -197
  114. package/src/cli/test.js +4 -0
  115. package/src/cli/wireguard.js +32 -31
  116. package/src/client/components/core/Docs.js +77 -100
  117. package/src/client/components/core/Modal.js +56 -1
  118. package/src/client/components/cyberia/ActionEngineCyberia.js +12 -36
  119. package/src/client/components/cyberia/EntityEngineCyberia.js +492 -121
  120. package/src/client/components/cyberia/InstanceEngineCyberia.js +129 -160
  121. package/src/client/components/cyberia/InstanceSelectionView.js +7 -1
  122. package/src/client/components/cyberia/MapEngineCyberia.js +175 -69
  123. package/src/client/components/cyberia/ObjectLayerEngine.js +1011 -97
  124. package/src/client/components/cyberia/ObjectLayerEngineModal.js +81 -155
  125. package/src/client/components/cyberia/ObjectLayerEngineViewer.js +113 -98
  126. package/src/client/components/cyberia/SharedDefaultsCyberia.js +215 -56
  127. package/src/client/components/cyberia-portal/AppShellCyberiaPortal.js +0 -34
  128. package/src/client/components/cyberia-portal/CssCyberiaPortal.js +1 -1
  129. package/src/client/components/cyberia-portal/MainBodyCyberiaPortal.js +712 -76
  130. package/src/client/components/cyberia-portal/TranslateCyberiaPortal.js +0 -4
  131. package/src/client/public/cyberia-docs/ARCHITECTURE.md +15 -15
  132. package/src/client/public/cyberia-docs/CYBERIA-CLI.md +280 -24
  133. package/src/client/public/cyberia-docs/CYBERIA-CLIENT.md +51 -29
  134. package/src/client/public/cyberia-docs/CYBERIA-SAGA.md +52 -53
  135. package/src/client/public/cyberia-docs/CYBERIA-SERVER.md +16 -11
  136. package/src/client/public/cyberia-docs/CYBERIA.md +28 -28
  137. package/src/client/public/cyberia-docs/ENTITY-PROFILE.md +11 -5
  138. package/src/client/public/cyberia-docs/ROADMAP.md +1 -1
  139. package/src/client/public/cyberia-docs/STATS-PROGRESSION.md +217 -0
  140. package/src/client/public/cyberia-docs/WHITE-PAPER.md +20 -12
  141. package/src/client/services/cyberia-audio/cyberia-audio.service.js +99 -0
  142. package/src/client/services/cyberia-entity-type-default/cyberia-entity-type-default.service.js +38 -0
  143. package/src/client/services/cyberia-instance/cyberia-instance.management.js +5 -4
  144. package/src/client/services/cyberia-instance/cyberia-instance.service.js +0 -40
  145. package/src/client/services/cyberia-map/cyberia-map.management.js +5 -4
  146. package/src/client/services/cyberia-map-audio-conf/cyberia-map-audio-conf.service.js +138 -0
  147. package/src/client/services/object-layer/object-layer.management.js +6 -10
  148. package/src/client/services/object-layer/object-layer.service.js +3 -1
  149. package/src/client-builder/client-build-docs.js +52 -52
  150. package/src/client-builder/client-build.js +67 -44
  151. package/src/client-builder/client-bundle.js +347 -0
  152. package/src/db/mongo/MongoExpress.js +187 -0
  153. package/src/grpc/cyberia/grpc-server.js +5 -7
  154. package/src/index.js +1 -1
  155. package/src/projects/cyberia/atlas-sprite-sheet-generator.js +143 -146
  156. package/src/projects/cyberia/atlas-sprite-sheet-store.js +391 -0
  157. package/src/projects/cyberia/besu-genesis-generator.js +5 -14
  158. package/src/projects/cyberia/boot-contract-fixtures.js +32 -0
  159. package/src/projects/cyberia/catalog-cyberia.js +3 -2
  160. package/src/projects/cyberia/gemini-client.js +3 -3
  161. package/src/projects/cyberia/generate-saga.js +4 -11
  162. package/src/projects/cyberia/hot-reload-trigger.js +17 -28
  163. package/src/projects/cyberia/instance-backup.js +210 -0
  164. package/src/projects/cyberia/instance-data.js +177 -257
  165. package/src/projects/cyberia/map-preview-generator.js +32 -68
  166. package/src/projects/cyberia/object-layer.js +152 -319
  167. package/src/projects/cyberia/seed-audio.js +139 -0
  168. package/src/projects/cyberia/semantic-layer-generator-skin.js +2 -8
  169. package/src/projects/cyberia/semantic-layer-generator.js +2 -18
  170. package/src/projects/cyberia/stat-balance.js +81 -0
  171. package/src/projects/cyberia/stat-commands.js +23 -0
  172. package/src/projects/cyberia/stat-contract-generator.js +101 -0
  173. package/src/runtime/cyberia-client/Dockerfile +8 -4
  174. package/src/runtime/cyberia-client/Dockerfile.dev +5 -2
  175. package/src/runtime/cyberia-server/Dockerfile +9 -2
  176. package/src/runtime/cyberia-server/Dockerfile.dev +8 -1
  177. package/src/runtime/engine-cyberia/Dockerfile +1 -1
  178. package/src/runtime/engine-cyberia/Dockerfile.dev +1 -1
  179. package/src/runtime/engine-cyberia/Dockerfile.test +2 -2
  180. package/src/runtime/engine-cyberia/compose.env +17 -5
  181. package/src/runtime/engine-cyberia/docker-compose.yml +23 -17
  182. package/src/server/build/coverage.js +113 -42
  183. package/src/server/build/package.js +55 -12
  184. package/src/server/build/testing.js +59 -9
  185. package/src/server/network/middlewares.js +8 -2
  186. package/src/server/ops/logger.js +70 -35
  187. package/src/server/runtime/conf.js +4 -2
  188. package/src/server/storage/data-query.js +16 -0
  189. package/src/server/storage/downloader.js +62 -14
  190. package/src/server/storage/zip.js +153 -0
  191. package/test/integration/app/cyberia/atlas-sprite-sheet-store.test.js +402 -0
  192. package/test/integration/app/cyberia/atlas-sprite-sheet.test.js +86 -0
  193. package/test/integration/app/cyberia/cyberia-cli-plain-reads.test.js +34 -0
  194. package/test/integration/app/cyberia/cyberia-entity-type-default.test.js +842 -0
  195. package/test/integration/app/cyberia/cyberia-instance-conf-coerce.test.js +53 -0
  196. package/test/integration/app/cyberia/cyberia-instance-conf-defaults.test.js +16 -22
  197. package/test/integration/app/cyberia/cyberia-instance-items.test.js +90 -0
  198. package/test/integration/app/cyberia/cyberia-load.test.js +6 -7
  199. package/test/integration/app/cyberia/cyberia-map-audio-conf.test.js +256 -0
  200. package/test/integration/app/cyberia/cyberia-stats.test.js +150 -0
  201. package/test/integration/app/cyberia/fallback-world-capture.test.js +87 -2
  202. package/test/integration/app/cyberia/object-layer-item-selection.test.js +56 -0
  203. package/test/integration/app/cyberia/object-layer-natural-key.test.js +32 -0
  204. package/test/integration/app/cyberia/seed-audio.test.js +275 -0
  205. package/test/integration/infra/2-network/wireguard-cli.test.js +33 -9
  206. package/test/integration/infra/2-network/wireguard-edge.test.js +58 -18
  207. package/test/integration/infra/3-cluster/mongo-express-deploy.test.js +156 -0
  208. package/test/integration/infra/4-ingress/api-cross-origin.test.js +79 -0
  209. package/test/unit/client-build-docs.test.js +97 -70
  210. package/test/unit/client-bundle.test.js +313 -0
  211. package/test/unit/conf-resolution.test.js +17 -0
  212. package/test/unit/coverage-artifact.test.js +120 -29
  213. package/test/unit/cyberia/instance-backup.test.js +183 -0
  214. package/test/unit/cyberia/instance-object-layer-items.test.js +46 -0
  215. package/test/unit/cyberia/publish-workflow.test.js +22 -0
  216. package/test/unit/cyberia/stat-balance.test.js +69 -0
  217. package/test/unit/deploy-log-table.test.js +76 -5
  218. package/test/unit/downloader-integrity.test.js +98 -0
  219. package/test/unit/file-reference-registry.test.js +141 -0
  220. package/test/unit/fs-storage-paths.test.js +596 -0
  221. package/test/unit/logger-redaction.test.js +29 -0
  222. package/test/unit/package.test.js +70 -16
  223. package/test/unit/prepare-host.test.js +84 -1
  224. package/test/unit/test-tiers.test.js +27 -0
  225. package/test/unit/zip-archive.test.js +142 -0
  226. package/vitest.config.js +11 -3
  227. package/src/api/cyberia-instance/cyberia-fallback-default-items.js +0 -63
  228. package/src/client/components/cyberia/FallbackWorldEngineCyberia.js +0 -368
package/.env.example CHANGED
@@ -43,25 +43,37 @@ VALKEY_PORT=6379
43
43
  # cyberia-server-* -> stable engine gateway for HTTP and the raw engine runtime
44
44
  # for gRPC. The public engine-cyberia name belongs to nginx, avoiding ambiguous
45
45
  # Docker DNS while keeping one stable HTTP endpoint for every module.
46
- ENGINE_API_BASE_URL=http://engine-cyberia
47
- ENGINE_GRPC_ADDRESS=engine-cyberia-runtime:50051
46
+ CYBERIA_DATA_SERVER_URL=http://engine-cyberia
47
+ CYBERIA_DATA_SERVER_GRPC=engine-cyberia-runtime:50051
48
48
 
49
49
  # Client-visible Content Authority origin, forwarded to browser/Raylib clients
50
50
  # for every engine-cyberia content/asset/metadata request. Host-reachable
51
51
  # (Docker publishes the raw engine runtime on host :4005). Unlike the internal
52
- # ENGINE_API_BASE_URL, this value is consumed outside the Compose network:
52
+ # CYBERIA_DATA_SERVER_URL, this value is consumed outside the Compose network:
53
53
  # the two responsibilities must never overwrite each other.
54
54
  ENGINE_PUBLIC_URL=http://localhost:4005
55
55
  ENGINE_GRPC_RELOAD_INTERVAL_SEC=300
56
56
 
57
- # --- Browser-facing client runtime config (injected by docker-driver.py) -----
57
+ # Shared secret between the engine and every game server. It guards the server
58
+ # registry report (server -> engine) and the hot-reload trigger (engine ->
59
+ # server). Unset disables both: a server then stays out of the public list.
60
+ CYBERIA_SERVER_API_KEY=change_me_dev_server_api_key
61
+
62
+ # Public origin of the server gateway. Each server reports this origin plus its
63
+ # own sub-path, which is the URL a client dials.
64
+ CYBERIA_SERVER_PUBLIC_ORIGIN=http://localhost:8081
65
+
66
+ # --- Browser-facing client runtime config (injected by wasm-driver.py) -----
58
67
  # The single WASM bundle resolves its instance from the URL sub-path and builds
59
68
  # its endpoints from these origins. HTTP client/API traffic uses nginx on :80;
60
69
  # WebSocket traffic uses the dedicated multi-path server gateway on :8081.
61
70
  # http://localhost/ -> default, ws://localhost:8081/ws
62
71
  # http://localhost/FOREST -> FOREST, ws://localhost:8081/FOREST/ws
63
72
  CYBERIA_WS_ORIGIN=ws://localhost:8081
64
- CYBERIA_ENGINE_API_ORIGIN=http://localhost
73
+ # The browser's own route to the Data Server, through nginx on :80. Distinct from the internal
74
+ # CYBERIA_DATA_SERVER_URL above: both name a Data Server origin, but from opposite sides of the
75
+ # Compose network, and one file cannot hold two values under one name.
76
+ CYBERIA_CLIENT_DATA_SERVER_URL=http://localhost
65
77
  CYBERIA_DEFAULT_INSTANCE=amethyst-strata-expansion
66
78
 
67
79
  # cyberia-server logging. This is the dev stack, so default to DEBUG. Set
@@ -34,6 +34,11 @@ jobs:
34
34
  curl -fsSL https://rpm.nodesource.com/setup_24.x | bash -
35
35
  dnf install nodejs -y
36
36
 
37
+ # gofmt formats the generated stat contract; the cyberia tier's contract
38
+ # check fails without it on PATH.
39
+ - name: Install Go
40
+ run: dnf install -y golang
41
+
37
42
  - name: Install project dependencies
38
43
  run: npm install
39
44
 
@@ -4,7 +4,7 @@ on:
4
4
  workflow_dispatch:
5
5
 
6
6
  env:
7
- UNDERPOST_VERSION: '3.3.73'
7
+ UNDERPOST_VERSION: '3.3.76'
8
8
 
9
9
  jobs:
10
10
  build-and-push:
@@ -4,7 +4,7 @@ on:
4
4
  workflow_dispatch:
5
5
 
6
6
  env:
7
- UNDERPOST_VERSION: '3.3.73'
7
+ UNDERPOST_VERSION: '3.3.76'
8
8
 
9
9
  jobs:
10
10
  build-and-push:
@@ -4,7 +4,7 @@ on:
4
4
  workflow_dispatch:
5
5
 
6
6
  env:
7
- UNDERPOST_VERSION: '3.3.73'
7
+ UNDERPOST_VERSION: '3.3.76'
8
8
 
9
9
  jobs:
10
10
  build-and-push:
@@ -4,7 +4,7 @@ on:
4
4
  workflow_dispatch:
5
5
 
6
6
  env:
7
- UNDERPOST_VERSION: '3.3.73'
7
+ UNDERPOST_VERSION: '3.3.76'
8
8
 
9
9
  jobs:
10
10
  build-and-push:
@@ -4,7 +4,7 @@ on:
4
4
  workflow_dispatch:
5
5
 
6
6
  env:
7
- UNDERPOST_VERSION: '3.3.73'
7
+ UNDERPOST_VERSION: '3.3.76'
8
8
 
9
9
  jobs:
10
10
  build-and-push:
@@ -4,7 +4,7 @@ on:
4
4
  workflow_dispatch:
5
5
 
6
6
  env:
7
- UNDERPOST_VERSION: '3.3.73'
7
+ UNDERPOST_VERSION: '3.3.76'
8
8
 
9
9
  jobs:
10
10
  build-and-push:
@@ -32,6 +32,28 @@ jobs:
32
32
  - name: Install Dependencies
33
33
  run: npm ci
34
34
 
35
+ # The repository declares the engine's runtime dependencies because it runs the engine
36
+ # source it ships; a registry consumer gets them through `underpost` instead. This restores
37
+ # the manifest the package published before that split, and only in the tarball — after
38
+ # `npm ci`, so the lockfile the checkout installs from is the repository's own.
39
+ - name: Restore the published dependency set
40
+ run: |
41
+ node --input-type=module -e '
42
+ import fs from "node:fs";
43
+ import { publishedProductPackageJson, DEPLOY_MANIFEST_INDENT } from "./src/server/build/package.js";
44
+ import { loadDeployCatalog } from "./src/server/build/catalog.js";
45
+ const packageJson = JSON.parse(fs.readFileSync("./package.json", "utf8"));
46
+ const published = publishedProductPackageJson({
47
+ packageJson,
48
+ catalog: await loadDeployCatalog("dd-cyberia"),
49
+ });
50
+ fs.writeFileSync("./package.json", JSON.stringify(published, null, DEPLOY_MANIFEST_INDENT) + "\n", "utf8");
51
+ console.log("published manifest", {
52
+ dependencies: Object.keys(published.dependencies).length,
53
+ devDependencies: Object.keys(published.devDependencies ?? {}).length,
54
+ });
55
+ '
56
+
35
57
  - name: Publish to npm
36
58
  env:
37
59
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
@@ -57,6 +79,28 @@ jobs:
57
79
  - name: Install Dependencies
58
80
  run: npm ci
59
81
 
82
+ # The repository declares the engine's runtime dependencies because it runs the engine
83
+ # source it ships; a registry consumer gets them through `underpost` instead. This restores
84
+ # the manifest the package published before that split, and only in the tarball — after
85
+ # `npm ci`, so the lockfile the checkout installs from is the repository's own.
86
+ - name: Restore the published dependency set
87
+ run: |
88
+ node --input-type=module -e '
89
+ import fs from "node:fs";
90
+ import { publishedProductPackageJson, DEPLOY_MANIFEST_INDENT } from "./src/server/build/package.js";
91
+ import { loadDeployCatalog } from "./src/server/build/catalog.js";
92
+ const packageJson = JSON.parse(fs.readFileSync("./package.json", "utf8"));
93
+ const published = publishedProductPackageJson({
94
+ packageJson,
95
+ catalog: await loadDeployCatalog("dd-cyberia"),
96
+ });
97
+ fs.writeFileSync("./package.json", JSON.stringify(published, null, DEPLOY_MANIFEST_INDENT) + "\n", "utf8");
98
+ console.log("published manifest", {
99
+ dependencies: Object.keys(published.dependencies).length,
100
+ devDependencies: Object.keys(published.devDependencies ?? {}).length,
101
+ });
102
+ '
103
+
60
104
  - name: Publish to npm
61
105
  env:
62
106
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
package/AGENTS.md CHANGED
@@ -1,9 +1,25 @@
1
- ## Commenting policy
1
+ ## Use ASD-STE100 Simplified Technical English
2
+ Write comments in simplified technical English.
2
3
 
3
- - Keep code comments minimal, no redundant or lengthy comment.
4
- - Prefer clear names, small functions, and extracted helpers over explanatory comments.
5
- - Comment only non-obvious intent: invariants, protocol boundaries, security constraints, cross-process contracts, or temporary workarounds.
6
- - Remove stale, redundant, or narrative comments during refactors.
4
+ Key rules:
5
+ - Use the approved words of ASD-STE100 when possible.
6
+ - Use one word for one idea. Do not use two words for the same thing.
7
+ - Write short sentences. Use 20 words or less for instructions.
8
+ - Use active voice. Write "Turn the switch", not "The switch must be turned"
9
+ - Write short paragraphs. Keep one topic in each paragraph.
10
+ - No filler.
11
+
12
+ The goal is easy reading.
13
+
14
+ Report back to the user following the same rules.
15
+
16
+ ## Brief comments — no archaeology
17
+
18
+ Comments state the live invariant in ≤1 line. The reader needs current behavior, nothing more.
19
+
20
+ - Banned content: bug postmortems, "we tried X but Y broke", "previously", "used to", "added because of", historical justification, restoration sagas.
21
+ - Test: "If I delete this comment, will a reader misunderstand the code?" No → delete. Yes → minimum text, present tense.
22
+ - Decision rationale and bug-fix narration go in the commit message that introduced the change — there it's dated and attributable; on the line it's stale weight forever.
7
23
  - Use `TODO:` only for concrete, actionable follow-ups.
8
24
 
9
25
  ## Consistency guardrails
@@ -31,17 +47,50 @@
31
47
  - Prefer small, targeted verification over broad manual validation.
32
48
  - Verify changed behavior at the closest layer that owns it.
33
49
 
34
- ## Cyberia architecture boundaries
50
+ ## Cyberia
35
51
 
36
- - `engine-cyberia` owns content, validation, persistence, gRPC/REST data services, and asset metadata.
37
- - `cyberia-server` owns authoritative real-time simulation and tick processing.
38
- - `cyberia-client` owns rendering, input, prediction, reconciliation, and presentation.
39
- - Keep authoritative simulation out of the client.
40
- - Keep content-authority and persistence concerns out of the Go runtime.
52
+ Cyberia is one product on this platform. Everything in this section applies to
53
+ Cyberia only, not to the rest of the repo.
54
+
55
+ ### Architecture boundaries
56
+
57
+ Three processes:
58
+
59
+ | process | role | talks to |
60
+ |---|---|---|
61
+ | **cyberia-client** | game client, game canvas | game server (WebSocket), engine (REST) |
62
+ | **cyberia-server** | authoritative simulation | client (WebSocket), engine (gRPC + REST) |
63
+ | **engine-cyberia** | external content authority (assets, config data, asset data) | serves both; triggers server hot-reload (gRPC control, REST fallback) |
64
+
65
+ - Keep authoritative simulation out of the cyberia-client.
66
+ - Keep content-authority and persistence concerns out of cyberia-server.
41
67
  - Preserve these boundaries when introducing new flows, APIs, or shared helpers.
42
68
 
69
+ ### This repo owns the Cyberia manifests
70
+
71
+ `manifests/` in cyberia-client and cyberia-server is generated here. Their
72
+ AGENTS.md says an external system writes it. That system is this repo.
73
+
74
+ - `src/cli/run.js` → the `instance-build-manifest` runner reads
75
+ `conf.instances.json` from cyberia-instances and writes
76
+ `<project>/manifests/deployments/<id>-<env>/`.
77
+ - Change the generator or its input. Never the generated file.
78
+ - A manifest bug is a generator bug. Fix it here, then rerun the runner.
79
+
80
+ ### Documentation
81
+
82
+ - `src/client/public/cyberia-docs/` — Cyberia architecture, server, client, CLI, action, quest, economy, whitepaper, and roadmap documentation.
83
+
43
84
  ## Documentation hot paths
44
85
 
45
86
  - `src/client/public/nexodev/docs/references/` — Underpost CLI, cluster, baremetal, DB, cron, image, LXD, SSH, and static-generator references.
46
- - `src/client/public/cyberia-docs/` — Cyberia architecture, server, client, CLI, action, quest, economy, whitepaper, and roadmap documentation.
47
87
  - `engine-private/` is private. Do not assume it exists locally; treat references to it as external/private context.
88
+
89
+ ## One theme per commit
90
+ One commit = one logical theme. No bundling unrelated changes.
91
+
92
+ - Before `git commit`: scan staged diff. ≥2 themes → unstage, commit each theme separately.
93
+ - Each commit stages the minimum file set needed for that theme. No drive-by edits, no "while I'm here" cleanups.
94
+ - Themes that touch a shared file (`src/api.js`, `src/db/mongo/MongooseDB.js`, `src/projects/cyberia/instance-data.js`): land the feature commits first, then one final "wire X through the runtime" glue commit. Don't merge themes just to avoid the glue commit.
95
+ - Commit subject names ONE concern. If you need "and" or "+" to describe it, it's two commits.
96
+
package/CHANGELOG.md CHANGED
@@ -1,6 +1,131 @@
1
1
  # Changelog
2
2
 
3
- ## 2026-09-01
3
+ ## 2026-09-13
4
+
5
+ ### test-unit
6
+
7
+ - Skip cyberia product suites where the tree does not ship them ([93c4f0906](https://github.com/underpostnet/engine/commit/93c4f0906386427982318beb73b7ae5741010ae7))
8
+
9
+ ### client-core
10
+
11
+ - Add top-left hamburger menu button while the top bar is collapsed ([43b00dcd1](https://github.com/underpostnet/engine/commit/43b00dcd1dd6da58cc9513e03ff7f0c88a2bd3a4))
12
+
13
+ ### Cyberia
14
+
15
+ - Fix minified atlas sprite sheet workload and validations ([b64cbf23a](https://github.com/underpostnet/engine/commit/b64cbf23a48229804996c7a95d544f96e64bfbf7))
16
+ - Reuse authored cells when importing an object layer ([117e0e620](https://github.com/underpostnet/engine/commit/117e0e620394f6c4508222c75ee5220f1e9ca0b0))
17
+ - Stage direction frames at one uniform size for webp ([82b4acac6](https://github.com/underpostnet/engine/commit/82b4acac60dff445c02756ff049005adb23cb5e0))
18
+ - Preview items and entity maps by the atlas idle still ([c5fb8ae62](https://github.com/underpostnet/engine/commit/c5fb8ae621eb04e55f8fa399435eb7e513cbd066))
19
+ - Cut an idle-preview still from each atlas render ([0402a1243](https://github.com/underpostnet/engine/commit/0402a12437dab4652be58a085eed5b6fb0fdfc96))
20
+ - Wire signed stats and entity levels through boot payloads ([56000de95](https://github.com/underpostnet/engine/commit/56000de95ccd9120f3fefa874c49a43570a59a90))
21
+ - Add entity levels and progression rules to the game defaults ([208530c45](https://github.com/underpostnet/engine/commit/208530c4568b91c30d478c7daac88457080f0cd1))
22
+ - Sign stat modifiers in the shared contract ([29df5fc49](https://github.com/underpostnet/engine/commit/29df5fc492efa0ab6128e0513a492225e9e5ff31))
23
+ - Preview both atlas renders in the object-layer viewer ([8e8441f6e](https://github.com/underpostnet/engine/commit/8e8441f6e3565db1d050bd05f482d349c7c06c04))
24
+ - Read the audio File fields from the reference registry ([0e3ca2903](https://github.com/underpostnet/engine/commit/0e3ca29035e77c79851f5de1d8423be75e815785))
25
+ - Take the atlas renders when collapsing duplicate layers ([8dcc9ed1a](https://github.com/underpostnet/engine/commit/8dcc9ed1a5c5fc5b9670eb5c56514c2b0e193235))
26
+ - Purge an atlas and its renders through the store ([943e9e4c5](https://github.com/underpostnet/engine/commit/943e9e4c585d26a1e68cf193824df035ef3d7a3f))
27
+ - Add the File reference registry module ([6b7610101](https://github.com/underpostnet/engine/commit/6b76101013de960c4d16b7daab04ebd98b041d9e))
28
+ - Navigate editors by instance code and item id ([d87a56818](https://github.com/underpostnet/engine/commit/d87a568188d01f04b2b083205a9118e282f9742c))
29
+ - Store two atlas renders and refresh the minified one ([73ffe183e](https://github.com/underpostnet/engine/commit/73ffe183e913111f98e30c16117139ecfb9da112))
30
+ - Bind item-pickup and craft audio events ([3b0f1069d](https://github.com/underpostnet/engine/commit/3b0f1069d0134d504572f1270d6865f408670255))
31
+ - Add dropChance to entity-type-default overrides ([5014c7e33](https://github.com/underpostnet/engine/commit/5014c7e338cb58c8c57f5d354dfb858e9df78017))
32
+ - Generate pixel-faithful sprite sheet atlases ([dfba47760](https://github.com/underpostnet/engine/commit/dfba47760f30bc667a83afe7d06f5414c4173404))
33
+ - Resolve object-layer item identity and map previews ([2bd4f88d1](https://github.com/underpostnet/engine/commit/2bd4f88d161689f2b83d3ddf539fd10dc41b4323))
34
+ - Reference entity-type defaults by id and derive skills from content ([f669fa94f](https://github.com/underpostnet/engine/commit/f669fa94f18afa91762ae7662fe443a101cd65a5))
35
+ - Add audio assets and per-map audio configuration ([3ec20cb33](https://github.com/underpostnet/engine/commit/3ec20cb336a320b6167250aac7bca11a629babc9))
36
+ - Fix mentions of wasm-driver.py ([d748d11dc](https://github.com/underpostnet/engine/commit/d748d11dc584a7640742b57e641d3619b18c4d46))
37
+ - Cleared coments ([602f984a0](https://github.com/underpostnet/engine/commit/602f984a0c4d78ab79a9b054d080469b988b4d3f))
38
+
39
+ ### cyberia-client
40
+
41
+ - Surface featured worlds on the portal landing ([90c528be5](https://github.com/underpostnet/engine/commit/90c528be5ab45b906558f85cac3894a6368d6143))
42
+
43
+ ### object-layer-engine
44
+
45
+ - Add axis rulers and cursor readout to the pixel canvas ([cd4955c6b](https://github.com/underpostnet/engine/commit/cd4955c6baec17f58bda37d84bbd387949b50093))
46
+ - Add cut, copy, paste, and scale tools with toolbar UI fixes ([e215b3583](https://github.com/underpostnet/engine/commit/e215b3583fd73557c803b7d321e2054ffb85e620))
47
+
48
+ ### cyberia-docs
49
+
50
+ - Document the idle-preview still ([4344d73b9](https://github.com/underpostnet/engine/commit/4344d73b952cf1baea6f05c2ca0f12e37ffcc205))
51
+ - Document the signed stat contract and progression ([b7a4c3301](https://github.com/underpostnet/engine/commit/b7a4c33018636557ec8a12c921fb6a16fd790868))
52
+ - Reflow the audio option table and emphasis ([8358fe5e8](https://github.com/underpostnet/engine/commit/8358fe5e8c5ee7d5edfca81e6ac2ed7a0215f3f0))
53
+ - Document the ol atlas renders and rebuild options ([888c7bcbf](https://github.com/underpostnet/engine/commit/888c7bcbf58b8c430e2ab13f4b6d68614a974051))
54
+ - Reflow tables and emphasis across the architecture docs ([64c7e3a2d](https://github.com/underpostnet/engine/commit/64c7e3a2d17e77baac1af791be15c03ecce43acc))
55
+ - Document the Data Server URL as a required command-line flag ([28c4a51e4](https://github.com/underpostnet/engine/commit/28c4a51e40d78801dde85af4d10eac0e43f5f805))
56
+ - Document Data Server flags and manifest CLI ([74a09d397](https://github.com/underpostnet/engine/commit/74a09d3977a5c40037ca66b0db5fa4b4d6e15e47))
57
+
58
+ ### cyberia-cli
59
+
60
+ - Carry the idle still through ol minify and backups ([f41f66f52](https://github.com/underpostnet/engine/commit/f41f66f52fc5cf59f7cc5c55f8dbd1e27e2a67c8))
61
+ - Require an explicit source for the ol import commands ([b7c759a2e](https://github.com/underpostnet/engine/commit/b7c759a2ec58e44830a3ce02b6cfd3bfaa68b958))
62
+ - Implement restore OL backup workflow for a single itemId version instance and related document ([293a62db2](https://github.com/underpostnet/engine/commit/293a62db207e55027ed23343ee5c35c14f297c02))
63
+ - Add copy manifests in cyberia-instance repository build workflow ([0f40c2b82](https://github.com/underpostnet/engine/commit/0f40c2b8245ca3e9a7c3e28ea6732228766d820e))
64
+ - Rework sync-src as a bidirectional dry-run mirror ([6f05a7dc6](https://github.com/underpostnet/engine/commit/6f05a7dc6ccfc3a801e6542a0a9321f5de5ab9d9))
65
+ - Integrated the cyberia public assets folders module into the cyberia repo's publish workflows ([7e5c0e0a7](https://github.com/underpostnet/engine/commit/7e5c0e0a729463e981339cb98336399f0925598a))
66
+ - Integrated the cyberia-audio project module into the cyberia repo publish workflows ([07993ee93](https://github.com/underpostnet/engine/commit/07993ee934fd5c8dc781c886d1b6dc0b20819f57))
67
+
68
+ ### engine
69
+
70
+ - Publish per-suite coverage reports as deploy artifacts ([f37be7ba6](https://github.com/underpostnet/engine/commit/f37be7ba6ed145e17713e8ba136c26b25dabc8f9))
71
+ - Resolve instances and maps by their codes ([2daca38b8](https://github.com/underpostnet/engine/commit/2daca38b8a118ed229d672367b43cc32a3c91468))
72
+ - Lower the default request timeouts to ten seconds ([9fbb5c844](https://github.com/underpostnet/engine/commit/9fbb5c8448cc3b6ab86d952f0be611bd26789950))
73
+ - Publish products with the engine runtime dependency set ([8bd9a12a3](https://github.com/underpostnet/engine/commit/8bd9a12a38d419cf475f9d881906d44abd92c51f))
74
+ - Redact adjacent credentials in service error messages ([e8ad83ae6](https://github.com/underpostnet/engine/commit/e8ad83ae65f74f9159df412056a0dbca7113fc5b))
75
+ - Fail downloads that stop short of their declared length ([2cb52c254](https://github.com/underpostnet/engine/commit/2cb52c254ba8d2de89cbc1103807361e45733c36))
76
+ - Replace adm-zip with jszip and shared archive helpers ([14e4857c4](https://github.com/underpostnet/engine/commit/14e4857c4ccc52707c5f08fc686d1e7d25ac2a53))
77
+ - Allow cross-origin reads on CRUD controllers ([7100c5ee4](https://github.com/underpostnet/engine/commit/7100c5ee40aa6a175de1e24eb0f79b485767df6d))
78
+
79
+ ### test
80
+
81
+ - Fix cyberia stat-contract coverall ([faf4f4378](https://github.com/underpostnet/engine/commit/faf4f4378c54bc9fb6ca8e405d08b904a7f023d6))
82
+ - Move sprite atlas and object-layer minify tests to the cyberia tier ([931d98277](https://github.com/underpostnet/engine/commit/931d9827777b49ac01a81b961281ca51c2ff6e0f))
83
+
84
+ ### cli-cyberia
85
+
86
+ - Add the stat balancing policies and contract generation to the CLI ([d6f477f59](https://github.com/underpostnet/engine/commit/d6f477f59ac18cd16cfd42c9e4a61b1d73282953))
87
+ - Route drops and imports through the atlas store purge ([0a103f6e8](https://github.com/underpostnet/engine/commit/0a103f6e8bb2f56946ec9a61e9bfa17194076734))
88
+ - Rework the ol command on the stored atlas renders ([73b5c2fa2](https://github.com/underpostnet/engine/commit/73b5c2fa2362d4415d0f95b3431d5f17a4b7ec07))
89
+ - Sync the cyberia-instances checkout on publish with cmt --switch-repo ([66ffde978](https://github.com/underpostnet/engine/commit/66ffde9787b055f6f2d48866ccff602b6f02873a))
90
+ - Keep CLI-name arguments through the underpost reroute ([e898bf498](https://github.com/underpostnet/engine/commit/e898bf4982e98b3368e784be65abc8aec1c70033))
91
+ - Add ol --minify reprocessing scoped to instances ([9b19bfc1e](https://github.com/underpostnet/engine/commit/9b19bfc1eaf2c93d4f0c7001eca1c64ada5ca9a3))
92
+
93
+ ### docs
94
+
95
+ - Regenerate the CLI references for the storage and bundle options ([4ce71e989](https://github.com/underpostnet/engine/commit/4ce71e989d72343bc4dbe9c11b1325a56fa9a6f7))
96
+
97
+ ### cli
98
+
99
+ - Warn when a container resolves no OCI env overlay ([20dcb3897](https://github.com/underpostnet/engine/commit/20dcb3897a39858d5fddb76c0953193b569cf692))
100
+ - Rework push-bundle and pull-bundle as one client bundle transport ([ead02902b](https://github.com/underpostnet/engine/commit/ead02902be3cb0f05d3ef583824513c984b2a1e5))
101
+ - Rework fs selection around storage manifests ([26471a64b](https://github.com/underpostnet/engine/commit/26471a64bf604473499c9d7c928a28e02020bb37))
102
+ - Resolve instance root path from conf in instance-build-manifest ([fd08a771b](https://github.com/underpostnet/engine/commit/fd08a771bc520023643d95bd37f752a37cc64aa2))
103
+ - Deploy Mongo Express through the cluster command ([4a9d03fbb](https://github.com/underpostnet/engine/commit/4a9d03fbb1c04432b60d609243f35b8dd42b1154))
104
+
105
+ ### cli-wireguard
106
+
107
+ - Install the landed source before any step runs it ([96db68293](https://github.com/underpostnet/engine/commit/96db682935569eb7bbb556d7bc97b3499e936cae))
108
+
109
+ ### deploy
110
+
111
+ - Consolidate deploy scripts on shared constants and bundle sync ([dd9d1d368](https://github.com/underpostnet/engine/commit/dd9d1d3682569ed4f86055ba41613ab2cb06d327))
112
+ - Stream the deploy log verbatim in a new debug mode ([1d41af6c0](https://github.com/underpostnet/engine/commit/1d41af6c01c51d79de468d6002dd42c31b19c20c))
113
+ - Fix git track storage in dd-cyberia sync-deploy ([3ed3c297d](https://github.com/underpostnet/engine/commit/3ed3c297df5172edc2b6c5111a270b8bd522bf2a))
114
+
115
+ ### runtime-cyberia-server
116
+
117
+ - Upgrade go version v1.25 ([2a14dd26a](https://github.com/underpostnet/engine/commit/2a14dd26ac32fb109c7b1b0c833956bca12c70eb))
118
+ - Pass Data Server endpoints to cyberia-server as flags ([c8b4a1b54](https://github.com/underpostnet/engine/commit/c8b4a1b54174954a864301b062caea81c06e9762))
119
+
120
+ ### runtime-cyberia-client
121
+
122
+ - Add CYBERIA_DATA_SERVER_URL on cyberia-client dockerfiles runtime ([99738cc80](https://github.com/underpostnet/engine/commit/99738cc809a56e716d3cb2729c63aa7495033d3c))
123
+
124
+ ### package
125
+
126
+ - Update qs version >= 6.16.0 via overrides ([b7697d52b](https://github.com/underpostnet/engine/commit/b7697d52b87589edbf5ba36f44e7b8db2195cd16))
127
+
128
+ ## New release v:3.3.73 (2026-09-01)
4
129
 
5
130
  ### test
6
131
 
@@ -819,43 +944,3 @@
819
944
  - Add checkbox removeOnClick and enhance ui / ux ([5b557256f](https://github.com/underpostnet/engine/commit/5b557256fd17790913e9628440bd6e125d92ee0d))
820
945
  - Add in client component MapEngineCyberia.js renameFilteredObjectLayerItemId with random factor ([c6519a1c0](https://github.com/underpostnet/engine/commit/c6519a1c0b3dfab9ba7856e3dd03914bd14a846a))
821
946
 
822
- ## New release v:3.2.30 (2026-06-25)
823
-
824
- ### server
825
-
826
- - Add only build client in development mode in normal server run start up ([a332ae458](https://github.com/underpostnet/engine/commit/a332ae458f79458c7911a4a158037ada250d3af6))
827
-
828
- ### cli-start
829
-
830
- - Add start-container-status in start pipeline to insulate readinessProbe monitor server status, prevent external overwritten status ([75f67cf3f](https://github.com/underpostnet/engine/commit/75f67cf3fcbc07716415caac4e67ab91abb05985))
831
-
832
- ### cyberia-cli
833
-
834
- - Enhance cyberia-saga variety theme separate custom prompt of random subject theme ([1945a2553](https://github.com/underpostnet/engine/commit/1945a2553780d1d3b5fa20e40eedcc7d0b1ecd9c))
835
- - Enhance cyberia-saga variety theme handle and prompt seed customization ([a335d3e20](https://github.com/underpostnet/engine/commit/a335d3e20025f8e714ff98fdc27d7895970187b5))
836
-
837
- ### db
838
-
839
- - Improve wait status ready mongo pods in bootstrap methods ([6805e35c2](https://github.com/underpostnet/engine/commit/6805e35c22e43315c14dc9e7457ca3d599877ea8))
840
-
841
- ### cli-env
842
-
843
- - Add keepKeys array options in clean env method ([5b3be0bca](https://github.com/underpostnet/engine/commit/5b3be0bca14a0ccfa64740aff12d2af17a7c29ce))
844
-
845
- ### repository
846
-
847
- - Add getRemoteUrl and switchRemote repository methods in repository cli ([0412b9986](https://github.com/underpostnet/engine/commit/0412b998683a8369833eb363f8c9953744ae1a3a))
848
-
849
- ### deploy
850
-
851
- - Enhance node customization in default deployment and custom instance workloads ([31c6b6d3b](https://github.com/underpostnet/engine/commit/31c6b6d3b397229b0216f82b8aef29b6941e474e))
852
- - Fix node affinity assignment in volume mount factory ([9ec1ef931](https://github.com/underpostnet/engine/commit/9ec1ef9313ac0dbb5993cd3f158d2d01eae7dec5))
853
-
854
- ### cli-run
855
-
856
- - Add flag ssh key path to customize key usage for ssh operations in deployments pipelines ([861cd7373](https://github.com/underpostnet/engine/commit/861cd73734d3442783419af4403bbb8e88711f19))
857
-
858
- ### start-cli
859
-
860
- - Improve underpost container status persistence ([bff2e8f8d](https://github.com/underpostnet/engine/commit/bff2e8f8d65c6a2fe8572fe0bc9c42b9566db918))
861
-
package/CLI-HELP.md CHANGED
@@ -1,6 +1,6 @@
1
1
  ## Underpost CLI
2
2
 
3
- > underpost ci/cd cli v3.3.73
3
+ > underpost ci/cd cli v3.3.76
4
4
 
5
5
  **Usage:** `underpost [options] [command]`
6
6
 
@@ -37,7 +37,7 @@
37
37
  | [`db`](#underpost-db) | Manages database operations with support for MariaDB and MongoDB, including import/export, multi-pod targeting, and Git integration. |
38
38
  | [`metadata`](#underpost-metadata) | Manages cluster metadata operations, including import and export. |
39
39
  | [`cron`](#underpost-cron) | Manages cron jobs: execute jobs directly or generate and apply K8s CronJob manifests. |
40
- | [`fs`](#underpost-fs) | Manages file storage, defaulting to file upload operations. |
40
+ | [`fs`](#underpost-fs) | Uploads, pulls, or deletes Cloudinary assets and synchronizes the selected storage manifest. |
41
41
  | [`monitor`](#underpost-monitor) | Manages health server monitoring, the cluster observability stack, and host dashboards. |
42
42
  | [`event`](#underpost-event) | Dispatches operational events and provisions the monitoring rules that trigger them. |
43
43
  | [`ssh`](#underpost-ssh) | Manages cluster scoped SSH credentials and sessions for remote access to cluster nodes or services. Users are registered in engine-private/deploy/conf.users.json and keys are stored in engine-private/deploy/users/<user>. |
@@ -387,6 +387,7 @@ Manages Kubernetes clusters, defaulting to Kind cluster initialization.
387
387
  | `--service-host <host>` | Set custom host/IP for exposed MongoDB and Valkey clients. |
388
388
  | `--postgresql` | Initializes the cluster with a PostgreSQL statefulset. |
389
389
  | `--mongodb4` | Initializes the cluster with a MongoDB 4.4 service. |
390
+ | `--mongo-express` | Deploys the mongo-express web client for inspecting the MongoDB statefulset databases and collections. Reuses the mongodb-secret credentials, and drops them when the deployed mongod runs without --auth. Combine with --node-port to expose it on the node network. |
390
391
  | `--valkey` | Initializes the cluster with a Valkey service. |
391
392
  | `--ipfs` | Initializes the cluster with an ipfs-cluster statefulset. |
392
393
  | `--contour` | Initializes the cluster with Project Contour base HTTPProxy and Envoy. |
@@ -747,7 +748,7 @@ Manages cron jobs: execute jobs directly or generate and apply K8s CronJob manif
747
748
 
748
749
  ### underpost fs
749
750
 
750
- Manages file storage, defaulting to file upload operations.
751
+ Uploads, pulls, or deletes Cloudinary assets and synchronizes the selected storage manifest.
751
752
 
752
753
  **Usage:** `underpost fs [options] [path]`
753
754
 
@@ -755,20 +756,25 @@ Manages file storage, defaulting to file upload operations.
755
756
 
756
757
  | Argument | Description |
757
758
  | --- | --- |
758
- | `path` | The absolute or relative directory path for file operations. |
759
+ | `path` | Selects one file or all files below a directory. Required unless --tracked is set. |
759
760
 
760
761
  #### Options
761
762
 
762
763
  | Option | Description |
763
764
  | --- | --- |
764
- | `--rm` | Removes the specified file. |
765
- | `--git` | Displays current Git changes related to file storage. |
766
- | `--recursive` | Uploads files recursively from the specified path. |
767
- | `--deploy-id <deploy-id>` | Specifies the deployment configuration ID for file operations. |
768
- | `--pull` | Downloads the specified file. |
765
+ | `--rm` | Deletes selected remote assets and their manifest entries. |
766
+ | `--git` | Restricts filesystem selection to Git-tracked files. Does not change Git state. |
767
+ | `--recursive` | Compatibility option. Directories always select files recursively. |
768
+ | `--tracked` | Selects only manifest entries. An optional path limits their scope. |
769
+ | `--deploy-id <deploy-id>` | Selects the deployment configuration. |
770
+ | `--pull` | Downloads selected manifest assets. Use --tracked to restore missing local files. |
769
771
  | `--omit-unzip` | With --pull, keeps the downloaded .zip file and skips extraction. |
770
- | `--force` | Forces the action, overriding any warnings or conflicts. |
771
- | `--storage-file-path <storage-file-path>` | Specifies a custom file storage path. |
772
+ | `--force` | Overwrites remote uploads or local downloads. Does not change selection. |
773
+ | `--storage-id <sub-id>` | Selects storage.<sub-id>.json. The default is storage.json. |
774
+ | `--key <path>` | Selects one exact manifest key within the path scope and filters. |
775
+ | `--from-key <path>` | Starts an inclusive range in manifest key order. |
776
+ | `--to-key <path>` | Ends an inclusive range. The default start is the first manifest key. |
777
+ | `--key-regex <pattern>` | Filters manifest keys by a JavaScript regular expression. |
772
778
  | `-h, --help` | display help for command |
773
779
 
774
780
  ---
@@ -853,7 +859,7 @@ Dispatches operational events and provisions the monitoring rules that trigger t
853
859
  | `--service-status` | Reports whether the underpost-event unit is active and enabled. |
854
860
  | `--list` | Lists the registered events with their resolved probe targets. |
855
861
  | `--port <port>` | Listening port for --serve and the generated unit (default: 39099). |
856
- | `--cooldown-ms <ms>` | Minimum interval between two dispatches of one event in --serve (default: 300000). |
862
+ | `--cooldown-ms <ms>` | Minimum interval between two dispatches of one event in --serve (default: 10000). |
857
863
  | `--spoke <spoke-id>` | Spoke to remediate when dispatching wireguard-spoke-down by hand; a webhook takes it from the alert labels. |
858
864
  | `--nodes <node-names>` | Comma-separated node documents to act on — hubs for wireguard-server-down, peers for wireguard-spoke-down. Empty covers every registered hub, or every peer of this node hub. |
859
865
  | `--namespace <namespace>` | Kubernetes namespace holding the observability stack. Defaults to "default". |
@@ -1124,6 +1130,7 @@ Runs specified scripts using various runners.
1124
1130
  | `--deploy-id <deploy-id>` | Sets deploy id context for the runner execution. |
1125
1131
  | `--user <user>` | Sets user context for the runner execution. |
1126
1132
  | `--hosts <hosts>` | Comma-separated list of hosts for the runner execution. |
1133
+ | `--split <mb>` | Zip part size in MB for push-bundle, or "none" to upload a single zip. Defaults to 8. |
1127
1134
  | `--instance-id <instance-id>` | Sets instance id context for the runner execution. |
1128
1135
  | `--pid <process-id>` | Sets process id context for the runner execution. |
1129
1136
  | `--timeout-response <duration>` | Sets HTTPProxy per-route response timeout (e.g., "1s", "300ms", "infinity"). |
package/Dockerfile CHANGED
@@ -6,7 +6,7 @@
6
6
  # Stage 1 — builder: clone the private deploy, build it, then scrub secrets.
7
7
  # ---------------------------------------------------------------------------
8
8
  FROM rockylinux/rockylinux:9 AS builder
9
- ARG UNDERPOST_VERSION=3.3.73
9
+ ARG UNDERPOST_VERSION=3.3.76
10
10
  # Pin Node to an exact patch: dnf's nodejs:24 module lags (24.14.1) while
11
11
  # underpost's dependencies require >=24.15.0, so install the official binary.
12
12
  ARG NODE_VERSION=24.15.0
package/Dockerfile.dev CHANGED
@@ -6,7 +6,7 @@
6
6
  # Stage 1 — builder: clone the private deploy, build it, then scrub secrets.
7
7
  # ---------------------------------------------------------------------------
8
8
  FROM rockylinux/rockylinux:9 AS builder
9
- ARG UNDERPOST_VERSION=3.3.73
9
+ ARG UNDERPOST_VERSION=3.3.76
10
10
  # Pin Node to an exact patch: dnf's nodejs:24 module lags (24.14.1) while
11
11
  # underpost's dependencies require >=24.15.0, so install the official binary.
12
12
  ARG NODE_VERSION=24.15.0
package/Dockerfile.test CHANGED
@@ -6,7 +6,7 @@
6
6
  # Stage 1 — builder: clone the private deploy, build it, then scrub secrets.
7
7
  # ---------------------------------------------------------------------------
8
8
  FROM rockylinux/rockylinux:9 AS builder
9
- ARG UNDERPOST_VERSION=3.3.73
9
+ ARG UNDERPOST_VERSION=3.3.76
10
10
  # Pin Node to an exact patch: dnf's nodejs:24 module lags (24.14.1) while
11
11
  # underpost's dependencies require >=24.15.0, so install the official binary.
12
12
  ARG NODE_VERSION=24.15.0
@@ -72,7 +72,7 @@ RUN --mount=type=secret,id=github_token \
72
72
  # --- install deps + env, then replay build-safe itc provisioning ----------
73
73
  npm install; \
74
74
  node bin app load --env development --args deploy-id=dd-cyberia; \
75
- node bin fs --pull --recursive --deploy-id dd-cyberia --storage-file-path './engine-private/conf/dd-cyberia/storage.engine-cyberia.json'; \
75
+ node bin fs --pull --tracked --deploy-id dd-cyberia --storage-id engine-cyberia; \
76
76
  ( cd /home/dd/engine/hardhat && npm install --include=dev ); \
77
77
  ( cd /home/dd/engine && underpost clone underpostnet/cyberia-server ); \
78
78
  \