@bitmagic/cli 0.1.83-dev.1 → 0.1.83-dev.3

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 (206) hide show
  1. package/README.md +69 -0
  2. package/assets/skills/publishing-to-steam/SKILL.md +218 -0
  3. package/dist/assets/vxl-summary.d.ts +6 -20
  4. package/dist/assets/vxl-summary.js +9 -100
  5. package/dist/assets/vxl-summary.js.map +1 -1
  6. package/dist/cli.d.ts +1 -0
  7. package/dist/cli.js +2 -0
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands/check.js +5 -0
  10. package/dist/commands/check.js.map +1 -1
  11. package/dist/commands/forge.js +1 -1
  12. package/dist/commands/forge.js.map +1 -1
  13. package/dist/commands/ios.js +88 -136
  14. package/dist/commands/ios.js.map +1 -1
  15. package/dist/commands/steam-build.d.ts +67 -0
  16. package/dist/commands/steam-build.js +286 -0
  17. package/dist/commands/steam-build.js.map +1 -0
  18. package/dist/commands/steam-portal.d.ts +1 -0
  19. package/dist/commands/steam-portal.js +319 -0
  20. package/dist/commands/steam-portal.js.map +1 -0
  21. package/dist/commands/steam-upload.d.ts +37 -0
  22. package/dist/commands/steam-upload.js +174 -0
  23. package/dist/commands/steam-upload.js.map +1 -0
  24. package/dist/commands/steam.d.ts +1 -0
  25. package/dist/commands/steam.js +504 -0
  26. package/dist/commands/steam.js.map +1 -0
  27. package/dist/commands/verify.js +6 -0
  28. package/dist/commands/verify.js.map +1 -1
  29. package/dist/editor/asset-viewer.js +5 -4
  30. package/dist/editor/asset-viewer.js.map +1 -1
  31. package/dist/editor/server.js +1 -1
  32. package/dist/editor/server.js.map +1 -1
  33. package/dist/editor/shell-page.js +3 -3
  34. package/dist/forge/browser-host.d.ts +1 -1
  35. package/dist/forge/browser-host.js +1 -1
  36. package/dist/forge/browser-host.js.map +1 -1
  37. package/dist/ios/native-overrides.d.ts +27 -0
  38. package/dist/ios/native-overrides.js +87 -0
  39. package/dist/ios/native-overrides.js.map +1 -0
  40. package/dist/ios/record-validate.d.ts +1 -33
  41. package/dist/ios/record-validate.js +2 -100
  42. package/dist/ios/record-validate.js.map +1 -1
  43. package/dist/ios/store-bridge.d.ts +26 -0
  44. package/dist/ios/store-bridge.js +224 -0
  45. package/dist/ios/store-bridge.js.map +1 -0
  46. package/dist/ios/storekit-config.d.ts +15 -0
  47. package/dist/ios/storekit-config.js +106 -0
  48. package/dist/ios/storekit-config.js.map +1 -0
  49. package/dist/ios/xcode-template.d.ts +12 -3
  50. package/dist/ios/xcode-template.js +158 -27
  51. package/dist/ios/xcode-template.js.map +1 -1
  52. package/dist/package/collect-urls.d.ts +1 -1
  53. package/dist/package/collect-urls.js +10 -2
  54. package/dist/package/collect-urls.js.map +1 -1
  55. package/dist/package/offline-payload.d.ts +35 -0
  56. package/dist/package/offline-payload.js +142 -0
  57. package/dist/package/offline-payload.js.map +1 -0
  58. package/dist/package/packaged-check.d.ts +39 -0
  59. package/dist/package/packaged-check.js +104 -0
  60. package/dist/package/packaged-check.js.map +1 -0
  61. package/dist/package/transform.d.ts +4 -4
  62. package/dist/package/transform.js +3 -3
  63. package/dist/project/published-three.d.ts +14 -0
  64. package/dist/project/published-three.js +91 -0
  65. package/dist/project/published-three.js.map +1 -0
  66. package/dist/publish/bundle.js +6 -0
  67. package/dist/publish/bundle.js.map +1 -1
  68. package/dist/scaffold/project-files.js +7 -4
  69. package/dist/scaffold/project-files.js.map +1 -1
  70. package/dist/scaffold/project.js +2 -0
  71. package/dist/scaffold/project.js.map +1 -1
  72. package/dist/scaffold/skill-files.js +3 -1
  73. package/dist/scaffold/skill-files.js.map +1 -1
  74. package/dist/scaffold/steam-skill-files.d.ts +2 -0
  75. package/dist/scaffold/steam-skill-files.js +7 -0
  76. package/dist/scaffold/steam-skill-files.js.map +1 -0
  77. package/dist/steam/art-generate.d.ts +55 -0
  78. package/dist/steam/art-generate.js +174 -0
  79. package/dist/steam/art-generate.js.map +1 -0
  80. package/dist/steam/art-render.d.ts +25 -0
  81. package/dist/steam/art-render.js +157 -0
  82. package/dist/steam/art-render.js.map +1 -0
  83. package/dist/steam/art-use.d.ts +20 -0
  84. package/dist/steam/art-use.js +84 -0
  85. package/dist/steam/art-use.js.map +1 -0
  86. package/dist/steam/art.d.ts +98 -0
  87. package/dist/steam/art.js +243 -0
  88. package/dist/steam/art.js.map +1 -0
  89. package/dist/steam/check.d.ts +21 -0
  90. package/dist/steam/check.js +113 -0
  91. package/dist/steam/check.js.map +1 -0
  92. package/dist/steam/config.d.ts +57 -0
  93. package/dist/steam/config.js +145 -0
  94. package/dist/steam/config.js.map +1 -0
  95. package/dist/steam/electron-cache.d.ts +11 -0
  96. package/dist/steam/electron-cache.js +105 -0
  97. package/dist/steam/electron-cache.js.map +1 -0
  98. package/dist/steam/fuses.d.ts +16 -0
  99. package/dist/steam/fuses.js +75 -0
  100. package/dist/steam/fuses.js.map +1 -0
  101. package/dist/steam/icon-files.d.ts +16 -0
  102. package/dist/steam/icon-files.js +70 -0
  103. package/dist/steam/icon-files.js.map +1 -0
  104. package/dist/steam/image-info.d.ts +16 -0
  105. package/dist/steam/image-info.js +89 -0
  106. package/dist/steam/image-info.js.map +1 -0
  107. package/dist/steam/launch-check.d.ts +12 -0
  108. package/dist/steam/launch-check.js +101 -0
  109. package/dist/steam/launch-check.js.map +1 -0
  110. package/dist/steam/media.d.ts +48 -0
  111. package/dist/steam/media.js +155 -0
  112. package/dist/steam/media.js.map +1 -0
  113. package/dist/steam/package-macos.d.ts +52 -0
  114. package/dist/steam/package-macos.js +268 -0
  115. package/dist/steam/package-macos.js.map +1 -0
  116. package/dist/steam/package-windows.d.ts +23 -0
  117. package/dist/steam/package-windows.js +83 -0
  118. package/dist/steam/package-windows.js.map +1 -0
  119. package/dist/steam/paths.d.ts +35 -0
  120. package/dist/steam/paths.js +44 -0
  121. package/dist/steam/paths.js.map +1 -0
  122. package/dist/steam/playtest-shots.d.ts +18 -0
  123. package/dist/steam/playtest-shots.js +83 -0
  124. package/dist/steam/playtest-shots.js.map +1 -0
  125. package/dist/steam/portal-recipes.d.ts +25 -0
  126. package/dist/steam/portal-recipes.js +61 -0
  127. package/dist/steam/portal-recipes.js.map +1 -0
  128. package/dist/steam/portal.d.ts +58 -0
  129. package/dist/steam/portal.js +340 -0
  130. package/dist/steam/portal.js.map +1 -0
  131. package/dist/steam/raster.d.ts +58 -0
  132. package/dist/steam/raster.js +285 -0
  133. package/dist/steam/raster.js.map +1 -0
  134. package/dist/steam/shell-files.d.ts +17 -0
  135. package/dist/steam/shell-files.js +268 -0
  136. package/dist/steam/shell-files.js.map +1 -0
  137. package/dist/steam/specs.d.ts +61 -0
  138. package/dist/steam/specs.js +103 -0
  139. package/dist/steam/specs.js.map +1 -0
  140. package/dist/steam/steampipe.d.ts +46 -0
  141. package/dist/steam/steampipe.js +170 -0
  142. package/dist/steam/steampipe.js.map +1 -0
  143. package/dist/steam/store-copy.d.ts +88 -0
  144. package/dist/steam/store-copy.js +214 -0
  145. package/dist/steam/store-copy.js.map +1 -0
  146. package/dist/steam/tags.d.ts +9 -0
  147. package/dist/steam/tags.js +52 -0
  148. package/dist/steam/tags.js.map +1 -0
  149. package/dist/steam/trailer.d.ts +34 -0
  150. package/dist/steam/trailer.js +141 -0
  151. package/dist/steam/trailer.js.map +1 -0
  152. package/dist/theme/kernel.d.ts +14 -0
  153. package/dist/theme/kernel.js +15 -0
  154. package/dist/theme/kernel.js.map +1 -0
  155. package/dist/theme/theme-io.js +11 -16
  156. package/dist/theme/theme-io.js.map +1 -1
  157. package/dist/vendor/hud-theme/catalog.js +71 -0
  158. package/dist/vendor/hud-theme/engine/hud/ThemeTokens.js +115 -0
  159. package/dist/{theme/theme-color-math.js → vendor/hud-theme/engine/hud/colorMath.js} +13 -14
  160. package/dist/vendor/hud-theme/engine/hud/decorations.js +179 -0
  161. package/dist/vendor/hud-theme/engine/hud/fonts.js +147 -0
  162. package/dist/vendor/hud-theme/engine/hud/presets.js +80 -0
  163. package/dist/vendor/hud-theme/engine/hud/resolveWorldTheme.js +66 -0
  164. package/dist/vendor/hud-theme/engine/hud/themes/bitmagic.js +29 -0
  165. package/dist/vendor/hud-theme/engine/hud/themes/nexus.js +69 -0
  166. package/dist/vendor/hud-theme/engine/hud/themes/racing.js +57 -0
  167. package/dist/vendor/hud-theme/engine/hud/themes/rift-raider.js +63 -0
  168. package/dist/vendor/hud-theme/engine/hud/themes/simulator.js +55 -0
  169. package/dist/vendor/hud-theme/engine/hud/themes/village-keep.js +108 -0
  170. package/dist/vendor/hud-theme/engine/hud/validateTheme.js +535 -0
  171. package/dist/vendor/hud-theme/index.js +26 -0
  172. package/dist/{theme/theme-merge.js → vendor/hud-theme/merge.js} +0 -1
  173. package/dist/{theme/theme-report.js → vendor/hud-theme/report.js} +8 -9
  174. package/dist/{theme/theme-stored.js → vendor/hud-theme/stored.js} +6 -9
  175. package/dist/{theme/theme-validate.js → vendor/hud-theme/validate-strict.js} +102 -164
  176. package/dist/verify/browser.d.ts +11 -0
  177. package/dist/verify/browser.js +222 -155
  178. package/dist/verify/browser.js.map +1 -1
  179. package/dist/verify/categories.d.ts +1 -1
  180. package/dist/verify/categories.js +1 -0
  181. package/dist/verify/categories.js.map +1 -1
  182. package/dist/verify/classify.d.ts +14 -2
  183. package/dist/verify/classify.js +23 -4
  184. package/dist/verify/classify.js.map +1 -1
  185. package/dist/verify/hud-theme.d.ts +19 -14
  186. package/dist/verify/hud-theme.js +23 -17
  187. package/dist/verify/hud-theme.js.map +1 -1
  188. package/dist/verify/mobile-parity.d.ts +1 -1
  189. package/dist/verify/mobile-parity.js +1 -1
  190. package/dist/verify/start.d.ts +3 -2
  191. package/dist/verify/start.js +1 -1
  192. package/dist/verify/start.js.map +1 -1
  193. package/package.json +8 -6
  194. package/dist/theme/hud-theme-catalog.d.ts +0 -235
  195. package/dist/theme/hud-theme-catalog.js +0 -389
  196. package/dist/theme/hud-theme-catalog.js.map +0 -1
  197. package/dist/theme/theme-color-math.d.ts +0 -21
  198. package/dist/theme/theme-color-math.js.map +0 -1
  199. package/dist/theme/theme-merge.d.ts +0 -36
  200. package/dist/theme/theme-merge.js.map +0 -1
  201. package/dist/theme/theme-report.d.ts +0 -28
  202. package/dist/theme/theme-report.js.map +0 -1
  203. package/dist/theme/theme-stored.d.ts +0 -21
  204. package/dist/theme/theme-stored.js.map +0 -1
  205. package/dist/theme/theme-validate.d.ts +0 -41
  206. package/dist/theme/theme-validate.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-copy.js","sourceRoot":"","sources":["../../src/steam/store-copy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function steamTagsCachePath(baseDir?: string): string;
2
+ /** Tag names from the endpoint's `[{tagid, name}]` shape. Pure. */
3
+ export declare function parseTagList(value: unknown): string[] | null;
4
+ /** Every Steam tag, lowercased, or null when the list is unavailable. */
5
+ export declare function loadSteamTags(options?: {
6
+ fetchImpl?: typeof globalThis.fetch;
7
+ cachePath?: string;
8
+ now?: number;
9
+ }): Promise<ReadonlySet<string> | null>;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Steam's own tag list, so `steam check` can refuse a tag Steamworks would not offer. Fetched
3
+ * from the store's public endpoint and cached for a week under `~/.bitmagic/cache/`; offline, the
4
+ * check simply skips tag names rather than failing on a missing network.
5
+ */
6
+ import * as fs from 'fs';
7
+ import * as os from 'os';
8
+ import * as path from 'path';
9
+ import { readJsonFile, writeJsonAtomic } from '../atomic-json.js';
10
+ const TAGS_URL = 'https://store.steampowered.com/tagdata/populartags/english';
11
+ const MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;
12
+ export function steamTagsCachePath(baseDir = path.join(os.homedir(), '.bitmagic')) {
13
+ return path.join(baseDir, 'cache', 'steam-tags.json');
14
+ }
15
+ function lowercasedSet(names) {
16
+ return new Set(names.map((name) => name.toLowerCase()));
17
+ }
18
+ /** Tag names from the endpoint's `[{tagid, name}]` shape. Pure. */
19
+ export function parseTagList(value) {
20
+ if (!Array.isArray(value))
21
+ return null;
22
+ const names = value
23
+ .map((entry) => (typeof entry === 'object' && entry !== null ? entry.name : undefined))
24
+ .filter((name) => typeof name === 'string' && name.length > 0);
25
+ return names.length > 0 ? names : null;
26
+ }
27
+ /** Every Steam tag, lowercased, or null when the list is unavailable. */
28
+ export async function loadSteamTags(options = {}) {
29
+ const cachePath = options.cachePath ?? steamTagsCachePath();
30
+ const now = options.now ?? Date.now();
31
+ const cached = readJsonFile(cachePath);
32
+ const cachedTags = parseTagList(cached?.tags);
33
+ if (cachedTags !== null && typeof cached?.fetchedAt === 'number' && now - cached.fetchedAt < MAX_AGE_MS) {
34
+ return lowercasedSet(cachedTags);
35
+ }
36
+ try {
37
+ const response = await (options.fetchImpl ?? globalThis.fetch)(TAGS_URL, { signal: AbortSignal.timeout(15_000) });
38
+ if (!response.ok)
39
+ throw new Error(`HTTP ${response.status}`);
40
+ const tags = parseTagList(await response.json());
41
+ if (tags === null)
42
+ throw new Error('unexpected shape');
43
+ fs.mkdirSync(path.dirname(cachePath), { recursive: true });
44
+ writeJsonAtomic(cachePath, { fetchedAt: now, tags: tags.map((name) => ({ name })) });
45
+ return lowercasedSet(tags);
46
+ }
47
+ catch {
48
+ // A stale list still beats none.
49
+ return cachedTags !== null ? lowercasedSet(cachedTags) : null;
50
+ }
51
+ }
52
+ //# sourceMappingURL=tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags.js","sourceRoot":"","sources":["../../src/steam/tags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { type VideoProbe } from './media.js';
2
+ export interface TrailerProblem {
3
+ level: 'error' | 'warning';
4
+ message: string;
5
+ }
6
+ /** What Steam would object to in `probe`. Pure. */
7
+ export declare function trailerProblems(probe: VideoProbe, file: string): TrailerProblem[];
8
+ /** The end card: the logo over a darkened frame, an optional tagline and call to action under it. */
9
+ export declare function endCardHtml(options: {
10
+ width: number;
11
+ height: number;
12
+ logoUrl: string;
13
+ tagline?: string;
14
+ cta?: string;
15
+ fontUrl: string | null;
16
+ }): string;
17
+ /** The output frame rate: the source's own when Steam takes it, else the nearer of 30 and 60. */
18
+ export declare function targetFps(fps: number): number;
19
+ export interface SteamTrailerResult {
20
+ file: string;
21
+ probe: VideoProbe;
22
+ problems: TrailerProblem[];
23
+ }
24
+ export declare function makeSteamTrailer(options: {
25
+ video: string;
26
+ out: string;
27
+ endCard: {
28
+ seconds: number;
29
+ logoPng: Buffer;
30
+ tagline?: string;
31
+ cta?: string;
32
+ } | null;
33
+ log: (message: string) => void;
34
+ }): Promise<SteamTrailerResult>;
@@ -0,0 +1,141 @@
1
+ /**
2
+ * `bitmagic steam trailer` — a trailer Steam will accept: at most 1920x1080, 30 or 60 fps, H.264
3
+ * and AAC, a high bit rate, and an end card that ends on the game's logo instead of pointing
4
+ * players at another storefront.
5
+ *
6
+ * Why this exists rather than uploading the `bitmagic trailer` render as is: that render is cut
7
+ * for bitmagic.ai and social, and typically ends on "Play free at bitmagic.ai" with a corner
8
+ * watermark — copy a Steam reviewer flags, and wrong for a paid game. The trailer lane's own cut
9
+ * without its titles is the right source; this adds a Steam end card from the store kit's logo.
10
+ */
11
+ import * as fs from 'fs';
12
+ import * as path from 'path';
13
+ import { fileURLToPath } from 'url';
14
+ import { ensureFfmpeg, runFfmpeg } from '@bitmagic/asset-core/trailer';
15
+ import { CliError } from '../errors.js';
16
+ import { probeVideo } from './media.js';
17
+ import { RasterSession, dataUrlFor } from './raster.js';
18
+ import { TRAILER_RULES } from './specs.js';
19
+ /** What Steam would object to in `probe`. Pure. */
20
+ export function trailerProblems(probe, file) {
21
+ const problems = [];
22
+ const ext = path.extname(file).slice(1).toLowerCase();
23
+ if (!TRAILER_RULES.containers.includes(ext)) {
24
+ problems.push({ level: 'error', message: `.${ext} is not a container Steam takes (mp4, mov, wmv).` });
25
+ }
26
+ if (probe.width > TRAILER_RULES.maxWidth || probe.height > TRAILER_RULES.maxHeight) {
27
+ problems.push({ level: 'error', message: `${probe.width}x${probe.height} is larger than Steam's 1920x1080.` });
28
+ }
29
+ if (probe.width < 1280 || probe.height < 720) {
30
+ problems.push({ level: 'warning', message: `${probe.width}x${probe.height} will look soft on the store page; 1920x1080 is expected.` });
31
+ }
32
+ if (!TRAILER_RULES.frameRates.some((rate) => Math.abs(rate - probe.fps) < 0.05)) {
33
+ problems.push({ level: 'error', message: `${probe.fps} fps; Steam takes 30/29.97 or 60/59.94.` });
34
+ }
35
+ if (probe.bitrateKbps < TRAILER_RULES.minBitrateKbps) {
36
+ problems.push({ level: 'warning', message: `${probe.bitrateKbps} kbit/s; Steam asks for ${TRAILER_RULES.minBitrateKbps}+ so its own transcode stays sharp.` });
37
+ }
38
+ if (probe.videoCodec !== 'h264') {
39
+ problems.push({ level: 'warning', message: `${probe.videoCodec} video; Steam prefers H.264.` });
40
+ }
41
+ if (probe.audioCodec === null) {
42
+ problems.push({ level: 'warning', message: 'No audio track. A silent trailer is allowed but sells far less.' });
43
+ }
44
+ else if (probe.audioCodec !== 'aac') {
45
+ problems.push({ level: 'warning', message: `${probe.audioCodec} audio; Steam prefers AAC.` });
46
+ }
47
+ return problems;
48
+ }
49
+ function bundledFontDataUrl() {
50
+ const file = fileURLToPath(new URL('../../assets/fonts/NotoSans-Bold.ttf', import.meta.url));
51
+ return fs.existsSync(file) ? `data:font/ttf;base64,${fs.readFileSync(file).toString('base64')}` : null;
52
+ }
53
+ function escapeHtml(text) {
54
+ return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
55
+ }
56
+ /** The end card: the logo over a darkened frame, an optional tagline and call to action under it. */
57
+ export function endCardHtml(options) {
58
+ const { width, height } = options;
59
+ const font = options.fontUrl ? `@font-face{font-family:'CardFont';src:url('${options.fontUrl}')}` : '';
60
+ const unit = height / 1080;
61
+ return `<!doctype html><html><head><meta charset="utf-8"><style>
62
+ ${font}
63
+ html,body{margin:0;width:${width}px;height:${height}px;overflow:hidden;background:transparent}
64
+ .shade{position:absolute;inset:0;background:radial-gradient(ellipse at 50% 45%, rgba(0,0,0,0.35) 0%, rgba(0,0,0,0.7) 100%)}
65
+ .stack{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:${Math.round(28 * unit)}px}
66
+ .logo{max-width:${Math.round(width * 0.58)}px;max-height:${Math.round(height * 0.46)}px;filter:drop-shadow(0 ${Math.round(8 * unit)}px ${Math.round(24 * unit)}px rgba(0,0,0,0.6))}
67
+ .tag{font-family:'CardFont','Helvetica Neue',Arial,sans-serif;font-weight:700;color:#fff;font-size:${Math.round(46 * unit)}px;letter-spacing:${(1.5 * unit).toFixed(1)}px;text-shadow:0 ${Math.round(3 * unit)}px ${Math.round(10 * unit)}px rgba(0,0,0,0.8)}
68
+ .cta{font-family:'CardFont','Helvetica Neue',Arial,sans-serif;font-weight:700;color:#111;background:#fff;border-radius:${Math.round(40 * unit)}px;padding:${Math.round(14 * unit)}px ${Math.round(38 * unit)}px;font-size:${Math.round(36 * unit)}px}
69
+ </style></head><body><div class="shade"></div><div class="stack">
70
+ <img class="logo" src="${options.logoUrl}">
71
+ ${options.tagline ? `<div class="tag">${escapeHtml(options.tagline)}</div>` : ''}
72
+ ${options.cta ? `<div class="cta">${escapeHtml(options.cta)}</div>` : ''}
73
+ </div></body></html>`;
74
+ }
75
+ /** The output frame rate: the source's own when Steam takes it, else the nearer of 30 and 60. */
76
+ export function targetFps(fps) {
77
+ const nearest = [...TRAILER_RULES.frameRates].sort((a, b) => Math.abs(a - fps) - Math.abs(b - fps))[0];
78
+ if (Math.abs(nearest - fps) < 0.05)
79
+ return nearest;
80
+ return fps > 45 ? 60 : 30;
81
+ }
82
+ export async function makeSteamTrailer(options) {
83
+ ensureFfmpeg(['ffmpeg', 'ffprobe']);
84
+ if (!fs.existsSync(options.video))
85
+ throw new CliError(`No video at ${options.video}.`);
86
+ const source = await probeVideo(options.video);
87
+ if (source.durationSec <= 0)
88
+ throw new CliError(`${options.video} has no duration ffprobe can read.`);
89
+ fs.mkdirSync(path.dirname(options.out), { recursive: true });
90
+ const scale = Math.min(1, TRAILER_RULES.maxWidth / source.width, TRAILER_RULES.maxHeight / source.height);
91
+ // Even dimensions: yuv420p cannot encode an odd width or height.
92
+ const width = Math.round((source.width * scale) / 2) * 2;
93
+ const height = Math.round((source.height * scale) / 2) * 2;
94
+ const fps = targetFps(source.fps);
95
+ const inputs = ['-i', options.video];
96
+ let filter = `[0:v]scale=${width}:${height}:flags=lanczos,fps=${fps},format=yuv420p[base]`;
97
+ let cardPath = null;
98
+ if (options.endCard !== null) {
99
+ const seconds = Math.min(options.endCard.seconds, source.durationSec);
100
+ const start = Math.max(0, source.durationSec - seconds);
101
+ const session = await RasterSession.open('bitmagic steam trailer');
102
+ try {
103
+ const png = await session.render(endCardHtml({
104
+ width,
105
+ height,
106
+ logoUrl: dataUrlFor(options.endCard.logoPng),
107
+ ...(options.endCard.tagline ? { tagline: options.endCard.tagline } : {}),
108
+ ...(options.endCard.cta ? { cta: options.endCard.cta } : {}),
109
+ fontUrl: bundledFontDataUrl(),
110
+ }), width, height, { transparent: true });
111
+ cardPath = `${options.out}.endcard.png`;
112
+ fs.writeFileSync(cardPath, png);
113
+ }
114
+ finally {
115
+ await session.close();
116
+ }
117
+ inputs.push('-loop', '1', '-t', seconds.toFixed(3), '-i', cardPath);
118
+ filter = `[0:v]scale=${width}:${height}:flags=lanczos,fps=${fps}[v];`
119
+ + `[1:v]format=rgba,fade=t=in:st=0:d=0.7:alpha=1,setpts=PTS+${start.toFixed(3)}/TB[card];`
120
+ + `[v][card]overlay=0:0:eof_action=pass,format=yuv420p[base]`;
121
+ }
122
+ options.log(`Encoding ${width}x${height} at ${fps} fps${options.endCard ? ' with the Steam end card' : ''}…`);
123
+ try {
124
+ await runFfmpeg([
125
+ '-hide_banner', '-loglevel', 'error', '-y', ...inputs,
126
+ '-filter_complex', filter,
127
+ '-map', '[base]', '-map', '0:a?',
128
+ '-c:v', 'libx264', '-profile:v', 'high', '-preset', 'slow', '-crf', '16',
129
+ '-c:a', 'aac', '-b:a', '192k', '-ar', '48000', '-ac', '2',
130
+ '-movflags', '+faststart',
131
+ options.out,
132
+ ]);
133
+ }
134
+ finally {
135
+ if (cardPath !== null)
136
+ fs.rmSync(cardPath, { force: true });
137
+ }
138
+ const probe = await probeVideo(options.out);
139
+ return { file: options.out, probe, problems: trailerProblems(probe, options.out) };
140
+ }
141
+ //# sourceMappingURL=trailer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trailer.js","sourceRoot":"","sources":["../../src/steam/trailer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * The CLI's one door to the HUD theme kernel (`@bitmagic/hud-theme`).
3
+ *
4
+ * Everything theme-related in the CLI imports from here, never from the package directly, so the
5
+ * build has exactly one specifier to bundle. `@bitmagic/hud-theme` is a private workspace package
6
+ * that is never published: `pnpm run build` compiles this file as usual and then
7
+ * `scripts/bundle-hud-theme.mjs` copies the package's dist/ into `dist/vendor/hud-theme/` and points
8
+ * the emitted `dist/theme/kernel.js` at that copy. The published CLI therefore carries its own
9
+ * kernel and never reads one from a project's vendored engine — which can be any version, older or
10
+ * newer than the CLI.
11
+ *
12
+ * In the monorepo (tests, lint, tsx) the specifier resolves to the workspace package as normal.
13
+ */
14
+ export * from '@bitmagic/hud-theme';
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The CLI's one door to the HUD theme kernel (`@bitmagic/hud-theme`).
3
+ *
4
+ * Everything theme-related in the CLI imports from here, never from the package directly, so the
5
+ * build has exactly one specifier to bundle. `@bitmagic/hud-theme` is a private workspace package
6
+ * that is never published: `pnpm run build` compiles this file as usual and then
7
+ * `scripts/bundle-hud-theme.mjs` copies the package's dist/ into `dist/vendor/hud-theme/` and points
8
+ * the emitted `dist/theme/kernel.js` at that copy. The published CLI therefore carries its own
9
+ * kernel and never reads one from a project's vendored engine — which can be any version, older or
10
+ * newer than the CLI.
11
+ *
12
+ * In the monorepo (tests, lint, tsx) the specifier resolves to the workspace package as normal.
13
+ */
14
+ export * from '../vendor/hud-theme/index.js';
15
+ //# sourceMappingURL=kernel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel.js","sourceRoot":"","sources":["../../src/theme/kernel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,cAAc,qBAAqB,CAAC"}
@@ -4,18 +4,13 @@
4
4
  * splits registry from command, so tests exercise the rules without a
5
5
  * filesystem or a citty run.
6
6
  *
7
- * The vocabulary, validator, merge semantics and report come from `src/theme/`,
8
- * a byte-identical mirror of game-play-agent's theme kit (the drift gate in
9
- * game-play-agent/scripts/check-hud-catalog.ts enforces the byte identity
10
- * against both the engine and this copy). Same inputs, same verdicts, same
11
- * report text in both lanes.
7
+ * The vocabulary, validator, merge semantics and report come from the HUD theme
8
+ * kernel (`./kernel.ts`, i.e. `@bitmagic/hud-theme`) — the same package the
9
+ * hosted agent's theme tools import, built from the engine's own theme files.
10
+ * Same inputs, same verdicts, same report text in both lanes.
12
11
  */
13
12
  import { CliError } from '../errors.js';
14
- import { DEFAULT_THEME_TOKENS, HUD_PRESETS, presetTheme, } from './hud-theme-catalog.js';
15
- import { isEngineFatalIssue, suggestClosest, validateThemeStrict } from './theme-validate.js';
16
- import { resolveStoredTheme } from './theme-stored.js';
17
- import { applyMergePatch, deleteAtPath } from './theme-merge.js';
18
- import { buildThemeReport } from './theme-report.js';
13
+ import { DEFAULT_THEME_TOKENS, HUD_PRESET_NAMES, applyMergePatch, buildThemeReport, deleteAtPath, isEngineFatalIssue, presetTheme, resolveStoredTheme, suggestClosest, validateThemeStrict, } from './kernel.js';
19
14
  /** worldProfileData.hud.theme — the ONLY path the engine reads a theme from. */
20
15
  export function readStoredTheme(world) {
21
16
  const profile = world.worldProfileData;
@@ -23,7 +18,7 @@ export function readStoredTheme(world) {
23
18
  ? profile.hud
24
19
  : undefined;
25
20
  const stored = typeof hud === 'object' && hud !== null ? hud.theme : undefined;
26
- // The stored-value→tokens mapping lives in the gated kit (theme-stored.ts),
21
+ // The stored-value→tokens mapping lives in the kernel package (resolveStoredTheme),
27
22
  // shared with the hosted write tool — this wrapper only digs the value out
28
23
  // of the world shape and keeps it for `show`.
29
24
  const resolved = resolveStoredTheme(stored);
@@ -45,12 +40,12 @@ export function parseThemeArgument(raw, readFile) {
45
40
  const text = raw.startsWith('@') ? readFile(raw.slice(1)) : raw;
46
41
  const trimmed = text.trim();
47
42
  if (!trimmed.startsWith('{')) {
48
- if (HUD_PRESETS.includes(trimmed)) {
43
+ if (HUD_PRESET_NAMES.includes(trimmed)) {
49
44
  return { kind: 'preset', name: trimmed };
50
45
  }
51
- const close = suggestClosest(trimmed, HUD_PRESETS);
46
+ const close = suggestClosest(trimmed, HUD_PRESET_NAMES);
52
47
  throw new CliError(`"${trimmed}" is not a preset name, JSON object, @file, or null. `
53
- + `Presets: ${HUD_PRESETS.join(', ')}.${close ? ` Closest match: "${close}".` : ''}`);
48
+ + `Presets: ${HUD_PRESET_NAMES.join(', ')}.${close ? ` Closest match: "${close}".` : ''}`);
54
49
  }
55
50
  let parsed;
56
51
  try {
@@ -151,13 +146,13 @@ export function themeReport(prepared, before) {
151
146
  export function checkStoredTheme(current) {
152
147
  if (current.kind === 'unknown-preset') {
153
148
  const close = typeof current.stored === 'string'
154
- ? suggestClosest(current.stored, HUD_PRESETS)
149
+ ? suggestClosest(current.stored, HUD_PRESET_NAMES)
155
150
  : undefined;
156
151
  return {
157
152
  valid: false,
158
153
  problems: [
159
154
  `hud.theme is "${String(current.stored)}", which is not a preset — the game silently renders the default look.`
160
- + `${close ? ` Closest match: "${close}".` : ''} Presets: ${HUD_PRESETS.join(', ')}.`,
155
+ + `${close ? ` Closest match: "${close}".` : ''} Presets: ${HUD_PRESET_NAMES.join(', ')}.`,
161
156
  ],
162
157
  report: buildThemeReport(current.effective, { baseLabel: current.label }),
163
158
  };
@@ -1 +1 @@
1
- {"version":3,"file":"theme-io.js","sourceRoot":"","sources":["../../src/theme/theme-io.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theme-io.js","sourceRoot":"","sources":["../../src/theme/theme-io.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * The HUD theme catalog as the tools see it: what `get-hud-catalog` returns, what
3
+ * `bitmagic theme` offers, and the vocabulary the strict validator checks against.
4
+ *
5
+ * Nothing here is a copy. Every list and every value is read from the engine's own
6
+ * kernel modules (game/src/engine/hud/), which this package compiles, so a preset,
7
+ * font, decoration, glow key or element class added in the engine reaches the agent
8
+ * and the CLI with no second edit. The only data authored here is tool-facing prose
9
+ * (the icon slot descriptions).
10
+ */
11
+ import { DECORATION_SLOT_KINDS, GLOW_KEYS, HUD_ELEMENT_CLASSES, REQUIRED_THEME_COLOR_KEYS, THEME_COLOR_KEYS, THEME_ICON_KEYS, THEME_SHAPE_KEYS, } from './engine/hud/ThemeTokens.js';
12
+ import { HUD_FONTS } from './engine/hud/fonts.js';
13
+ import { HUD_DECORATIONS } from './engine/hud/decorations.js';
14
+ import { DEFAULT_THEME_DATA, PRESET_NAMES, PRESET_THEME_DATA } from './engine/hud/presets.js';
15
+ export { HUD_FONTS, HUD_DECORATIONS, HUD_ELEMENT_CLASSES };
16
+ /** The five selectable presets, in catalogue order. */
17
+ export const HUD_PRESET_NAMES = PRESET_NAMES;
18
+ export function isHudPresetName(value) {
19
+ return typeof value === 'string' && PRESET_NAMES.includes(value);
20
+ }
21
+ /**
22
+ * Each preset's RAW data, the same shape as an inline theme plus its `evokes` label.
23
+ *
24
+ * This exists because the promoted customization flow — "preset X but with orange
25
+ * accents" — needs the preset's real values to patch. Use `presetTheme(name)` rather
26
+ * than reading this directly: it strips `evokes`, which describes the style rather
27
+ * than rendering it.
28
+ */
29
+ export const HUD_PRESET_THEMES = PRESET_THEME_DATA;
30
+ /**
31
+ * A preset's tokens as a writable inline theme, minus the `evokes` label.
32
+ *
33
+ * The intended patch flow: `const base = presetTheme('nexus')`, apply the user's
34
+ * change, then write the result.
35
+ */
36
+ export function presetTheme(name) {
37
+ const { evokes: _evokes, ...tokens } = PRESET_THEME_DATA[name];
38
+ return structuredClone(tokens);
39
+ }
40
+ /** The one-line mood label per preset — the field an agent picks a preset by. */
41
+ export const HUD_PRESET_INFO = Object.fromEntries(PRESET_NAMES.map((name) => [name, { evokes: PRESET_THEME_DATA[name].evokes }]));
42
+ /**
43
+ * The engine's DEFAULT theme (bitmagic) as raw data — the base a patch applies to
44
+ * when the game has no theme set. Deliberately not among the presets: it is the
45
+ * fallback, not a selectable style.
46
+ */
47
+ export const DEFAULT_THEME_TOKENS = DEFAULT_THEME_DATA;
48
+ /**
49
+ * The curated decorations' SVG source, served through `get-hud-catalog`'s
50
+ * `decorationSvg` input as adaptation reference: an agent authoring a custom inline
51
+ * decoration copies the closest curated one and edits it.
52
+ */
53
+ export const HUD_DECORATION_SVGS = Object.fromEntries(Object.entries(HUD_DECORATIONS).map(([key, entry]) => [key, entry.svg]));
54
+ export const HUD_GLOW_KEYS = GLOW_KEYS;
55
+ export const HUD_SHAPE_TOKENS = THEME_SHAPE_KEYS;
56
+ export const HUD_COLOR_TOKENS = THEME_COLOR_KEYS;
57
+ export const HUD_REQUIRED_COLORS = REQUIRED_THEME_COLOR_KEYS;
58
+ export const HUD_DECORATION_SLOTS = DECORATION_SLOT_KINDS;
59
+ const ICON_DESCRIPTIONS = {
60
+ heart: 'Health label icon (shown next to "HP" on the player health bar). Default: filled heart.',
61
+ mouse: 'Pointer-lock overlay icon ("Click to play" screen). Default: outlined mouse.',
62
+ arrow: 'Movement-key arrow used in the controls overlay. ONE SVG — CSS rotates it for down/left/right. Default: thin chevron pointing up.',
63
+ };
64
+ /**
65
+ * Built-in icon slots a theme can override with custom SVG markup. Each value is
66
+ * inline SVG (≤16kb). SVGs may use `currentColor` so the icon follows the
67
+ * surrounding text colour, or the `__primary__` / `__danger__` / etc. colour tokens
68
+ * that decorations use — the engine substitutes them at apply time.
69
+ */
70
+ export const HUD_ICON_SLOTS = THEME_ICON_KEYS.map((key) => ({ key, description: ICON_DESCRIPTIONS[key] }));
71
+ export const HUD_ICON_KEYS = THEME_ICON_KEYS;
@@ -0,0 +1,115 @@
1
+ // HUD theme tokens: the theme types, and the source of truth for what validateTheme accepts.
2
+ // Authoring rules: engine/CLAUDE.md says option fields are required + use DEFAULT_* constants.
3
+ // Theme JSON has its own validation surface (the schema), so partial-theme inputs are
4
+ // validated separately via validateTheme.ts before being widened into a full theme.
5
+ //
6
+ // Every closed vocabulary is declared ONCE here as a runtime list, and its type is derived
7
+ // from that list. The engine's load-time validator, the strict write-time validator in
8
+ // `@bitmagic/hud-theme` and the agent's catalog tool all read these lists, so a new glow key
9
+ // or element class is one edit. This module and the other DOM-free kernel files (colorMath,
10
+ // fonts, decorations, validateTheme, presets, themes/, resolveWorldTheme) are compiled into
11
+ // that package too, which is why they import nothing outside `engine/hud/` and touch no DOM.
12
+ /** The curated glow keys `shape.glow` accepts. */
13
+ export const GLOW_KEYS = ['aqua', 'pink', 'warm', 'horror-red', 'gold', 'cyan', 'none'];
14
+ export const LABEL_CASES = ['upper', 'normal'];
15
+ export const IMAGE_RENDERINGS = ['auto', 'pixelated'];
16
+ /** The body weights `font.weightBody` accepts. */
17
+ export const FONT_BODY_WEIGHTS = [300, 400, 500, 700];
18
+ /** The heading weights `font.weightHeading` accepts. */
19
+ export const FONT_HEADING_WEIGHTS = [400, 500, 700, 900];
20
+ /** A theme colour: six hex digits with a leading `#`. The one pattern every theme check uses. */
21
+ export const HEX_COLOR = /^#[0-9a-fA-F]{6}$/;
22
+ export function isHexColor(value) {
23
+ return typeof value === 'string' && HEX_COLOR.test(value);
24
+ }
25
+ /** The longest inline SVG a decoration or icon may carry, in characters. */
26
+ export const MAX_INLINE_SVG_LENGTH = 16384;
27
+ /**
28
+ * The allowed range of every numeric token, as `[min, max]`. The load-time validator, the
29
+ * strict write-time validator and the agent's catalog all read this table.
30
+ */
31
+ export const THEME_NUMBER_RANGES = {
32
+ trackingLabel: [0, 4],
33
+ outlineWidth: [0, 3],
34
+ sizeScale: [0.85, 1.3],
35
+ radiusPill: [0, 500],
36
+ radiusCard: [0, 32],
37
+ borderWidth: [0, 6],
38
+ bevel: [0, 1],
39
+ gloss: [0, 1],
40
+ borderSlice: [0, 200],
41
+ };
42
+ export const BORDER_IMAGE_REPEATS = ['stretch', 'repeat', 'round', 'space'];
43
+ export const BACKGROUND_POSITIONS = [
44
+ 'top', 'top-right', 'right', 'bottom-right', 'bottom', 'bottom-left', 'left', 'top-left', 'center',
45
+ ];
46
+ export const BACKGROUND_REPEATS = ['no-repeat', 'repeat', 'repeat-x', 'repeat-y'];
47
+ export const BACKGROUND_SIZE_KEYWORDS = ['cover', 'contain', 'auto'];
48
+ /**
49
+ * An explicit `background-size` tile: two plain lengths, `<n>px|%` each, decimals allowed.
50
+ *
51
+ * Deliberately strict rather than "any CSS length": the value is interpolated straight into a
52
+ * `background-size:` declaration, so anything that passes is CSS the theme author controls. No
53
+ * `calc()`, no `var()`, no semicolons.
54
+ */
55
+ export const BACKGROUND_TILE_SIZE = /^\d{1,4}(?:\.\d{1,2})?(?:px|%) \d{1,4}(?:\.\d{1,2})?(?:px|%)$/;
56
+ /** The HUD element classes a theme can decorate or override per element. */
57
+ export const HUD_ELEMENT_CLASSES = [
58
+ 'progressBar',
59
+ 'healthBar',
60
+ 'counter',
61
+ 'iconText',
62
+ 'timer',
63
+ 'toast',
64
+ 'controls',
65
+ 'reticle',
66
+ // The touch layer: joystick + on-screen action buttons. Every game must be
67
+ // mobile-playable, and this is the surface that used to be unreachable by
68
+ // theming. The base CSS already derives the stick from --hud-color-text and
69
+ // the buttons from --hud-color-primary/danger/warning, so a per-element
70
+ // colors override restyles the whole layer with no dedicated tokens.
71
+ 'mobileControls',
72
+ ];
73
+ // Key lists for the interfaces above. Each is built from a Record over the interface's keys, so
74
+ // a field added to the interface without reaching its list (or the reverse) fails to compile.
75
+ const COLOR_KEY_SET = {
76
+ primary: true, danger: true, warning: true, success: true, background: true,
77
+ surface: true, text: true, textMuted: true, outline: true,
78
+ };
79
+ const SHAPE_KEY_SET = {
80
+ radiusPill: true, radiusCard: true, glow: true, imageRendering: true,
81
+ borderWidth: true, bevel: true, gloss: true, glowColor: true,
82
+ };
83
+ const DECORATION_SLOT_SET = {
84
+ borderImage: true, backdrop: true, decorationBefore: true, decorationAfter: true,
85
+ };
86
+ const ICON_KEY_SET = { heart: true, mouse: true, arrow: true };
87
+ /** Every colour token a theme may set. */
88
+ export const THEME_COLOR_KEYS = Object.keys(COLOR_KEY_SET);
89
+ /** The colour tokens a full theme must set; the rest fall back. */
90
+ export const REQUIRED_THEME_COLOR_KEYS = [
91
+ 'primary', 'danger', 'background', 'surface', 'text',
92
+ ];
93
+ /** Every shape token a theme may set. */
94
+ export const THEME_SHAPE_KEYS = Object.keys(SHAPE_KEY_SET);
95
+ /** The decoration slots every element class has. */
96
+ export const DECORATION_SLOT_KINDS = Object.keys(DECORATION_SLOT_SET);
97
+ /** The built-in icons a theme can replace. */
98
+ export const THEME_ICON_KEYS = Object.keys(ICON_KEY_SET);
99
+ export const DEFAULT_THEME_FONT = {
100
+ key: 'red-hat-display',
101
+ case: 'upper',
102
+ weightBody: 400,
103
+ weightHeading: 700,
104
+ trackingLabel: 1.4,
105
+ outlineWidth: 0,
106
+ };
107
+ export const DEFAULT_THEME_SHAPE = {
108
+ radiusPill: 500,
109
+ radiusCard: 8,
110
+ glow: 'aqua',
111
+ imageRendering: 'auto',
112
+ borderWidth: 0,
113
+ bevel: 0,
114
+ gloss: 0,
115
+ };