@mpgd/cli 0.42.0 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  {
2
- "kitGitSha": "f1305441a52052da7938358138fa9d74271e21b1",
2
+ "kitGitSha": "d3c27fbc159af70d78300a87190998c463065f15",
3
3
  "kitDirty": false,
4
- "packageVersion": "0.42.0"
4
+ "packageVersion": "0.43.0"
5
5
  }
@@ -4453,6 +4453,7 @@ import typia2 from "typia";
4453
4453
  import * as _assertGuard_1 from "typia/lib/internal/_assertGuard";
4454
4454
  import * as _accessExpressionAsString_1 from "typia/lib/internal/_accessExpressionAsString";
4455
4455
  import typia from "typia";
4456
+ var defaultCatalogCurrencies = Object.freeze(["coin", "gem"]);
4456
4457
  function resolveProductPlatformId(product, target2) {
4457
4458
  const identifier = readOwnPlatformIdentifier(product.platformProductIds, target2);
4458
4459
  return normalizePlatformIdentifier(identifier);
@@ -7470,25 +7471,50 @@ function canRecoverLock(lockFile) {
7470
7471
  // node_modules/.cache/mpgd-native-build/tools/target/generate-release-manifest.js
7471
7472
  var __typia_transform__accessExpressionAsString4 = _accessExpressionAsString_16._accessExpressionAsString;
7472
7473
  var assertProductCatalog = /* @__PURE__ */ (() => {
7473
- const _ae0 = '({ readonly type: "currency"; readonly currency: "coin" | "gem"; readonly amount: number; } | { readonly type: "entitlement"; readonly entitlement: string; } | { readonly type: "resource"; readonly resource: string & MinLength<1>; readonly amount: number & ExclusiveMinimum<0> & Maximum<1.7976931348623157e+308>; })';
7474
+ const _ae0 = '({ readonly type: "currency"; readonly currency: string & MinLength<1>; readonly amount: number; } | { readonly type: "entitlement"; readonly entitlement: string; } | { readonly type: "resource"; readonly resource: string & MinLength<1>; readonly amount: number & ExclusiveMinimum<0> & Maximum<1.7976931348623157e+308>; })';
7474
7475
  const _ao0 = (input, _path, _exceptionable = true) => ("string" === typeof input.version || _assertGuard_16._assertGuard(_exceptionable, {
7475
7476
  method: "typia.createAssert",
7476
7477
  path: _path + ".version",
7477
7478
  expected: "string",
7478
7479
  value: input.version
7480
+ }, _errorFactory)) && (void 0 === input.currencies || (Array.isArray(input.currencies) || _assertGuard_16._assertGuard(_exceptionable, {
7481
+ method: "typia.createAssert",
7482
+ path: _path + ".currencies",
7483
+ expected: "((ReadonlyArray<string & MinLength<1>> & MinItems<1>) | undefined)",
7484
+ value: input.currencies
7485
+ }, _errorFactory)) && ((1 <= input.currencies.length || _assertGuard_16._assertGuard(_exceptionable, {
7486
+ method: "typia.createAssert",
7487
+ path: _path + ".currencies",
7488
+ expected: "Array<> & MinItems<1>",
7489
+ value: input.currencies
7490
+ }, _errorFactory)) && input.currencies.every((elem, _index3) => "string" === typeof elem && (1 <= elem.length || _assertGuard_16._assertGuard(_exceptionable, {
7491
+ method: "typia.createAssert",
7492
+ path: _path + ".currencies[" + _index3 + "]",
7493
+ expected: "string & MinLength<1>",
7494
+ value: elem
7495
+ }, _errorFactory)) || _assertGuard_16._assertGuard(_exceptionable, {
7496
+ method: "typia.createAssert",
7497
+ path: _path + ".currencies[" + _index3 + "]",
7498
+ expected: "(string & MinLength<1>)",
7499
+ value: elem
7500
+ }, _errorFactory))) || _assertGuard_16._assertGuard(_exceptionable, {
7501
+ method: "typia.createAssert",
7502
+ path: _path + ".currencies",
7503
+ expected: "((ReadonlyArray<string & MinLength<1>> & MinItems<1>) | undefined)",
7504
+ value: input.currencies
7479
7505
  }, _errorFactory)) && ((Array.isArray(input.products) || _assertGuard_16._assertGuard(_exceptionable, {
7480
7506
  method: "typia.createAssert",
7481
7507
  path: _path + ".products",
7482
7508
  expected: "ReadonlyArray<ProductCatalogEntry>",
7483
7509
  value: input.products
7484
- }, _errorFactory)) && input.products.every((elem, _index2) => ("object" === typeof elem && null !== elem || _assertGuard_16._assertGuard(_exceptionable, {
7510
+ }, _errorFactory)) && input.products.every((elem, _index4) => ("object" === typeof elem && null !== elem || _assertGuard_16._assertGuard(_exceptionable, {
7485
7511
  method: "typia.createAssert",
7486
- path: _path + ".products[" + _index2 + "]",
7512
+ path: _path + ".products[" + _index4 + "]",
7487
7513
  expected: "ProductCatalogEntry",
7488
7514
  value: elem
7489
- }, _errorFactory)) && _ao1(elem, _path + ".products[" + _index2 + "]", _exceptionable) || _assertGuard_16._assertGuard(_exceptionable, {
7515
+ }, _errorFactory)) && _ao1(elem, _path + ".products[" + _index4 + "]", _exceptionable) || _assertGuard_16._assertGuard(_exceptionable, {
7490
7516
  method: "typia.createAssert",
7491
- path: _path + ".products[" + _index2 + "]",
7517
+ path: _path + ".products[" + _index4 + "]",
7492
7518
  expected: "ProductCatalogEntry",
7493
7519
  value: elem
7494
7520
  }, _errorFactory)) || _assertGuard_16._assertGuard(_exceptionable, {
@@ -7533,10 +7559,15 @@ var assertProductCatalog = /* @__PURE__ */ (() => {
7533
7559
  path: _path + ".type",
7534
7560
  expected: '"currency"',
7535
7561
  value: input.type
7536
- }, _errorFactory)) && ("coin" === input.currency || "gem" === input.currency || _assertGuard_16._assertGuard(_exceptionable, {
7562
+ }, _errorFactory)) && ("string" === typeof input.currency && (1 <= input.currency.length || _assertGuard_16._assertGuard(_exceptionable, {
7563
+ method: "typia.createAssert",
7564
+ path: _path + ".currency",
7565
+ expected: "string & MinLength<1>",
7566
+ value: input.currency
7567
+ }, _errorFactory)) || _assertGuard_16._assertGuard(_exceptionable, {
7537
7568
  method: "typia.createAssert",
7538
7569
  path: _path + ".currency",
7539
- expected: '("coin" | "gem")',
7570
+ expected: "(string & MinLength<1>)",
7540
7571
  value: input.currency
7541
7572
  }, _errorFactory)) && ("number" === typeof input.amount || _assertGuard_16._assertGuard(_exceptionable, {
7542
7573
  method: "typia.createAssert",
@@ -7612,9 +7643,9 @@ var assertProductCatalog = /* @__PURE__ */ (() => {
7612
7643
  value: input
7613
7644
  }, _errorFactory);
7614
7645
  })();
7615
- const _io0 = (input) => "string" === typeof input.version && (Array.isArray(input.products) && input.products.every((elem) => "object" === typeof elem && null !== elem && _io1(elem)));
7646
+ const _io0 = (input) => "string" === typeof input.version && (void 0 === input.currencies || Array.isArray(input.currencies) && (1 <= input.currencies.length && input.currencies.every((elem) => "string" === typeof elem && 1 <= elem.length))) && (Array.isArray(input.products) && input.products.every((elem) => "object" === typeof elem && null !== elem && _io1(elem)));
7616
7647
  const _io1 = (input) => "string" === typeof input.id && ("consumable" === input.type || "non_consumable" === input.type || "subscription" === input.type) && ("object" === typeof input.grant && null !== input.grant && _iu0(input.grant)) && ("object" === typeof input.platformProductIds && null !== input.platformProductIds && false === Array.isArray(input.platformProductIds) && _io5(input.platformProductIds));
7617
- const _io2 = (input) => "currency" === input.type && ("coin" === input.currency || "gem" === input.currency) && "number" === typeof input.amount;
7648
+ const _io2 = (input) => "currency" === input.type && ("string" === typeof input.currency && 1 <= input.currency.length) && "number" === typeof input.amount;
7618
7649
  const _io3 = (input) => "entitlement" === input.type && "string" === typeof input.entitlement;
7619
7650
  const _io4 = (input) => "resource" === input.type && ("string" === typeof input.resource && 1 <= input.resource.length) && ("number" === typeof input.amount && (0 < input.amount && input.amount <= 17976931348623157e292));
7620
7651
  const _io5 = (input) => Object.keys(input).every((key) => {
@@ -7656,14 +7687,14 @@ var assertProductCatalog = /* @__PURE__ */ (() => {
7656
7687
  var assertAdPlacements = /* @__PURE__ */ (() => {
7657
7688
  const _ip0 = (input) => "number" === typeof input["amount"];
7658
7689
  const _ae0 = '(AdPlacementEntryBase & { readonly type: "banner" | "interstitial"; readonly reward?: never; } | AdPlacementEntryBase & { readonly type: "rewarded"; readonly reward?: AdReward; })';
7659
- const _ae1 = '(undefined | { readonly type: "continue"; readonly amount: number; } | { readonly type: "currency"; readonly amount: number; readonly currency: "coin" | "gem"; })';
7690
+ const _ae1 = '(undefined | { readonly type: "continue"; readonly amount: number; } | { readonly type: "currency"; readonly amount: number; readonly currency: string & MinLength<1>; })';
7660
7691
  const _ap0 = (input, _path, _exceptionable = true) => "number" === typeof input["amount"] || _assertGuard_16._assertGuard(_exceptionable, {
7661
7692
  method: "typia.createAssert",
7662
7693
  path: _path + ".amount",
7663
7694
  expected: "number",
7664
7695
  value: input["amount"]
7665
7696
  }, _errorFactory);
7666
- const _ae2 = '({ readonly type: "continue"; readonly amount: number; } | { readonly type: "currency"; readonly amount: number; readonly currency: "coin" | "gem"; })';
7697
+ const _ae2 = '({ readonly type: "continue"; readonly amount: number; } | { readonly type: "currency"; readonly amount: number; readonly currency: string & MinLength<1>; })';
7667
7698
  const _ao0 = (input, _path, _exceptionable = true) => ("string" === typeof input.version || _assertGuard_16._assertGuard(_exceptionable, {
7668
7699
  method: "typia.createAssert",
7669
7700
  path: _path + ".version",
@@ -7785,10 +7816,15 @@ var assertAdPlacements = /* @__PURE__ */ (() => {
7785
7816
  path: _path + ".type",
7786
7817
  expected: '"currency"',
7787
7818
  value: input.type
7788
- }, _errorFactory)) && _ap0(input, _path, _exceptionable) && ("coin" === input.currency || "gem" === input.currency || _assertGuard_16._assertGuard(_exceptionable, {
7819
+ }, _errorFactory)) && _ap0(input, _path, _exceptionable) && ("string" === typeof input.currency && (1 <= input.currency.length || _assertGuard_16._assertGuard(_exceptionable, {
7789
7820
  method: "typia.createAssert",
7790
7821
  path: _path + ".currency",
7791
- expected: '("coin" | "gem")',
7822
+ expected: "string & MinLength<1>",
7823
+ value: input.currency
7824
+ }, _errorFactory)) || _assertGuard_16._assertGuard(_exceptionable, {
7825
+ method: "typia.createAssert",
7826
+ path: _path + ".currency",
7827
+ expected: "(string & MinLength<1>)",
7792
7828
  value: input.currency
7793
7829
  }, _errorFactory));
7794
7830
  const _ao7 = (input, _path, _exceptionable = true) => _ao2(input, _path, _exceptionable) && (("banner" === input.type || "interstitial" === input.type || _assertGuard_16._assertGuard(_exceptionable, {
@@ -7844,7 +7880,7 @@ var assertAdPlacements = /* @__PURE__ */ (() => {
7844
7880
  return void 0 === value || "string" === typeof value;
7845
7881
  });
7846
7882
  const _io5 = (input) => "continue" === input.type && _ip0(input);
7847
- const _io6 = (input) => "currency" === input.type && _ip0(input) && ("coin" === input.currency || "gem" === input.currency);
7883
+ const _io6 = (input) => "currency" === input.type && _ip0(input) && ("string" === typeof input.currency && 1 <= input.currency.length);
7848
7884
  const _io7 = (input) => _io2(input) && (("banner" === input.type || "interstitial" === input.type) && (null !== input.reward && void 0 === input.reward));
7849
7885
  const _iu0 = (input) => (() => {
7850
7886
  if ("banner" === input.type || "interstitial" === input.type)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mpgd/cli",
3
- "version": "0.42.0",
3
+ "version": "0.43.0",
4
4
  "description": "Gunshi CLI for mpgd-kit starter generation and target workflow orchestration.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -58,9 +58,9 @@
58
58
  "undici": "^7.29.1",
59
59
  "vite": "8.1.3",
60
60
  "yauzl": "3.4.0",
61
- "@mpgd/catalog": "0.8.1",
62
- "@mpgd/target-config": "0.21.1",
63
- "@mpgd/phaser-assets": "0.9.0"
61
+ "@mpgd/catalog": "0.9.0",
62
+ "@mpgd/phaser-assets": "0.9.0",
63
+ "@mpgd/target-config": "0.21.2"
64
64
  },
65
65
  "devDependencies": {
66
66
  "@types/node": "^24.0.0",
@@ -68,17 +68,17 @@
68
68
  "@types/yauzl": "3.4.0",
69
69
  "ttsc": "0.30.4",
70
70
  "typescript": "7.0.2",
71
- "@mpgd/adapter-ait": "0.14.0",
72
- "@mpgd/adapter-browser": "0.9.1",
73
- "@mpgd/adapter-capacitor": "0.7.5",
74
- "@mpgd/adapter-devvit": "0.9.18",
75
- "@mpgd/adapter-verse8": "0.4.4",
76
- "@mpgd/analytics": "0.4.4",
77
- "@mpgd/bridge": "0.11.0",
78
- "@mpgd/game-services": "0.19.1",
79
- "@mpgd/game-runtime": "0.6.1",
80
- "@mpgd/i18n": "0.6.9",
81
- "@mpgd/platform": "0.18.0"
71
+ "@mpgd/adapter-ait": "0.14.1",
72
+ "@mpgd/adapter-browser": "0.9.2",
73
+ "@mpgd/adapter-capacitor": "0.8.0",
74
+ "@mpgd/adapter-verse8": "0.4.5",
75
+ "@mpgd/adapter-devvit": "0.9.19",
76
+ "@mpgd/analytics": "0.4.5",
77
+ "@mpgd/game-runtime": "0.6.2",
78
+ "@mpgd/i18n": "0.6.10",
79
+ "@mpgd/bridge": "0.12.0",
80
+ "@mpgd/platform": "0.19.0",
81
+ "@mpgd/game-services": "0.20.0"
82
82
  },
83
83
  "main": "./dist/index.js",
84
84
  "types": "./dist/index.d.ts",
@@ -22,6 +22,8 @@ enabled targets and the workflow guide as the routing reference.
22
22
  `mpgd.targets.json` for build ownership.
23
23
  - Use the generated icon, localization, analytics, acceptance, and evidence
24
24
  flows instead of creating target-specific copies.
25
+ - Ship stretchable UI art as untrimmed atlas frames with `scale9Borders`, as
26
+ described under Assets and icons in the workflow guide.
25
27
  - For a configured target with a target skill in `agent/game-manifest.json`,
26
28
  read that skill before changing its release flow.
27
29
 
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  bridgeStorageLoadProtocol,
3
3
  createBridgeError,
4
+ createCommerceV2UnavailableBridgeError,
4
5
  type BridgeRequest,
5
6
  type BridgeResponse,
6
7
  type BridgeStorageLoadData,
@@ -196,6 +197,15 @@ export function createDevvitBridgeHandler(
196
197
  case 'storage.save':
197
198
  return saveStorage(input, dependencies, storageKeyNamespace, warn);
198
199
 
200
+ // Commerce v2 providers arrive with the B-phase PRs (B6 for Devvit).
201
+ case 'commerce.v2.getCapabilities':
202
+ case 'commerce.v2.fetchProducts':
203
+ case 'commerce.v2.requestPurchase':
204
+ case 'commerce.v2.getAvailablePurchases':
205
+ case 'commerce.v2.finishTransaction':
206
+ case 'commerce.v2.restorePurchases':
207
+ return createCommerceV2UnavailableBridgeError(input, 'Devvit server bridge');
208
+
199
209
  default:
200
210
  return createBridgeError(
201
211
  input.id,
@@ -28,6 +28,12 @@ capability-disabled fallback where the target cannot support it.
28
28
  and optionally `pnpm icons:inspect`.
29
29
  - Use target icon profiles from `mpgd.targets.json`; do not maintain unrelated
30
30
  hand-copied icon sets.
31
+ - Ship stretchable UI art (panels, buttons, bars) as untrimmed atlas frames
32
+ with `scale9Borders` in the atlas JSON, so `this.add.nineslice(x, y, key,
33
+ frame)` reads the slice insets instead of scenes hard-coding them. mpgd-kit
34
+ does not generate or inspect that art; the optional external
35
+ [slicewright](https://github.com/imjlk/slicewright) tool owns prompts,
36
+ inset detection, stretch checks, and `scale9Borders` output.
31
37
 
32
38
  ### Localization and orientation
33
39