@wix/himalaya-cli 0.807.0 → 0.809.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.
@@ -107,6 +107,10 @@ Only **unambiguous** defects, so a green run stays worth trusting:
107
107
  | `no-request-issued` | **warning** | A worker that uses the Wix transport but never fetches — "the screen loaded with sample data." A warning: a conditional or tap-triggered fetch is legitimate. |
108
108
  | `native-decode-failed` | error | Under `--native`, the real Swift/Kotlin decoder rejected the baked descriptor bytes (one bad enum blanks the whole screen on device). |
109
109
  | `journey-failed` | error | A `himi-test.json` journey named an action the screen lacks, threw, or never rendered its `expectText`. |
110
+ | `inverse-pair-diverges` | **warning** | An action and the action that undoes it do not return to the state the boot settled on — `add` then `remove` leaving a different list, or a counter it forgot to put back. |
111
+ | `refresh-not-idempotent` | **warning** | `refresh` from a fresh boot settles somewhere other than the boot did, on identical data — usually a refresh that appends instead of replacing. |
112
+ | `list-shrank-on-load-more` | **warning** | A "load more" returned FEWER rows than before it ran: the new page replaced the list instead of extending it. |
113
+ | `list-grew-on-filter` | **warning** | A filter, search or sort made a list longer. Narrowing can reorder or remove, never add. |
110
114
 
111
115
  **Deliberately never reported:** an empty collection · an `error` state (often the correct
112
116
  answer to empty input) · a `null` optional · whether a nav target *exists* (approximating
@@ -230,7 +234,7 @@ chromium`. Fully hermetic; `--no-shots` opts out.
230
234
  - **JSON is the default off a TTY.** `--json` forces it; a pipe or redirect gets it anyway.
231
235
  - **The envelope** carries `himiReport: 1`, `findings[]` (stable `id`s), `gaps[]` (the ledger), `artifacts[]`,
232
236
  and `evidence { runId, gitDiffHash }`; the legacy fields (`failures`, `warnings`, `crawled`, …) ride along.
233
- - **`himi-test.json` `skip[]`** suppresses a known-benign finding: `{ "screen"?, "action"?, "component"?, "reason" }`;
237
+ - **`himi-test.json` `skip[]`** suppresses a known-benign finding: `{ "screen"?, "action"?, "component"?, "invariant"?, "reason" }`;
234
238
  `reason` is mandatory and every suppression is echoed as a `suppressed` ledger gap.
235
239
  - **A `functions/` dir short-circuits the crawl**: `himi test` on a content dir with local HTTP functions
236
240
  invokes each function once with a canned input instead of crawling screens.
@@ -241,6 +245,47 @@ chromium`. Fully hermetic; `--no-shots` opts out.
241
245
  map would name the wrong lines — `no-source` — no source dir exists for the bundle at all — or
242
246
  `build-failed` — the source no longer compiles. Each pairs with the exact rebuild command.
243
247
 
248
+ ## Relations — catching a wrong value without knowing the right one
249
+
250
+ Every invariant above says *this can never be right*: a throw, a stuck skeleton, a `NaN`, a raw
251
+ binding token on screen. That leaves the bug whose output is **plausible** — reading the wrong key
252
+ off a response gives you an empty list that looks like an empty list; a total that is off by one is
253
+ still a perfectly good number. Nothing that checks a single settled state can tell those from
254
+ correct ones, which is why the measured catch rate for that class is zero.
255
+
256
+ Relations compare **two** settled states of the same screen and assert what must hold for any
257
+ correct reducer, whatever the right answer happens to be:
258
+
259
+ | Relation | What must hold |
260
+ |---|---|
261
+ | **Inverse round trip** | An action and the DISTINCT action that undoes it return to where the boot started: `add` then `remove`, `archive` then `unarchive`. A toggle applied twice is deliberately NOT checked — real toggles raise toasts, reorder lists and randomise, so the round trip fired on correct code 18 times across the corpus. |
262
+ | **Refresh idempotence** | `refresh` from a fresh boot, on identical data, lands where the boot landed. |
263
+ | **Monotonic paging** | "Load more" never returns fewer rows than it started with. |
264
+ | **Narrowing filters** | A filter, search or sort never makes a list longer. |
265
+
266
+ They need **nothing authored**: the pairs and verbs are read from the action names your descriptor
267
+ already declares, and each relation replays only the handful of paths it needs, from a fresh boot,
268
+ so they run by default without `--deep`.
269
+
270
+ All four are **warnings**, deliberately. A divergence is strong evidence of a bug rather than proof
271
+ of one — a worker may legitimately reshape state in a way the relation cannot model — and a run
272
+ where the crawl cannot replay a path faithfully skips the relation instead of guessing.
273
+
274
+ Comparison ignores what legitimately differs between two correct states: freshly minted ids,
275
+ `*At` timestamps, `_`-prefixed counters. Everything else is compared, including list contents and
276
+ totals, because those are exactly where the plausible-wrong-value bugs live.
277
+
278
+ To silence one deliberately, `skip[]` takes an `invariant` — a relation is a property of the whole
279
+ app, so one entry covers it everywhere rather than one per screen:
280
+
281
+ ```json
282
+ { "skip": [{ "invariant": "refresh-not-idempotent", "reason": "the activity feed appends by design" }] }
283
+ ```
284
+
285
+ The report always carries `relations.checked`. **Zero is the informative case**: it means no screen
286
+ declared a pair, refresh or filter the axis could use, so "no relational warnings" does not mean
287
+ the relations held.
288
+
244
289
  ## The contract — why a green run is trustworthy
245
290
 
246
291
  - **Measured, not asserted.** A committed kill-rate benchmark records what fraction of planted,
@@ -14,8 +14,60 @@ areas, always in the same order, so you can skim for the one you care about.
14
14
 
15
15
  ---
16
16
 
17
+ ## 2026-09-17
18
+
19
+ ### Getting started & the CLI
20
+
21
+ - **`npm i -g @wix/himalaya-cli@latest` now works from anywhere — no `--registry`, no VPN.** The CLI
22
+ publishes to public npm, so the install that used to answer `E404` off the Wix network simply
23
+ works, and the guides, the skill documents and the starter-template READMEs dropped the
24
+ internal-registry flag with it. The optional `@wix/himalaya` editor-types umbrella is still
25
+ internal — and you do not need it to build, because the CLI ships the runtime it compiles
26
+ against. (#2429)
27
+
28
+ ### Logic, data & SDKs
29
+
30
+ - **Both `@himalaya/*` and `@wix/himalaya/*` build off-repo, and the guides now say which one your
31
+ editor resolves.** `himi init` scaffolds `@wix/himalaya/*`, which is the spelling `tsc` and your
32
+ editor resolve from the installed umbrella; the CLI accepts either and resolves both from the
33
+ runtime staged inside it. `himi docs wix-api-usage` carries the full mapping. (#2434)
34
+
35
+ ### Validate & test
36
+
37
+ - **`himi validate` now reports the four `MOBILE-UX.md` markers** that `himi ux audit --strict`
38
+ requires. The authoring guidance tells you to replace the scaffold's boilerplate with your own
39
+ content, which silently drops those strings — and nothing said so until `--strict` printed seven
40
+ errors long after the rewrite. (#2433)
41
+
42
+ ### Preview, push & release
43
+
44
+ - **Your app's source now travels with its release.** `himi push` archives the content package
45
+ alongside the built output and `himi pull` brings it back editable, so an app authored in a
46
+ container that no longer exists can be changed again instead of only re-run. (#2430)
47
+ - **`himi validate` and `himi push` now warn when your app declares no web surface.** `"web": true`
48
+ in `platforms.json` gates the public `/app/a/<slug>` mount and the desktop surface, and without it
49
+ that URL refused the app with nothing explaining why. The warning names the key, the consequence
50
+ and the fix — and never fails `--strict`, because a phone-only app is a legitimate app. The
51
+ authoring preview `/preview/a/<app>` was never gated by that flag and renders either way. (#2432)
52
+
53
+ ### Shipping binaries
54
+
55
+ - **`himi icon generate` no longer guesses a business when you have not named one.** With no glyph
56
+ specified it picked one of 37 marks by hashing your app name, and all 37 are business metaphors —
57
+ so the fallback confidently claimed "mail" or "music" on the one surface that is not
58
+ over-the-air. It now draws `emblem`, a neutral frame, and per-app distinctness stays in the tile
59
+ colour. `book` and `graduation` are new, so an education app has a mark of its own, and
60
+ `himi icon glyphs` names the default. (#2431)
61
+
17
62
  ## 2026-09-16
18
63
 
64
+ ### Authoring screens
65
+
66
+ - **The component reference now says that `modifiers.boxShadow.color` names a token.** It is not the
67
+ same field as `shadows.<name>.color` in your design tokens, which holds a literal `#RRGGBB` — so a
68
+ validator error about that one ("the native runtimes parse only `#RRGGBB`") is not the reference
69
+ contradicting itself. (#2421)
70
+
19
71
  ### Logic, data & SDKs
20
72
 
21
73
  - **A web sign-in that cannot succeed now says so, instead of resolving as a visitor.**
@@ -24,6 +76,14 @@ areas, always in the same order, so you can skim for the one you care about.
24
76
  app with correct four-state handling had nothing to branch on and its sign-in button appeared
25
77
  dead. On a hosted preview that was the only outcome available. It also reports the real member
26
78
  when the bridge already holds one, rather than a fixed demo user. (#2388)
79
+ - **`himi cms query` / `create` / `seed` load a TypeScript `config.ts` like every other command.**
80
+ They imported it with bare Node, which cannot read TypeScript, cannot resolve the config's
81
+ `@himalaya/*` imports, and takes a relative `./x.js` specifier literally instead of finding
82
+ `./x.ts` — so the CMS verbs failed on configs the rest of the CLI reads fine. (#2398)
83
+ - **A collection id is capped at 36 characters**, and the cap was documented nowhere. It is a Wix
84
+ Data limit and it applies to `himi_<appSlug>_<name>` in full, so a long app id and a long
85
+ collection name together overflow it; `himi docs cms-collections` now spells out the
86
+ arithmetic. (#2421)
27
87
 
28
88
  ### Validate & test
29
89
 
@@ -48,17 +108,25 @@ areas, always in the same order, so you can skim for the one you care about.
48
108
  reading the wrong key off a response or a total off by one, are caught 0 of 34 times. A green run
49
109
  means no invariant fired, not that your app is correct. The figure comes from that benchmark, not
50
110
  from your own runs — `himi test` output is unchanged. (#2402)
111
+ - **`himi validate` no longer answers `ok: true` after a CMS check that never ran.** An unloadable
112
+ `config.ts` was swallowed, the CMS pass returned nothing, and validation reported success. (#2389)
51
113
 
52
114
  ### Preview, push & release
53
115
 
54
116
  - The hosted preview can frame a tablet in **landscape**. If your app ships on an iPad mounted
55
117
  sideways at a front desk, you can now review it in the orientation it runs in. (#2390)
118
+ - **An app whose releases are all drafts now shows itself instead of looking broken.** The owner
119
+ grid painted a dark slab with a letter in it and `/preview/?app=<slug>` said "No published
120
+ release" — for 94 of the 150 apps on the production owner account, whose bytes were in the store
121
+ the whole time. (#2396)
56
122
 
57
123
  ### Branded Lite & Owner Lite
58
124
 
59
125
  - **Owner Lite has analytics.** A highlights screen with six live measures, a range selector, and a
60
126
  per-measure detail screen, all reading your site's real figures — with a Home KPI that agrees with
61
127
  them. Nothing on these screens is a placeholder number. (#2387)
128
+ - **Owner Lite has Aria, the real Wix assistant**, as a screen — the same chat service behind the
129
+ Wix Owner app's Aria tab, with each turn painted while it runs. (#2408)
62
130
 
63
131
  ## 2026-09-15
64
132
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/himalaya-cli",
3
- "version": "0.807.0",
3
+ "version": "0.809.0",
4
4
  "type": "module",
5
5
  "description": "himi — the Himalaya authoring CLI. Build a Tier-5 content package on your own machine, push it to the production serve as a draft, preview it on web + Himi Player, and read worker logs back — the remote dev loop. Wraps @himalaya/serve-cli for transport.",
6
6
  "keywords": [
@@ -63,5 +63,5 @@
63
63
  "artifactId": "himalaya-cli"
64
64
  }
65
65
  },
66
- "falconPackageHash": "169f524111b79b2ca18f438146b740e80b6318c877f00a2f5f3970b5"
66
+ "falconPackageHash": "24ab5926849593b42d271f6a38201197b2ff1d7963739f2c0de07525"
67
67
  }