@wix/himalaya-cli 0.1632.0 → 0.1634.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.
Files changed (95) hide show
  1. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/wix-payments-contract.d.ts +4 -14
  2. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/wix-payments-wire.d.ts +2 -1
  3. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/wix-payments.d.ts +1 -2
  4. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/iap-checkout/src/apple-iap-contract.d.ts +26 -13
  5. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/iap-checkout/src/apple-iap-core.d.ts +0 -2
  6. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/iap-checkout/src/checkout-source.d.ts +3 -10
  7. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/iap-checkout/src/commerce-core.d.ts +0 -2
  8. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/iap-checkout/src/iap-order-backend.d.ts +0 -3
  9. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/iap-checkout/src/iap-verticals/stores.d.ts +2 -2
  10. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/iap-checkout/src/index.d.ts +2 -2
  11. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/loyalty/src/index.d.ts +64 -0
  12. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/members-feed-viewer/src/index.d.ts +10 -6
  13. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/members-v1/src/index.d.ts +36 -0
  14. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/iap-checkout.mjs +13 -45
  15. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/iap.mjs +2 -4
  16. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/screens.mjs +7 -11
  17. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-loyalty.mjs +39 -0
  18. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-members-feed-viewer.mjs +8 -7
  19. package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-members.mjs +29 -0
  20. package/dist/browser-plane/assets.json +166 -0
  21. package/dist/browser-plane/host.html +156 -0
  22. package/dist/browser-plane/package-reader.js +4 -0
  23. package/dist/browser-plane/preview-deferred/368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5.bin +0 -0
  24. package/dist/browser-plane/preview-deferred/37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29.bin +0 -0
  25. package/dist/browser-plane/preview-deferred/4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02.bin +0 -0
  26. package/dist/browser-plane/preview-deferred/521a0e528916d678d7588b2cddf3dadd3bb959a6d62426382f61c77a82017e35.bin +1 -0
  27. package/dist/browser-plane/preview-deferred/62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9.bin +0 -0
  28. package/dist/browser-plane/preview-deferred/642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e.bin +0 -0
  29. package/dist/browser-plane/preview-deferred/97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1.bin +0 -0
  30. package/dist/browser-plane/preview-deferred/a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e.bin +28 -0
  31. package/dist/browser-plane/preview-deferred/bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa.bin +0 -0
  32. package/dist/browser-plane/preview-deferred/c3457ce58c96b65f303fec0ddf5f06733004eaf9e21e62302b155ec63a7765f7.bin +56 -0
  33. package/dist/browser-plane/preview-deferred/d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134.bin +0 -0
  34. package/dist/browser-plane/preview-deferred/dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b.bin +0 -0
  35. package/dist/browser-plane/preview-deferred/dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5.bin +0 -0
  36. package/dist/browser-plane/preview-deferred/ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf.bin +0 -0
  37. package/dist/browser-plane/sw.js +13 -0
  38. package/dist/browser-plane/t5-frame.html +350 -0
  39. package/dist/browser-plane/t5-worker-frame.html +350 -0
  40. package/dist/cli.mjs +6499 -5089
  41. package/dist/preview-assets.generated.bin +0 -0
  42. package/fixtures/wix-canned.json +34 -1
  43. package/guides/getting-started.md +2 -1
  44. package/guides/himi-json-output.md +8 -0
  45. package/guides/himi-skill.md +2 -1
  46. package/guides/iap-screen-adoption.md +4 -4
  47. package/guides/importable-sdks.md +1 -1
  48. package/guides/one-app-section-mappings.md +3 -3
  49. package/guides/one-app-to-himi-app.md +81 -5
  50. package/guides/sdk-reference.json +8862 -4388
  51. package/guides/skill.md +11 -1
  52. package/package.json +3 -3
  53. package/templates/beauty-salon/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  54. package/templates/beauty-salon/tier5-src/himi-store-product/index.ts +1 -1
  55. package/templates/branded-lite/config.ts +7 -0
  56. package/templates/branded-lite/dev/index.ts +3340 -1890
  57. package/templates/branded-lite/himalaya.content.json +3 -0
  58. package/templates/branded-lite/l10n/en.json +8 -4
  59. package/templates/branded-lite/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  60. package/templates/branded-lite/tier5-src/_shared/business-chat-history.ts +4 -1
  61. package/templates/branded-lite/tier5-src/_shared/business-chat-presenter.ts +2 -7
  62. package/templates/branded-lite/tier5-src/_shared/header-badges.ts +1 -1
  63. package/templates/branded-lite/tier5-src/_shared/inbox-rooms.ts +68 -0
  64. package/templates/branded-lite/tier5-src/_shared/loyalty-offerings.ts +73 -0
  65. package/templates/branded-lite/tier5-src/_shared/member-activity.ts +34 -0
  66. package/templates/branded-lite/tier5-src/_shared/member-row-extras.ts +167 -0
  67. package/templates/branded-lite/tier5-src/_shared/notification-target.ts +141 -0
  68. package/templates/branded-lite/tier5-src/_shared/source-badges.ts +6 -4
  69. package/templates/branded-lite/tier5-src/_shared/wix-member-links.ts +114 -0
  70. package/templates/branded-lite/tier5-src/business-chat/index.ts +114 -59
  71. package/templates/branded-lite/tier5-src/himi-branded-lite-inbox/index.ts +83 -0
  72. package/templates/branded-lite/tier5-src/himi-branded-lite-loyalty/earning.ts +148 -0
  73. package/templates/branded-lite/tier5-src/himi-branded-lite-loyalty/index.ts +57 -31
  74. package/templates/branded-lite/tier5-src/himi-branded-lite-loyalty-rewards/index.ts +208 -0
  75. package/templates/branded-lite/tier5-src/himi-branded-lite-notifications/index.ts +62 -7
  76. package/templates/branded-lite/tier5-src/himi-store-product/index.ts +1 -1
  77. package/templates/branded-lite/tier5-src/wix-spaces-members/index.ts +60 -12
  78. package/templates/community-club/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  79. package/templates/events-meetups/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  80. package/templates/gym-fitness/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  81. package/templates/gym-fitness/tier5-src/himi-store-product/index.ts +1 -1
  82. package/templates/nonprofit-cause/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  83. package/templates/podcast-creator/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  84. package/templates/portfolio-creative/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  85. package/templates/portfolio-creative/tier5-src/himi-store-product/index.ts +1 -1
  86. package/templates/restaurant/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  87. package/templates/retail-store/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  88. package/templates/retail-store/tier5-src/himi-store-product/index.ts +1 -1
  89. package/templates/salon-spa/dev/index.ts +112 -70
  90. package/templates/salon-spa/tier5-src/_shared/branded-lite-hosted.ts +1 -0
  91. package/templates/salon-spa/tier5-src/_shared/business-chat-history.ts +4 -1
  92. package/templates/salon-spa/tier5-src/_shared/business-chat-presenter.ts +2 -7
  93. package/templates/salon-spa/tier5-src/_shared/inbox-rooms.ts +68 -0
  94. package/templates/salon-spa/tier5-src/business-chat/index.ts +114 -59
  95. package/templates/yoga-studio/tier5-src/_shared/branded-lite-hosted.ts +1 -0
Binary file
@@ -1230,6 +1230,36 @@
1230
1230
  "count": 2
1231
1231
  }
1232
1232
  },
1233
+ "POST /badges/v4/assignments/query": {
1234
+ "badgeAssignments": [
1235
+ {
1236
+ "id": "asg-0001",
1237
+ "badgeId": "bdg-0001",
1238
+ "memberId": "mem-0001"
1239
+ }
1240
+ ],
1241
+ "pagingMetadata": {
1242
+ "count": 1,
1243
+ "hasNext": false
1244
+ }
1245
+ },
1246
+ "POST https://apps.wix.com/_api/members-one-app/api/members": {
1247
+ "items": [
1248
+ {
1249
+ "id": "mem-0001",
1250
+ "displayName": "Dana R.",
1251
+ "member": {
1252
+ "role": "MEMBER",
1253
+ "online": false,
1254
+ "lastOpenApp": {
1255
+ "amount": 3,
1256
+ "unit": "hour"
1257
+ }
1258
+ }
1259
+ }
1260
+ ],
1261
+ "total": 1
1262
+ },
1233
1263
  "POST /badges/v4/badges/query": {
1234
1264
  "badges": [
1235
1265
  {
@@ -1408,7 +1438,7 @@
1408
1438
  ]
1409
1439
  }
1410
1440
  },
1411
- "POST /members-feed-viewer/v1/members-viewer-feed-notifications/query": {
1441
+ "POST /_api/members-feed-viewer/v1/members-viewer-feed-notifications/query": {
1412
1442
  "viewerFeedNotifications": [
1413
1443
  {
1414
1444
  "id": "ntf-0001",
@@ -2323,5 +2353,8 @@
2323
2353
  "balance": 25
2324
2354
  }
2325
2355
  }
2356
+ },
2357
+ "POST /_api/referral-rewards/v1/referral-rewards/query": {
2358
+ "referralRewards": []
2326
2359
  }
2327
2360
  }
@@ -495,7 +495,8 @@ select the deployed customer target explicitly:
495
495
  ```sh
496
496
  himi login --browser --target wix
497
497
  wix login
498
- # no browser? export WIX_API_KEY, then run himi login --wix --target wix instead of the two lines above
498
+ # no browser here? pipe the owner's held Wix token: printf '%s' "$TOKEN" | himi login --wix --wix-token-stdin --target wix
499
+ # (or export WIX_API_KEY on a server, then himi login --wix --target wix) instead of the two lines above
499
500
  himi dist --app <app> --release <release-id> --site <owned-site-id> \
500
501
  --platform ios,android --signing byo --android-signing qa-keystore --wait --target wix
501
502
  ```
@@ -14,6 +14,12 @@ require those fields. Existing error-only push refusals now also carry `ok: fals
14
14
  Output channels and process exit codes are unchanged. Read JSON failures on both
15
15
  stdout and stderr; progress/warnings are not failure envelopes.
16
16
 
17
+ ## `himi sdk unverified` codes
18
+
19
+ | Code | Meaning |
20
+ | --- | --- |
21
+ | `sdk_verification_unknown` | A cached SDK reference has one or more exports without verification metadata (an older or mixed catalog), so the unverified list cannot be trusted. Refresh the catalog (unpin an older kit first if needed). Exit 2. |
22
+
17
23
  ## `himi store preflight` / `himi store upload` / `himi testflight` config failures
18
24
 
19
25
  | Code | Meaning |
@@ -106,6 +112,7 @@ return an empty array.
106
112
  | `identity_source_unverified` | Collected source hashes or the business display name cannot be verified. Recollect older evidence that did not save business identity. |
107
113
  | `identity_target_unverified` | The technical app slug, target compilation or complete built descriptors are unavailable. |
108
114
  | `literal_slug_visible` | Built display text or the known business-chat identity seed contains the technical slug instead of the collected business identity, without matching exact authored source copy. |
115
+ | `app_name_is_slug` | `config.ts`'s `name` (the launcher label and the screens that show the app name) is still the technical slug, while the built display text has no literal slug to report. The result carries `appName` with a `hint`; `--fix` writes the collected business name into `config.ts` (only a literal equal to the slug is rewritten, never a name the author chose). |
109
116
 
110
117
  The check reads built descriptors, not every possible runtime string. A passing
111
118
  result does not verify dynamic live data, translations, branding images or device
@@ -133,6 +140,7 @@ is a positional screen ID; use `--deep=<value>` to diagnose a nonnumeric depth.
133
140
  | `ux_evidence_unreadable` | The UX evidence artifact cannot be read. |
134
141
  | `lint_errors` | Build/lint validation found errors. |
135
142
  | `depth_budget_exceeded` | A screen or a bound list/grid row template nests deeper, or has more components, than the depth budget (`depth-budget` validator pass), or any of its JSON — props, modifiers, `input`, action `args` — nests past the raw-JSON ceiling of 256 levels. Each `issues[]` entry with `pass: "depth-budget"` carries the JSON `path` of the deepest node (the tree root for a node count, the first value past the ceiling for raw JSON), the `limit` and the `actual` value. Takes precedence over `lint_errors`, and `--force` does not override it: content over the budget overflows the renderer's stack on devices already in the field. Flatten the layout and push again. `himi patch screen` refuses an over-deep raw descriptor with the same code, before any network request, and `himi pack` / `himi template publish` refuse with it even under `--force`. |
143
+ | `placeholder_site_binding` | The app declares `wix_api` and uses the `wix-consumer` auth provider, but its resolved auth still has the scaffold placeholder `clientId` (`YOUR_WIX_CLIENT_ID`) or `siteUrl` (`https://your-site.example.com`), and it is not bound to a source site through the One App identity. Nothing is published: every Wix call would fail. Bind the site (`himi one-app provision` for a One App migration; otherwise a real clientId and siteUrl). `--force` does not override it. |
136
144
  | `one_app_readiness_failed` | Reserved legacy refusal code. One App migration readiness is now advisory: publish and promotion report structured warnings instead. Other independent release checks may still refuse a push. |
137
145
  | `control_token_expired` | The selected control token has expired. |
138
146
  | `app_source_contains_secrets` | Source archiving detected a possible credential. |
@@ -518,7 +518,8 @@ select the deployed customer target explicitly:
518
518
  ```sh
519
519
  himi login --browser --target wix
520
520
  wix login
521
- # no browser? export WIX_API_KEY, then run himi login --wix --target wix instead of the two lines above
521
+ # no browser here? pipe the owner's held Wix token: printf '%s' "$TOKEN" | himi login --wix --wix-token-stdin --target wix
522
+ # (or export WIX_API_KEY on a server, then himi login --wix --target wix) instead of the two lines above
522
523
  himi dist --app <app> --release <release-id> --site <owned-site-id> \
523
524
  --platform ios,android --signing byo --android-signing qa-keystore --wait --target wix
524
525
  ```
@@ -14,7 +14,7 @@ and generated templates. Historical receipts retain their recorded amounts.
14
14
  | `himi-branded-lite-plans` | Pricing Plan ID; `priceLine` | Shared Apple pricing and existing Join action through `pricingPlanOrders`; only one-time unlimited Plans can start Apple checkout |
15
15
  | `wix-spaces-plan-detail` | Pricing Plan ID; `price` | Shared pricing; remains read-only |
16
16
  | `createCheckoutService` / `checkoutScreen` | Pricing Plan ID; `priceLine` | Same shared Plans pricing and purchase; existing options, copy, login destination and factory shape retained |
17
- | `himi-store-product` | Stores product ID; `price` | Shared pricing; physical options/add/save retained. With Stores Apple sales enabled, a mapped digital product without options offers Buy now through the app-owned eCom order; `STORES_ITEM_PAYMENT_ENABLED` selects StartItemPayment instead ([checkout](iap-wix-checkout.md#wix-stores-items-through-startitempayment-off)) |
17
+ | `himi-store-product` | Stores product ID; `price` | Shared pricing; physical options/add/save retained. With Stores Apple sales enabled, a mapped digital product without options offers Buy now through wix-iap StartItemPayment, which places and charges the eCom order server-side ([checkout](iap-wix-checkout.md#wix-stores-items-through-startitempayment)) |
18
18
  | `himi-store-shop` | Stores product ID; price in `subtitle` | Batched visible pricing, including paged results; saved/cache metadata retains the commerce price rather than an Apple offer |
19
19
  | `himi-store-saved` | Stored product ID; `price` | Reprices saved rows through the shared source when shown; no added purchase action |
20
20
  | `himi-branded-lite-home` | Stores product IDs; hero and rail prices | Shared pricing on visible product offers; navigation-only Program cards remain unchanged |
@@ -44,9 +44,9 @@ withdraw the shared checkout's access state; reading existing access never creat
44
44
  The existing Stores adapter reads `paymentStatus: PAID` as granted. That proves payment,
45
45
  not usable delivery of a download or course. It also lacks a verified member-scoped
46
46
  existing-ownership read. Only the product screen installs `storesProductOrders` for sales, while
47
- `storesAppleSalesEnabled()` is true. As shipped, `STORES_APPLE_SALES_ENABLED` is on and
48
- `STORES_ITEM_PAYMENT_ENABLED` is off, so mapped digital products without options use the app-owned
49
- eCom checkout and order before the Apple charge. Live digital fulfillment remains unverified.
47
+ `storesAppleSalesEnabled()` is true. As shipped, `STORES_APPLE_SALES_ENABLED` is on, so mapped digital
48
+ products without options are paid through wix-iap StartItemPayment: the device opens no eCom checkout
49
+ and makes no cashier charge. Live digital fulfillment remains unverified.
50
50
  The cart and list screens do not start Apple sales. A confirmed physical product retains its
51
51
  regular checkout.
52
52
  Unknown product facts, unsupported catalog apps and missing routing fail closed.
@@ -36,7 +36,7 @@ package in one greppable file) or `GET /v1/sdk/<name>` over HTTP; in the CLI,
36
36
  - `@himalaya/hhp` — —
37
37
  - `@himalaya/himi-apps` — Tier-5 typed binding for cross-app open / host queries.
38
38
  - `@himalaya/iap` — Tier-5 typed binding to the platform's in-app-purchase capability.
39
- - `@himalaya/iap-checkout` — @wix/himalaya/iap-checkout — the ONE shared flow that sells a digital Wix item through the App Store, for any screen: a vertical order, its `appleIAP` cashier charge, mobile-apps-wix-iap's payment, the managed StoreKit purchase and the vertical's own access read.
39
+ - `@himalaya/iap-checkout` — @wix/himalaya/iap-checkout — the ONE shared flow that sells a digital Wix item through the App Store, for any screen: mobile-apps-wix-iap's payment, the managed StoreKit purchase and the vertical's own access read.
40
40
  - `@himalaya/keyboard` — Tier-5 typed binding for the platform's keyboard capability.
41
41
  - `@himalaya/kyber-api` — narrow Tier-5 binding for Kyber BO HTTP calls.
42
42
  - `@himalaya/l10n` — synchronous app-catalog copy (SDK foundation; requires host integration).
@@ -159,8 +159,8 @@ carousel placement remain separate gaps; the mappings above stay Partial.
159
159
 
160
160
  | Source sectionDefinitionId | Source viewer component | Himalaya implementation | Placement / reuse | Class | Settings, actions and gaps |
161
161
  | --- | --- | --- | --- | --- | --- |
162
- | `loyalty_status_section` | `loyalty.components.StatusSection` | [himi_loyalty member card](https://github.com/wix-private/himalaya/blob/adf4c8b47fd237307b278a5dbb8198a94b7feb69/apps/himi-branded-lite/dev/index.ts) (`buildLoyalty` points card) + [loyalty worker](https://github.com/wix-private/himalaya/blob/adf4c8b47fd237307b278a5dbb8198a94b7feb69/core/dev-server/tier5-bundles-src/himi-branded-lite-loyalty/index.ts "audience-lint-ok: optional pinned upstream evidence, not a local authoring dependency") | Existing base; adaptation needed | Partial | The member card on `himi_loyalty` reads the signed-in member's balance (`getCurrentMemberLoyaltyAccount`) and, beside it, the tiers program and the claimed coupons; it shows the balance, the tier name, the points-expiry line and `Rewards available (N)` (rewards the balance covers on the member's tier + ACTIVE claimed coupons), each blank when its read fails. Visitors get the sign-in gate. Not carried over: the referral-coupon share of the count (no referral spec in codegen) and the one-app `View` link (the catalog it opens is on the same screen). |
163
- | `loyalty_offering_section` | `loyalty.components.OfferingSection` | [himi_loyalty](https://github.com/wix-private/himalaya/blob/97f1542f2f7d6e8cb7a902b912c87dcaa37e5a67/apps/himi-branded-lite/dev/index.ts) + [rewards worker](https://github.com/wix-private/himalaya/blob/97f1542f2f7d6e8cb7a902b912c87dcaa37e5a67/core/dev-server/tier5-bundles-src/himi-branded-lite-loyalty/index.ts "audience-lint-ok: optional pinned upstream evidence, not a local authoring dependency") | Existing base; adaptation needed | Partial | Reuse program/reward reads and required-points presentation. Preserve offering selection. Member earning/redemption operations are not established by this read-only rewards list. |
162
+ | `loyalty_status_section` | `loyalty.components.StatusSection` | [himi_loyalty member card](https://github.com/wix-private/himalaya/blob/e5d1313654a200084499ec74eb68fa77992d096e/apps/himi-branded-lite/dev/index.ts) (`buildLoyalty` points card) + [loyalty worker](https://github.com/wix-private/himalaya/blob/e5d1313654a200084499ec74eb68fa77992d096e/core/dev-server/tier5-bundles-src/himi-branded-lite-loyalty/index.ts "audience-lint-ok: optional pinned upstream evidence, not a local authoring dependency") | Existing base; adaptation needed | Partial | Member-only points, tier, expiry and the reward count are implemented in the shared screen. The count includes affordable active rewards, active claimed loyalty coupons and active referral coupons; failed reads leave the total unknown. View opens `himi_loyalty_reward`, with current-member eligibility, a confirmation step, coupon redemption and balance refresh. Private fields never hydrate or persist. Source-widget placement still requires adaptation; successful member REST recordings remain required for migration acceptance. |
163
+ | `loyalty_offering_section` | `loyalty.components.OfferingSection` | [himi_loyalty](https://github.com/wix-private/himalaya/blob/e5d1313654a200084499ec74eb68fa77992d096e/apps/himi-branded-lite/dev/index.ts) + [rewards worker](https://github.com/wix-private/himalaya/blob/e5d1313654a200084499ec74eb68fa77992d096e/core/dev-server/tier5-bundles-src/himi-branded-lite-loyalty/index.ts "audience-lint-ok: optional pinned upstream evidence, not a local authoring dependency") | Existing base; adaptation needed | Partial | Shared `himi_loyalty` supports base/custom tier offerings, exact tier configurations, benefit descriptions and Show all after three tier cards. Active birthday rules expose member birthday editing; active social-follow rules expose configured supported HTTPS channels. The published test app has four Loyalty instances with empty settings, and neither definition declares settingsData, so no offering-selection field is inferred. Source-widget placement and source rollout flags still need per-app review; the Himi controls follow active rule/channel configuration. |
164
164
 
165
165
  ### 8. referrals-section-definitions.json
166
166
 
@@ -425,7 +425,7 @@ These rows have reusable code, but their remaining requirements must not disappe
425
425
  - [Photo Albums worker](https://github.com/wix-private/himalaya/blob/97f1542f2f7d6e8cb7a902b912c87dcaa37e5a67/core/dev-server/tier5-bundles-src/wix-spaces-photo-albums/index.ts "audience-lint-ok: optional pinned upstream evidence, not a local authoring dependency") explicitly says no album API is wired and renders an empty state.
426
426
  - [Restaurant basket worker](https://github.com/wix-private/himalaya/blob/97f1542f2f7d6e8cb7a902b912c87dcaa37e5a67/core/dev-server/tier5-bundles-src/wix-spaces-food-orders/index.ts "audience-lint-ok: optional pinned upstream evidence, not a local authoring dependency") explicitly avoids the owner-capable Orders API and supplies no placed-order history.
427
427
  - [Saved products worker](https://github.com/wix-private/himalaya/blob/97f1542f2f7d6e8cb7a902b912c87dcaa37e5a67/core/dev-server/tier5-bundles-src/himi-store-saved/index.ts "audience-lint-ok: optional pinned upstream evidence, not a local authoring dependency") uses device-local saves; it does not establish an account-backed wishlist mapping.
428
- - [Loyalty worker](https://github.com/wix-private/himalaya/blob/97f1542f2f7d6e8cb7a902b912c87dcaa37e5a67/core/dev-server/tier5-bundles-src/himi-branded-lite-loyalty/index.ts "audience-lint-ok: optional pinned upstream evidence, not a local authoring dependency") reads the program and reward catalog, not the current member's points balance.
428
+ - The shared Loyalty worker now includes member status and links to a separate member reward/coupon journey. This does not automatically implement an arbitrary source section placement; keep member credentials and rendered evidence in the migration acceptance record.
429
429
  - [Events detail worker](https://github.com/wix-private/himalaya/blob/97f1542f2f7d6e8cb7a902b912c87dcaa37e5a67/core/dev-server/tier5-bundles-src/himi-events-detail/index.ts "audience-lint-ok: optional pinned upstream evidence, not a local authoring dependency") documents the owner-scoped, best-effort attendee read; it does not supply a full consumer guest list.
430
430
  - [Groups feed worker](https://github.com/wix-private/himalaya/blob/97f1542f2f7d6e8cb7a902b912c87dcaa37e5a67/core/dev-server/tier5-bundles-src/himi-branded-lite-feed/index.ts "audience-lint-ok: optional pinned upstream evidence, not a local authoring dependency") chooses its group internally; it does not accept a fixed source group selection.
431
431
  - [Program detail worker](https://github.com/wix-private/himalaya/blob/97f1542f2f7d6e8cb7a902b912c87dcaa37e5a67/core/dev-server/tier5-bundles-src/himi-branded-lite-program/index.ts "audience-lint-ok: optional pinned upstream evidence, not a local authoring dependency") explicitly identifies the legacy CHALLENGES app ID, supporting the Online Programs family mapping; it does not provide the missing participating-program carousel.
@@ -163,6 +163,7 @@ The CLI's versioned native-widget inventory supplies these rows automatically.
163
163
  | `achievements_carousel_section` | The same Program state/display rules, default limit 5 and page dots. |
164
164
  | `newBlog_postlist_vertical_section`, `newBlog_compact_post_list_vertical_section` | Row display options, unlimited paging or a limited count with See All Posts, and layout. Coverage derives these per placement from the authored settings: see "Generate blog post lists from their settings". |
165
165
  | `events_list_section` | Date badge, Share and the appropriate RSVP/ticket action. |
166
+ | `platform_elements_image_section` | Press behavior. `onPressType: "openAsModal"` opens the image full screen: tap it with the reserved `himi.lightbox` action and `args.images` set to `[{ "url": <the image url>, "alt": <its accessibility label> }]`. `nothing` and a `none` action need no tap. Coverage derives the row per placement from the authored value. |
166
167
  | `platform_general_members_section`, `platform_general_members_section_bp` | Effective member strip and directory journey: totals/search, alphabetical sections, Follow, activity/privacy. Distinguish badge chips from actual viewed-member program progress. |
167
168
  | `file_share_section` | Signed-in-only file/folder section. Preserve access rules, instance settings and View All (`media.openFileShareListScreen`); a media gallery is not File Share. |
168
169
  | `events_guests_section` | Signed-in-only guests for the configured event, preserving the event selector, guest privacy and display settings; an avatar summary is not the full guest list. |
@@ -282,7 +283,10 @@ the same values:
282
283
  - **Row facts.** Every `displayOptions` key set to `true` is shown: `author` (avatar, name and the
283
284
  admin badge), `comments` (comment count), `likes`, `times_viewed`, `post_date`, `reading_time`,
284
285
  `cover_image`. Bind each from the post and its metrics. A row that shows a fixed subset such as
285
- date, views and likes is a gap. A key that is `false` or absent stays hidden.
286
+ date, views and likes is a gap. A key that is `false` or absent stays hidden. Blog v3 `queryPosts` returns no
287
+ view, like or comment counts unless the request asks for `fieldsets: ["METRICS"]` (without it every count reads
288
+ 0), and only the author's `memberId`: resolve the name and photo with `getMember` and show the author only when
289
+ the member resolves. A count the API did not return stays hidden, never 0.
286
290
  - **Unlimited.** `contentSettings.postsPerCategory: "unlimited"` follows the page cursor to the last
287
291
  post. Bind `pagination.cursor` and `pagination.onLoadMore` as described in `himi docs
288
292
  designing-himi-screens`; a fixed first page (for example 20 posts) is not an unlimited list.
@@ -427,7 +431,9 @@ Apply these interpretation rules:
427
431
  It resolves the effective source theme with the reader the source app instance
428
432
  actually uses, then compares the resolved primary, background and content colors,
429
433
  each button's `borderRadius` and `outlineWidth`, and resolved heading/body font families
430
- against the app's `tokens.json`.
434
+ against the app's `tokens.json`. A Branded theme that stores only `primaryColor`
435
+ (no `colors`) is still compared: that value is the app's brand color, so the template's
436
+ default accent fails the check until `--fix` writes it.
431
437
  Hex case and shorthand are normalized; an absent button token is compared with the
432
438
  value the renderer draws (an outline only on `secondary`; a radius of `radius.pill`,
433
439
  else 24), not called a difference. A variant without its own radius must draw the
@@ -504,6 +510,22 @@ Apply these interpretation rules:
504
510
  list then shows no Ended label for a time without an offset, which is correct, and a
505
511
  `business_time_zone_unavailable` warning says so. A re-apply keeps the zone for the same site and
506
512
  drops it for another.
513
+ - **Write the verified values with the CLI.** Run `himi one-app provision --evidence-dir .himi/one-app --content .`
514
+ after scaffolding. From the collected evidence it sets `currency` on `himi_loyalty` and `businessTimeZone` on
515
+ `himi_services`, `himi_service` and `himi_time` (a value it could not verify stays as the template ships it;
516
+ nothing is invented). It writes the business name into `config.ts`'s `name` and over the slug `himi init` baked
517
+ into displayed names (display slots only, never ids or URLs; a name you chose is kept), so the normal flow needs
518
+ no `validate-identity --fix`. It states the bottom bar as native (`navigation.tabBar.presentation: "native"`; an
519
+ explicit `"kit"` is kept; the output's `tabBar` reports `set`, `unchanged` or `absent`). When the collection
520
+ recorded `memberChat: true` (never a guess), it opens the member Inbox from every baked door (the top-bar chat
521
+ action, the drawer's Inbox item, the chat thread's parent and "Back to inbox", the Profile link) if the scaffold
522
+ contains `himi_inbox`; otherwise the output's `chat` says `unverified` and the doors keep opening
523
+ `himi_business_chat`. `himi one-app header-badges` writes the top-bar action, so run provision again after it.
524
+ It also **binds the app to the source site**: the scaffold's `WixConsumerAuthProvider` carries placeholders
525
+ (`YOUR_WIX_CLIENT_ID`, `your-site.example.com`) that make every Wix read fail, so provision writes
526
+ `visitorSource: "one-app"`, the collected `metaSiteId` and `siteUrl` (a real clientId you set is kept;
527
+ `siteBinding` reports `set`, `unchanged`, `unverified` or `absent`). `himi push` refuses a Wix-backed app that
528
+ still has the placeholders (code `placeholder_site_binding`, no `--force`). It is safe to run again.
507
529
  - **Native navigation is the migration target.** Use the shell's native top bar
508
530
  and, for bottom-tab navigation, `navigation.tabBar.presentation: "native"`.
509
531
  Do not recreate the source Detailed header, call `detailedHeader`, or insert a
@@ -536,6 +558,20 @@ Apply these interpretation rules:
536
558
  totals. A collected total is a source snapshot. Only use an injected live
537
559
  count reader when its public, site-bound permission path has been verified.
538
560
  See the screens SDK's downloadable business-contact guide for the full recipe.
561
+ - **Chat opens the Inbox when the source allows member chat.** The source top-bar chat
562
+ button opens a member-to-business room only when the branded app's `inbox.chatType`
563
+ is `MEMBER_TO_BUSINESS`; in every other case, including an app whose config has no
564
+ `inbox` at all, it opens the Inbox: a list of the member's conversations with the
565
+ business and with other members, plus a way to start a new chat with a member.
566
+ `collect` reads that setting from the app's public mobile config, as a Visitor, and
567
+ records it in `inbox-settings.json` (`chatType` and its `source`) and `manifest.json`
568
+ `memberChat`: `true` or `false`, or `null` when it could not be read or the source is
569
+ a free One App (warning `inbox_chat_type_unknown`). Carry it: when `memberChat` is
570
+ `true`, set provisioning `memberChat: true` and point the top-bar chat action at
571
+ `himi_inbox`; every other Inbox entry (tab, drawer, Explore, Profile) follows the same
572
+ flag. When it is `false` or `null` leave `memberChat` unset and keep the top-bar chat
573
+ on `himi_business_chat`. Never turn member chat on from a guess: an owner who limited
574
+ the app to the business must not gain a member chat.
539
575
  - Emit resolved native actions in `navigation.topBarDefault` or a complete
540
576
  per-screen `topBar` override. The shell owns back/menu controls. Per-screen
541
577
  actions support `hiddenPath` when `navigation.topBarDefault.actions` declares
@@ -682,8 +718,9 @@ Apply these interpretation rules:
682
718
  output against the source. A persistent nav worker needs a supported refresh
683
719
  path; a screen-only load, page-row count or foreground push receipt count is
684
720
  insufficient. The source Member notification aggregate is MOBILE/UNSEEN, capped
685
- at100. `countUnseenNotifications({ site: boundMetaSiteId })` reads that aggregate
686
- through the source Member route. It requires the updated native core, rebuilt
721
+ at100. `countUnseenNotifications()` reads that aggregate through the source Member
722
+ route. Name no site: a bound host sends its own, and the multi-tenant Player (no
723
+ bound site) lets the Member credential decide and refuses any named one. It requires the updated native core, rebuilt
687
724
  consuming binaries and published SDK; default web and old binaries remain
688
725
  unavailable for this reader. Never replace that refusal with zero.
689
726
  Chat counts unread rooms, while legacy cart counters can include unsynced local
@@ -1257,6 +1294,24 @@ function call in the literal makes them fail with "expected a `"<screenId>": {`
1257
1294
  authored descriptor". Blank lines and whole-line `//` comments between entries are
1258
1295
  accepted.
1259
1296
 
1297
+ Do not write a generator of your own. `himi one-app generate --evidence-dir .himi/one-app --content .` turns each
1298
+ source page into a screen descriptor from the collected evidence alone: the screen id and title come from the page's
1299
+ source label, and styles, alignment, buttons, images and their tap (`openAsModal` opens full screen), the contact
1300
+ section and the business description are read from the source. A section it has no mapping for is reported with
1301
+ `sections_unmapped` and nothing stands in for it. Data sections use shared modules and recipes
1302
+ (`recipes/*.json`) when the scaffold ships them; the current starter ships none, so today they take the fallback
1303
+ below. A page with such modules gets ONE worker, `tier5-src/page-<screen>/index.ts`, that registers the modules
1304
+ its sections use (blog list, programs carousel, inline events). A page that is only a template vertical (programs list,
1305
+ members, loyalty, shop, groups feed) opens the template's screen, and a groups feed passes the source's own title,
1306
+ "Group list" label and post count. A data section never vanishes: when the shared modules cannot honor its settings
1307
+ (featured-only lists, another post layout, events or groups limited to a chosen set) or its recipe is missing from the
1308
+ scaffold, it keeps its place as the source's title and a "See All" button that opens the page showing that data,
1309
+ and the reason is listed in `gaps`, never approximated as the real list. Only a section with no mapping at all stays
1310
+ in `unmapped`. The first four visible pages become the bottom tabs and the rest the More screen. The output names the
1311
+ published `revision` and `fetchedAt` of the evidence it read, so a migration generated from older evidence shows the
1312
+ old value: run `himi one-app migrate` again to refresh it before the final check. The file it writes is the
1313
+ `--upsert` input below.
1314
+
1260
1315
  So generate descriptors as data and write them with the CLI:
1261
1316
 
1262
1317
  ```sh
@@ -1266,11 +1321,27 @@ himi template screens --upsert --from .himi/one-app/gen/screens.json
1266
1321
  The file is one JSON object, `{ "<screenId>": <ScreenDescriptor>, … }`. Each existing
1267
1322
  id is replaced in place; each new id is added and registered in
1268
1323
  `navigation.linkableScreens`. One invalid entry refuses the batch and restores every
1269
- file. A builder call such as `detailedHeader(...)` written inline in `dev/index.ts`
1324
+ file. A screen that starts with an empty slot (a `Spacer`, a container with no children, an
1325
+ `Image` with no url) is refused: when a source header is dropped, do not leave its place behind,
1326
+ because the slot paints a blank band under the toolbar. A builder call such as `detailedHeader(...)` written inline in `dev/index.ts`
1270
1327
  cannot be inspected: call the builder in your generator and serialize the value it
1271
1328
  returns. Run the generator inside the app (after `npm install`), so
1272
1329
  `@wix/himalaya/screens` resolves to the app's own dependency.
1273
1330
 
1331
+ ### Repoint the template's tab ids
1332
+
1333
+ The template's `navigation.linkableScreens` entries and its home and profile tabs carry its own tab ids (`"home"`,
1334
+ `"profile"`, the vertical tabs). Your `navigation.tabBar` replaces those tabs, so every entry whose `tabId` is not
1335
+ one of yours is a leftover. `himi validate --strict` reports each as `nav-linkable-tab-unknown` and lists your real
1336
+ ids; nothing repoints them, because the right tab depends on where the source shows the screen:
1337
+
1338
+ - a screen the source opens from a tab keeps that tab's id;
1339
+ - a screen reached from the overflow list takes the id of the **More** tab only if you created one; a template with no More tab uses `""`;
1340
+ - a screen with no tab owner takes `""`, the default stack.
1341
+
1342
+ Check `homeScreenId` and any `himi.open` target that still names a template screen (`"home"`, `"profile"`) the same
1343
+ way: it must be a screen your `SCREENS` map defines.
1344
+
1274
1345
  ### Preserve the template features the source exposes
1275
1346
 
1276
1347
  Treat trimming as a source-feature decision, not a list of screens reached during
@@ -1292,6 +1363,11 @@ After applying identity and before claiming completion, run:
1292
1363
  himi one-app validate-identity --evidence-dir .himi/one-app --content . --json
1293
1364
  ```
1294
1365
 
1366
+ `himi init` names a scaffold after its technical slug, and `config.ts`'s `name` is the app's
1367
+ display name (launcher label and the screens that show it). The command also fails with
1368
+ `app_name_is_slug` while that name is still the slug; `--fix` writes the collected business
1369
+ name into it (only a literal equal to the slug is rewritten, never a name you chose).
1370
+
1295
1371
  The command verifies the collected business-name hash, builds the current content,
1296
1372
  and checks emitted screen titles, supported component display fields and the known
1297
1373
  business-chat identity seed for accidental literal slugs. It ignores route IDs,