@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.
- package/dist/native-build-info.json +2 -2
- package/dist/native-build-target.js +50 -14
- package/package.json +15 -15
- package/templates/phaser-game/.agents/skills/use-mpgd-kit/SKILL.md +2 -0
- package/templates/phaser-game/apps/target-devvit/src/server/bridge.ts +10 -0
- package/templates/phaser-game/docs/MPGD_KIT_WORKFLOWS.md +6 -0
|
@@ -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:
|
|
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,
|
|
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[" +
|
|
7512
|
+
path: _path + ".products[" + _index4 + "]",
|
|
7487
7513
|
expected: "ProductCatalogEntry",
|
|
7488
7514
|
value: elem
|
|
7489
|
-
}, _errorFactory)) && _ao1(elem, _path + ".products[" +
|
|
7515
|
+
}, _errorFactory)) && _ao1(elem, _path + ".products[" + _index4 + "]", _exceptionable) || _assertGuard_16._assertGuard(_exceptionable, {
|
|
7490
7516
|
method: "typia.createAssert",
|
|
7491
|
-
path: _path + ".products[" +
|
|
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)) && ("
|
|
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:
|
|
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 && ("
|
|
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:
|
|
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:
|
|
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) && ("
|
|
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:
|
|
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) && ("
|
|
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.
|
|
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.
|
|
62
|
-
"@mpgd/
|
|
63
|
-
"@mpgd/
|
|
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.
|
|
72
|
-
"@mpgd/adapter-browser": "0.9.
|
|
73
|
-
"@mpgd/adapter-capacitor": "0.
|
|
74
|
-
"@mpgd/adapter-
|
|
75
|
-
"@mpgd/adapter-
|
|
76
|
-
"@mpgd/analytics": "0.4.
|
|
77
|
-
"@mpgd/
|
|
78
|
-
"@mpgd/
|
|
79
|
-
"@mpgd/
|
|
80
|
-
"@mpgd/
|
|
81
|
-
"@mpgd/
|
|
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
|
|