@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.
- package/dist/cli.mjs +963 -325
- package/guides/himi-test.md +46 -1
- package/guides/release-notes.md +68 -0
- package/package.json +2 -2
package/guides/himi-test.md
CHANGED
|
@@ -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,
|
package/guides/release-notes.md
CHANGED
|
@@ -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.
|
|
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": "
|
|
66
|
+
"falconPackageHash": "24ab5926849593b42d271f6a38201197b2ff1d7963739f2c0de07525"
|
|
67
67
|
}
|