@wix/himalaya-cli 0.1038.0 → 0.1040.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 +1950 -1220
- package/dist/preview-assets.generated.bin +0 -0
- package/guides/designing-himi-screens.md +3 -2
- package/guides/getting-started.md +3 -2
- package/guides/headless-loop.md +4 -3
- package/guides/himi-skill.md +381 -0
- package/guides/index.json +4 -0
- package/guides/recipe-dynamic-list.md +3 -3
- package/guides/recipe-form-submit.md +3 -3
- package/guides/recipe-onboarding.md +3 -3
- package/guides/recipe-search.md +3 -3
- package/guides/skill.md +122 -0
- package/guides/wix-site-to-himi-app.md +4 -2
- package/package.json +2 -2
- package/templates/beauty-salon/dev/index.ts +58 -22
- package/templates/beauty-salon/tier5-src/himi-booking-time/index.ts +144 -29
- package/templates/beauty-salon-owner/config.ts +1 -1
- package/templates/beauty-salon-owner/dev/index.ts +507 -35
- package/templates/beauty-salon-owner/tier5-src/_shared/aria-chat.ts +237 -4
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-aria/index.ts +28 -0
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-drawer/index.ts +34 -48
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-drawer/logic.ts +102 -0
- package/templates/branded-lite/dev/index.ts +61 -25
- package/templates/branded-lite/tier5-src/himi-booking-time/index.ts +144 -29
- package/templates/community-club-owner/config.ts +1 -1
- package/templates/community-club-owner/dev/index.ts +507 -35
- package/templates/community-club-owner/tier5-src/_shared/aria-chat.ts +237 -4
- package/templates/community-club-owner/tier5-src/himi-owner-lite-aria/index.ts +28 -0
- package/templates/community-club-owner/tier5-src/himi-owner-lite-drawer/index.ts +34 -48
- package/templates/community-club-owner/tier5-src/himi-owner-lite-drawer/logic.ts +102 -0
- package/templates/events-meetups-owner/config.ts +1 -1
- package/templates/events-meetups-owner/dev/index.ts +507 -35
- package/templates/events-meetups-owner/tier5-src/_shared/aria-chat.ts +237 -4
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-aria/index.ts +28 -0
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-drawer/index.ts +34 -48
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-drawer/logic.ts +102 -0
- package/templates/gym-fitness/dev/index.ts +58 -22
- package/templates/gym-fitness/tier5-src/himi-booking-time/index.ts +144 -29
- package/templates/gym-fitness-owner/config.ts +1 -1
- package/templates/gym-fitness-owner/dev/index.ts +507 -35
- package/templates/gym-fitness-owner/tier5-src/_shared/aria-chat.ts +237 -4
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-aria/index.ts +28 -0
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-drawer/index.ts +34 -48
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-drawer/logic.ts +102 -0
- package/templates/nonprofit-cause-owner/config.ts +1 -1
- package/templates/nonprofit-cause-owner/dev/index.ts +507 -35
- package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-chat.ts +237 -4
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-aria/index.ts +28 -0
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-drawer/index.ts +34 -48
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-drawer/logic.ts +102 -0
- package/templates/owner-lite/config.ts +1 -1
- package/templates/owner-lite/dev/index.ts +507 -35
- package/templates/owner-lite/tier5-src/_shared/aria-chat.ts +237 -4
- package/templates/owner-lite/tier5-src/himi-owner-lite-aria/index.ts +28 -0
- package/templates/owner-lite/tier5-src/himi-owner-lite-drawer/index.ts +34 -48
- package/templates/owner-lite/tier5-src/himi-owner-lite-drawer/logic.ts +102 -0
- package/templates/podcast-creator-owner/config.ts +1 -1
- package/templates/podcast-creator-owner/dev/index.ts +507 -35
- package/templates/podcast-creator-owner/tier5-src/_shared/aria-chat.ts +237 -4
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-aria/index.ts +28 -0
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-drawer/index.ts +34 -48
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-drawer/logic.ts +102 -0
- package/templates/portfolio-creative-owner/config.ts +1 -1
- package/templates/portfolio-creative-owner/dev/index.ts +507 -35
- package/templates/portfolio-creative-owner/tier5-src/_shared/aria-chat.ts +237 -4
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-aria/index.ts +28 -0
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-drawer/index.ts +34 -48
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-drawer/logic.ts +102 -0
- package/templates/restaurant-owner/config.ts +1 -1
- package/templates/restaurant-owner/dev/index.ts +507 -35
- package/templates/restaurant-owner/tier5-src/_shared/aria-chat.ts +237 -4
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-aria/index.ts +28 -0
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-drawer/index.ts +34 -48
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-drawer/logic.ts +102 -0
- package/templates/retail-store/dev/index.ts +1 -1
- package/templates/retail-store-owner/config.ts +1 -1
- package/templates/retail-store-owner/dev/index.ts +507 -35
- package/templates/retail-store-owner/tier5-src/_shared/aria-chat.ts +237 -4
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-aria/index.ts +28 -0
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-drawer/index.ts +34 -48
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-drawer/logic.ts +102 -0
- package/templates/yoga-studio/dev/index.ts +58 -22
- package/templates/yoga-studio/tier5-src/himi-booking-time/index.ts +144 -29
- package/templates/yoga-studio-owner/config.ts +1 -1
- package/templates/yoga-studio-owner/dev/index.ts +507 -35
- package/templates/yoga-studio-owner/tier5-src/_shared/aria-chat.ts +237 -4
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-aria/index.ts +28 -0
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-drawer/index.ts +34 -48
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-drawer/logic.ts +102 -0
|
Binary file
|
|
@@ -14,8 +14,9 @@ prescriptive layer that sits **above** the wiring guide: `himi docs tier-5-add-a
|
|
|
14
14
|
> This is the *composition* layer: how to build a screen well out of the vocabulary. The *values*
|
|
15
15
|
> layer — swapping a look-and-feel kit, editing token values — is a separate job; they compose.
|
|
16
16
|
>
|
|
17
|
-
> **Want a worked example?** `himi
|
|
18
|
-
>
|
|
17
|
+
> **Want a worked example?** `himi init` (and `himi agent-init`) write
|
|
18
|
+
> `.agents/skills/himalaya/examples/stocks-dashboard.descriptor.json` into the app — a
|
|
19
|
+
> fully-composed screen to study.
|
|
19
20
|
|
|
20
21
|
---
|
|
21
22
|
|
|
@@ -42,7 +42,6 @@ account, no corporate network. Append `/<topic>.md` for the raw markdown an agen
|
|
|
42
42
|
# works from anywhere — no Wix network, no VPN.
|
|
43
43
|
npm i -g @wix/himalaya-cli@latest
|
|
44
44
|
himi --version # MUST print a version (>= 0.200). If it prints the help banner, your himi is ancient — re-run the install above.
|
|
45
|
-
himi agent-init # seeds HIMALAYA.md + component-reference.md + examples/ here
|
|
46
45
|
himi guide # this page + the headless dev loop
|
|
47
46
|
himi docs # list the guides embedded in THIS CLI before naming a topic
|
|
48
47
|
himi components # the native UI components you can use + their props
|
|
@@ -53,6 +52,8 @@ himi --help # capability preflight: verify the commands thi
|
|
|
53
52
|
(On a Wix machine whose `~/.npmrc` points `@wix` at the internal registry this still works —
|
|
54
53
|
that registry proxies npmjs.com.)
|
|
55
54
|
|
|
55
|
+
**The agent files come with the app.** `himi init <app>` writes them **inside the new app**: `AGENTS.md` and `CLAUDE.md` (loaded by coding agents at every session start), the `himalaya` skill (`.agents/skills/himalaya/` with its `references/` and `examples/`, plus `.claude/skills/himalaya/`), the `HIMALAYA.md` primer and a Claude Code session-start hook that runs `himi progress --brief`. Start later sessions in that folder and they pick the work up by themselves. `himi agent-init`, run inside the app, refreshes them after a CLI upgrade (`himi doctor` says when they are stale); on an older CLI, run it there by hand.
|
|
56
|
+
|
|
56
57
|
### Installed-CLI capability gate
|
|
57
58
|
|
|
58
59
|
Do not assume every published CLI contains every guide or verification verb named in this
|
|
@@ -194,7 +195,7 @@ is the entire value** of a prop — `text: "$service:home.total"`, never `text:
|
|
|
194
195
|
(mid-string renders the raw token); put a label and its value in separate `Text`s. (A state string that
|
|
195
196
|
itself starts with `$` collides with the binding sigil — don't prefix values with `$`.) Don't worry
|
|
196
197
|
about the syntax yet:
|
|
197
|
-
copy the `examples/counter.*` pair
|
|
198
|
+
copy the `examples/counter.*` pair (in `.agents/skills/himalaya/examples/`, which `himi init` and `himi agent-init` write; it shows the wiring), study
|
|
198
199
|
`examples/stocks-dashboard.descriptor.json` to see a well-composed real screen; then start
|
|
199
200
|
from the recipe that matches your screen — each ships as a doc + a runnable example pair:
|
|
200
201
|
a data-backed list `examples/dynamic-list.*` (`himi docs recipe-dynamic-list`, incl.
|
package/guides/headless-loop.md
CHANGED
|
@@ -450,6 +450,7 @@ failure.
|
|
|
450
450
|
|
|
451
451
|
## Bootstrap your coding agent
|
|
452
452
|
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
author Himi screens
|
|
453
|
+
`himi init <app>` writes the agent files into the new app — `AGENTS.md`, `CLAUDE.md`, a
|
|
454
|
+
`HIMALAYA.md` primer and the `himalaya` skill with the component reference and the examples —
|
|
455
|
+
so your own coding assistant discovers how to author Himi screens, and a later session picks the
|
|
456
|
+
work back up. Run `himi agent-init` inside the app to refresh them after a CLI upgrade.
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: himalaya-technical
|
|
3
|
+
description: Technical implementation reference for Himalaya native iOS, Android, and web apps—CLI setup, screen authoring, Wix bindings, validation, preview, release, and QA distribution.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
<!-- Himalaya technical reference — hosted at https://apps.wix.com/_api/himi-serve/himi-skill.md. Start customer work at https://apps.wix.com/_api/himi-serve/skill.md; it defines discovery, approval, and handoff behavior. -->
|
|
7
|
+
|
|
8
|
+
> Fetching this page through a **summarizing** fetcher (some WebFetch tools paraphrase) drops the
|
|
9
|
+
> exact commands. It is served as raw `text/markdown` — fetch the URL **verbatim** (e.g. `curl` it)
|
|
10
|
+
> so the commands below arrive unaltered.
|
|
11
|
+
|
|
12
|
+
> **Two other doors** reach the same authoring surface with **no install at all**, because the
|
|
13
|
+
> server does the compiling: an **MCP server** whose tool list your client enumerates for you
|
|
14
|
+
> (https://apps.wix.com/_api/himi-serve/skill-mcp.md), or the same loop in raw `curl`
|
|
15
|
+
> (https://apps.wix.com/_api/himi-serve/skill-http.md). Both pages are public and worth reading, but
|
|
16
|
+
> the endpoints they drive are reachable **only from the Wix network** (`bo.wix.com`), since
|
|
17
|
+
> a server-side compile must not be internet-reachable. The CLI below is the one that works
|
|
18
|
+
> from anywhere.
|
|
19
|
+
|
|
20
|
+
> **Every guide referenced below is also fetchable**, with no install and from anywhere:
|
|
21
|
+
> https://apps.wix.com/_api/himi-serve/docs is the index and `https://apps.wix.com/_api/himi-serve/docs/<id>.md` is one guide — the same set
|
|
22
|
+
> `himi docs` ships, so use whichever door you already have open.
|
|
23
|
+
>
|
|
24
|
+
> **Two URLs, one guide.** `/docs/<id>.md` is YOUR url: the `.md` suffix is an unconditional
|
|
25
|
+
> markdown override, so it stays markdown no matter what `Accept` you send. `/docs/<id>`,
|
|
26
|
+
> with no suffix, is the one to hand a HUMAN: it negotiates on `Accept` and answers a browser
|
|
27
|
+
> with a rendered page (and anything else with the same markdown). Do not paste a `.md` link
|
|
28
|
+
> to a person — they will get raw markdown.
|
|
29
|
+
|
|
30
|
+
# Start here
|
|
31
|
+
|
|
32
|
+
With Himalaya you build **real native apps — iOS and Android first, plus the web, desktop
|
|
33
|
+
(macOS), and the wrist (Apple Watch / Wear OS)** — that update **instantly over-the-air**:
|
|
34
|
+
ship a new screen or a fix without an App Store / Play release. One project serves every
|
|
35
|
+
surface it declares (`himi docs app-config` → Surfaces); start phone-first and add
|
|
36
|
+
surfaces when you want them.
|
|
37
|
+
|
|
38
|
+
You don't write Swift or Kotlin. A **screen is just data** — a layout of native UI components —
|
|
39
|
+
plus, optionally, a little logic (a small JavaScript *worker* that holds state and handles taps).
|
|
40
|
+
The `himi` CLI turns that into the live app. (In the deeper docs this "screen as data + worker"
|
|
41
|
+
model is called a **Tier-5 screen** — but you don't need the jargon to start.)
|
|
42
|
+
|
|
43
|
+
This is the technical starting point for a developer or coding agent building on Wix.
|
|
44
|
+
For a business customer who begins with an app idea, start at https://apps.wix.com/_api/himi-serve/skill.md; it owns
|
|
45
|
+
discovery, plan approval, consent, browser review, and the handoff to this technical loop.
|
|
46
|
+
|
|
47
|
+
## Business-customer handoff
|
|
48
|
+
|
|
49
|
+
Do not use the commands below to jump straight into a template when a customer has not yet
|
|
50
|
+
approved their plan. The customer entry skill produces approved `SPEC.md` and `MOBILE-UX.md`,
|
|
51
|
+
then sends you here to choose a template, implement, validate, and prepare an owner-private draft
|
|
52
|
+
preview. For Wix Headless / Back Office work without a public site, use the approved plan's role/data
|
|
53
|
+
matrix and read `himi docs headless-business-to-himi-app` **only if it appears in `himi docs`**;
|
|
54
|
+
for a published site, read `himi docs wix-site-to-himi-app` only after permission to inspect live data
|
|
55
|
+
and only if that topic is installed. A missing embedded guide is a tooling-version fact, never a reason
|
|
56
|
+
to guess the customer's data model.
|
|
57
|
+
|
|
58
|
+
## Two ways to begin
|
|
59
|
+
|
|
60
|
+
**A. Read the guides in your browser** — https://apps.wix.com/_api/himi-serve/docs
|
|
61
|
+
Every guide, the component reference and the importable SDKs, as readable pages. Public: no Wix
|
|
62
|
+
account, no corporate network. Append `/<topic>.md` for the raw markdown an agent should fetch.
|
|
63
|
+
|
|
64
|
+
**B. From your terminal / coding agent:**
|
|
65
|
+
|
|
66
|
+
```sh
|
|
67
|
+
# Step 0 — install the LATEST CLI and VERIFY it. Use @latest: a plain
|
|
68
|
+
# `npm i -g @wix/himalaya-cli` is a no-op if an OLD himi is already on PATH, and an
|
|
69
|
+
# out-of-date CLI reports authoring as "not available standalone" — a stale build, not
|
|
70
|
+
# a platform limit. No registry flag: the CLI publishes to public npm, so the install
|
|
71
|
+
# works from anywhere — no Wix network, no VPN.
|
|
72
|
+
npm i -g @wix/himalaya-cli@latest
|
|
73
|
+
himi --version # MUST print a version (>= 0.200). If it prints the help banner, your himi is ancient — re-run the install above.
|
|
74
|
+
himi guide # this page + the headless dev loop
|
|
75
|
+
himi docs # list the guides embedded in THIS CLI before naming a topic
|
|
76
|
+
himi components # the native UI components you can use + their props
|
|
77
|
+
himi sdk # importable @himalaya/* SDKs + their typed API
|
|
78
|
+
himi --help # capability preflight: verify the commands this installed CLI actually has
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
(On a Wix machine whose `~/.npmrc` points `@wix` at the internal registry this still works —
|
|
82
|
+
that registry proxies npmjs.com.)
|
|
83
|
+
|
|
84
|
+
**The agent files come with the app.** `himi init <app>` writes them **inside the new app**: `AGENTS.md` and `CLAUDE.md` (loaded by coding agents at every session start), the `himalaya` skill (`.agents/skills/himalaya/` with its `references/` and `examples/`, plus `.claude/skills/himalaya/`), the `HIMALAYA.md` primer and a Claude Code session-start hook that runs `himi progress --brief`. Start later sessions in that folder and they pick the work up by themselves. `himi agent-init`, run inside the app, refreshes them after a CLI upgrade (`himi doctor` says when they are stale); on an older CLI, run it there by hand.
|
|
85
|
+
|
|
86
|
+
### Installed-CLI capability gate
|
|
87
|
+
|
|
88
|
+
Do not assume every published CLI contains every guide or verification verb named in this
|
|
89
|
+
reference. In particular, check whether `himi --help` lists `test` and whether `himi docs`
|
|
90
|
+
lists the topic you want **before** making either a required acceptance check. If either is absent
|
|
91
|
+
after a fresh `@latest` install, record a tooling block and continue only with the supported
|
|
92
|
+
local evidence (build, strict validate, and labelled state renders). That is not equivalent to a
|
|
93
|
+
behavioral crawl: do not call the app fully validated or release-ready, and do not invent an
|
|
94
|
+
unsupported command. The customer-facing skill owns the plan; its approved `MOBILE-UX.md` remains
|
|
95
|
+
the UX source of truth even if that guide is absent from the installed CLI.
|
|
96
|
+
|
|
97
|
+
## Author your first screen
|
|
98
|
+
|
|
99
|
+
**Building a real app? Start from a full template**, not the blank scaffold:
|
|
100
|
+
`himi init my-shop --template branded-lite` (a full consumer reference over a Wix
|
|
101
|
+
site — store/bookings/events/blog/cart/CMS, wired to `@himalaya/wix-*` + a visitor session)
|
|
102
|
+
or `--template owner-lite` (owner CRUD/management: lists, details, forms). That reference is
|
|
103
|
+
**dozens of screens** in one megabytes-long `dev/index.ts` of raw descriptors. Keep its
|
|
104
|
+
worker layer — trim it or mine it (`himi docs trim-a-template`): **trim** to the approved
|
|
105
|
+
`SPEC.md` when most of its screens fit, or **mine** it when few do — keep the
|
|
106
|
+
`tier5-src/_shared/` helpers and Wix worker chains and write your own screens. Do not delete
|
|
107
|
+
`tier5-src/` + `dev/` and start from blank. For a small **non-Wix** pattern, `himi init --template chat-bot --remote`. `himi template
|
|
108
|
+
list --remote` shows the full catalog (title/description/tags) — including templates published
|
|
109
|
+
to Wix — and `--remote` on `himi init` fetches one from there (the bundled copy is
|
|
110
|
+
the offline fallback). Publish any app of your own as a template with `himi template publish` —
|
|
111
|
+
see `himi docs templates`.
|
|
112
|
+
|
|
113
|
+
**When the blank scaffold IS the right call.** It is a deliberate starting point, not only the
|
|
114
|
+
thing you settle for when no template fits. Choose it when the app is **small and already
|
|
115
|
+
understood** — a handful of screens you can name — because a dozens-of-screens reference is then
|
|
116
|
+
more to delete than you would have written; when it **binds no Wix site or vertical**, so a
|
|
117
|
+
template's identity, fixtures and boot-time worker calls would all have to be torn out anyway;
|
|
118
|
+
when consent is **synthetic/local-only** and you need something that cannot auto-fetch (see the
|
|
119
|
+
preflight below); or when you are **learning the wiring** and want one screen and one worker with
|
|
120
|
+
nothing else in the file. The recipes below are written for exactly these cases. What blank is
|
|
121
|
+
NOT good for is a real customer app whose shape a published template already has — trimming or
|
|
122
|
+
mining that template (`himi docs trim-a-template`) beats rebuilding its Wix wiring from scratch.
|
|
123
|
+
|
|
124
|
+
**A template is a SHOWCASE APP, so look at it before you pick it.** Each one is a real published
|
|
125
|
+
release running on the plane: `GET /v1/templates.md` gives every row a `preview/a/<id>` URL that
|
|
126
|
+
boots the actual app in a browser, and the public landing page shows the same catalog as live
|
|
127
|
+
phones. Every row also carries a **start prompt** — the sentence a customer pastes to begin from
|
|
128
|
+
that template — which is what a customer arriving with "starting from the … template" has already
|
|
129
|
+
done. Print one yourself with `himi template prompt <name>`.
|
|
130
|
+
|
|
131
|
+
**Consent preflight before a template preview.** `branded-lite` and `owner-lite` are Wix-integrated
|
|
132
|
+
full apps; their workers can request Wix data when they boot. Do not start their worker or web
|
|
133
|
+
host under a synthetic/local-only authorization unless you have first removed or mocked every such
|
|
134
|
+
startup path and verified the network log is empty of Wix/external requests. Prefer a blank,
|
|
135
|
+
local-only scaffold for that stage. A browser render that causes an unapproved request is a failed
|
|
136
|
+
consent gate, not a harmless preview.
|
|
137
|
+
|
|
138
|
+
**Preview boundary:** local `himi render` evidence is a rendered state artifact, not an interactive,
|
|
139
|
+
authenticated owner preview. The interactive `himi preview` URLs exist for a **draft release** after
|
|
140
|
+
`himi push --draft`; obtain the separate draft-publish approval first. Do not start an arbitrary local
|
|
141
|
+
web host and call it owner-private, and do not let a template worker boot there until its startup
|
|
142
|
+
network paths are authorized and preflighted.
|
|
143
|
+
|
|
144
|
+
**Adopt, don't just rename, a template.** The approved `SPEC.md` and `MOBILE-UX.md` are the
|
|
145
|
+
plan, and the plan wins over anything `himi init` seeds. `init` seeds placeholder copies of
|
|
146
|
+
both and can overwrite plan files already in the package root, so keep a copy of the approved
|
|
147
|
+
plan until `init` has run. After `init`, open both files:
|
|
148
|
+
if either holds `init`'s boilerplate rather than the approved plan, put the approved plan back in
|
|
149
|
+
its place — never the reverse — and finish it with the actual customer, data/auth assumptions,
|
|
150
|
+
placeholder copy, flow/state matrix, and compact/phone/expanded + device evidence before calling
|
|
151
|
+
the app ready. Keep scenario switches out of customer UI. A labelled preview fallback is acceptable
|
|
152
|
+
only when the host cannot perform the task and it cannot write customer data.
|
|
153
|
+
|
|
154
|
+
Before authoring a multi-screen mobile app, ensure the customer-approved `SPEC.md` and
|
|
155
|
+
`MOBILE-UX.md` are in the content-package root. Use `himi docs <topic>` only after `himi docs`
|
|
156
|
+
shows that topic for the installed CLI.
|
|
157
|
+
The contract ships with a release when it contains public-safe material, so later agents can
|
|
158
|
+
retrieve and extend the rationale.
|
|
159
|
+
|
|
160
|
+
## From a Wix website (the usual real-app path)
|
|
161
|
+
|
|
162
|
+
**No site yet?** `himi site create` provisions one, and what you pass decides what you get:
|
|
163
|
+
|
|
164
|
+
```sh
|
|
165
|
+
himi site create <name> --type headless \
|
|
166
|
+
--template <guid> --verticals stores,bookings \
|
|
167
|
+
--redirect-uri himalaya-<your-app>://oauth/callback --yes
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
`--type` defaults to `wix`, so pass `headless` for an app that binds a Headless client.
|
|
171
|
+
**Without `--template` you get a BLANK project, not a usable site** — and `--verticals` is
|
|
172
|
+
refused without it, because a blank project has no site for a vertical to attach to (the
|
|
173
|
+
install reports success with `requiredActions: CREATE_SITE` while the vertical's API answers
|
|
174
|
+
428 forever). **Pass `--redirect-uri` with your own app's scheme:** it defaults to
|
|
175
|
+
`himalaya-demo-app://oauth/callback`, and a scaffolded template authenticates with
|
|
176
|
+
`himalaya-<your-app>://oauth/callback` — mint a client that does not allowlist yours and
|
|
177
|
+
sign-in fails at redirect-session with "no auth code".
|
|
178
|
+
|
|
179
|
+
The minted client's id IS the `WIX_CLIENT_ID` below. The **`WIX_SITE_URL` half of the binding
|
|
180
|
+
is not minted with it**: a just-created site is unpublished, so it has no public URL to read
|
|
181
|
+
(`himi site list` reports `viewUrl` empty until you publish). `--site-url` is read **only
|
|
182
|
+
during this one create call** — there is no rebind verb, and re-running `site create` bills you
|
|
183
|
+
a second site — so if the site is not published yet, bind the URL **after** publishing by setting
|
|
184
|
+
`WIX_SITE_URL` (the app resolves env first) or by editing `wix.siteUrl` in its
|
|
185
|
+
`provisioning.json`. Otherwise the app keeps its placeholder URL and reads nothing.
|
|
186
|
+
`--write-provisioning [path]` records the binding into an **existing** `provisioning.json` (it
|
|
187
|
+
updates a manifest, it does not create one, and it refuses the committed branded-lite manifest).
|
|
188
|
+
|
|
189
|
+
It creates a **real, billable** site on the signed-in Wix account and is not cleanly reversible,
|
|
190
|
+
which is why `--yes` is mandatory: get the customer's explicit go-ahead first. Full procedure,
|
|
191
|
+
including the Catalog-V3 and inherited-locale traps: `himi docs creating-wix-sites`.
|
|
192
|
+
|
|
193
|
+
If the user has a **published Wix site** (URL + Headless `clientId`), **stop following the
|
|
194
|
+
counter recipe.** Read `himi docs wix-site-to-himi-app` and follow it end to end: analyze
|
|
195
|
+
(`himi site analyze`) → screen plan (words from `book.copy`, not stock phrases) →
|
|
196
|
+
`himi init --template <overlay>` → bind
|
|
197
|
+
`WIX_CLIENT_ID` / `WIX_SITE_URL` → rewrite verticals / CMS / Velo / forms / pages as
|
|
198
|
+
**native mobile** screens (phone IA and UX, not a WebView or a shrunk desktop).
|
|
199
|
+
`--apply` bakes name/colors/tabs — it is a start, not the product. It maps a handful of scraped
|
|
200
|
+
CSS variables and picks the design kit from **installed verticals**, so it cannot tell a brand
|
|
201
|
+
colour from a background wash and it has never seen the site. **Open `<out>/evidence/pages/*.png`
|
|
202
|
+
and judge the look yourself**: pick the kit from the character you see there, take the accent from
|
|
203
|
+
a colour actually present (a scraped theme value, or the logo in `<out>/media/`) rather than
|
|
204
|
+
inventing one, treat a near-white/cream value as a surface, and verify BOTH colour schemes — the
|
|
205
|
+
mapper writes the site's light colour into the dark arm too, so dark mode is where it fails first.
|
|
206
|
+
To create/publish/invoke the site's Velo HTTP functions, `himi docs wix-site-http-functions`
|
|
207
|
+
and `himi site function` (not analyze, and not `himi functions`).
|
|
208
|
+
|
|
209
|
+
After `himi init … --template branded-lite` (or a vertical overlay), **point the app at your
|
|
210
|
+
Wix site** before expecting live catalog data:
|
|
211
|
+
|
|
212
|
+
```sh
|
|
213
|
+
export WIX_CLIENT_ID="<headless-oauth-client-id>"
|
|
214
|
+
export WIX_SITE_URL="https://your-site.wixsite.com/…"
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
The Headless `clientId` is the site binding (no separate MSID flag). Details:
|
|
218
|
+
`himi docs branded-lite-site-binding`.
|
|
219
|
+
|
|
220
|
+
A screen is a **layout** (a tree of native components) plus an optional **worker** —
|
|
221
|
+
`defineService(name, { state, actions })` — wired together with bindings like `$service:<service>.<path>`,
|
|
222
|
+
and a Button triggers an action via `tier5.<service>.<action>`. A binding is substituted **only when it
|
|
223
|
+
is the entire value** of a prop — `text: "$service:home.total"`, never `text: "Total: $service:home.total"`
|
|
224
|
+
(mid-string renders the raw token); put a label and its value in separate `Text`s. (A state string that
|
|
225
|
+
itself starts with `$` collides with the binding sigil — don't prefix values with `$`.) Don't worry
|
|
226
|
+
about the syntax yet:
|
|
227
|
+
copy the `examples/counter.*` pair (in `.agents/skills/himalaya/examples/`, which `himi init` and `himi agent-init` write; it shows the wiring), study
|
|
228
|
+
`examples/stocks-dashboard.descriptor.json` to see a well-composed real screen; then start
|
|
229
|
+
from the recipe that matches your screen — each ships as a doc + a runnable example pair:
|
|
230
|
+
a data-backed list `examples/dynamic-list.*` (`himi docs recipe-dynamic-list`, incl.
|
|
231
|
+
pull-to-refresh + load-more), a create/edit form `examples/form-submit.*`
|
|
232
|
+
(`himi docs recipe-form-submit`), a searchable list `examples/search-list.*`
|
|
233
|
+
(`himi docs recipe-search`), a first-run onboarding card `examples/onboarding.*`
|
|
234
|
+
(`himi docs recipe-onboarding`), and the loading/empty/error/ready idiom they all share
|
|
235
|
+
(`himi docs recipe-four-state`). Then — **before you
|
|
236
|
+
design** — read the UX guide (`himi docs designing-himi-screens`) and, for a multi-screen app,
|
|
237
|
+
the mobile contract guide (`himi docs mobile-ux`), then follow
|
|
238
|
+
*Author a Tier-5 screen*.
|
|
239
|
+
|
|
240
|
+
Keep structural choices reviewable: use `FragmentSlot` when a finite set of shipped component
|
|
241
|
+
trees is selected by worker state. Use the gated `WorkerSubtree` only when structure is genuinely
|
|
242
|
+
unknowable at descriptor-authoring time; it requires explicit type/action/budget policy, a
|
|
243
|
+
descriptor-shipped fallback, and `workerSubtreeScreens` allowlisting. The Tier-5 guide contains
|
|
244
|
+
the complete decision order and examples.
|
|
245
|
+
|
|
246
|
+
## What works off-repo — and what still needs VPN
|
|
247
|
+
|
|
248
|
+
- ✅ **From `npm i -g @wix/himalaya-cli` alone:** the supported
|
|
249
|
+
author → check → iterate loop, with **nothing to check out and no simulator** — `guide`, `docs`,
|
|
250
|
+
`components`, `sdk`, `skills`, `agent-init`, `init`, and **`build` / `validate` / `render` /
|
|
251
|
+
`preview`**, plus `test` **only when the capability gate above lists it**. These compile a Tier-5
|
|
252
|
+
worker, lint a screen against schema/tokens/components/`$service` + a worker boot dry-run, and
|
|
253
|
+
headless-render it. When available, **`himi test` needs no test files** — it derives the checks from the actions your descriptors already
|
|
254
|
+
declare: it boots each screen's real worker, dispatches each action from a fresh boot, and reports
|
|
255
|
+
anything that threw, stayed stuck on `loading`, or leaked a `NaN`/`undefined`/`$service:` token into
|
|
256
|
+
visible text. It is the only local check that catches a WRONG REDUCER, and it runs the worker in a
|
|
257
|
+
device-parity sandbox (no `setTimeout`/`setInterval`, as on JSC/WebView) so a bundle that would only
|
|
258
|
+
die on the device fails locally instead. **`himi render --live` is
|
|
259
|
+
the sanctioned way to prove real-data binding with NO VPN and NO push** — it mints an anonymous
|
|
260
|
+
visitor token from the app's Wix `clientId` and **awaits the worker's real fetches** against live
|
|
261
|
+
Wix, so the render shows LIVE data (not just the empty initial state) and catches live-only binding
|
|
262
|
+
bugs locally. The CLI **ships its own `@wix/himalaya` runtime**, so it resolves `@himalaya/*`
|
|
263
|
+
on its own — `build` / `validate` / `render` work with **no per-app `node_modules` at all**. A
|
|
264
|
+
per-app `npm i @wix/himalaya` is **optional** (it only lets your editor / `tsc` resolve
|
|
265
|
+
`@himalaya/*` types locally) and is the one install still **VPN-gated** — that SDK package
|
|
266
|
+
publishes to the internal registry `npm.dev.wixpress.com`, which is unreachable off-VPN. The
|
|
267
|
+
CLI itself is not: it comes from public npm.
|
|
268
|
+
- ⛔ **Needs a Wix sign-in:** `himi push` / `promote` publish and activate your release.
|
|
269
|
+
To change **part** of a release instead of republishing it, `push --only <selector>` publishes
|
|
270
|
+
just the named items — same build + lint gate, derived from the live release — and `himi patch`
|
|
271
|
+
does the same from a raw file on a machine with no content package. Both require an explicit
|
|
272
|
+
`--draft` or `--live`: a partial publish has no safe default, and neither carries an attestation
|
|
273
|
+
or refreshes the source archive (the output names both). Prefer `push` for anything you would
|
|
274
|
+
want restorable.
|
|
275
|
+
After a push, **`context` / `screens` / `diagnose` / `deeplinks` / `render --remote` /
|
|
276
|
+
`telemetry` / `logs`** read back from what you published (over `/v1/preview/…`,
|
|
277
|
+
`/v1/telemetry/events`, `/v1/telemetry/logs`), and so does **`himi dist`**
|
|
278
|
+
(a QA binary — see *Shipping* below), which you rarely need. Authenticate once with
|
|
279
|
+
**`himi login --browser`**: it signs you in with your own Wix account and stores a scoped
|
|
280
|
+
token, so nothing is ever hand-pasted. (`--wix` uses the machine's own Wix CLI credential
|
|
281
|
+
instead — the mode a CI container can satisfy. Wix employees can use `--dpx`.)
|
|
282
|
+
Everything up to the push runs locally.
|
|
283
|
+
|
|
284
|
+
## Optional push notifications
|
|
285
|
+
|
|
286
|
+
Interactive `himi init my-app` offers **Set up now / Later — continue building** after
|
|
287
|
+
creating the project, with or without a template. Missing credentials or failed setup do not
|
|
288
|
+
fail app creation. Use `--no-push-setup` to defer deliberately. Non-interactive runs,
|
|
289
|
+
`--json`, and `init --yes` do not prompt or configure push unless `--push-setup` is
|
|
290
|
+
explicitly supplied. Never combine `--push-setup` and `--no-push-setup`.
|
|
291
|
+
|
|
292
|
+
Resume when the customer has a Wix site and the required keys:
|
|
293
|
+
|
|
294
|
+
```sh
|
|
295
|
+
himi login --browser --target wix
|
|
296
|
+
wix login
|
|
297
|
+
himi notify setup --content ./my-app --target wix
|
|
298
|
+
himi notify status --content ./my-app --target wix --refresh --json
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
**Browser login alone is not sufficient for site authorization today.** Setup and status
|
|
302
|
+
also use the Wix CLI account credential; use the same customer account for both logins.
|
|
303
|
+
The CLI verifies app ownership and site access. A new app can be claimed as part of confirmed
|
|
304
|
+
setup. Existing public bindings are reused and the prompts collect missing values.
|
|
305
|
+
|
|
306
|
+
Supply the APNs key by local file path, its Key ID, Apple Team ID, bundle ID and environment;
|
|
307
|
+
align the Android application ID with Firebase. The current wizard requires APNs input and
|
|
308
|
+
has no separate Android-only mode. For automatic Apple signing, choose that option or use
|
|
309
|
+
`--apple-signing` with a separate App Store Connect key file, Key ID and Issuer ID.
|
|
310
|
+
Review the public plan before confirmation; agents use `--yes` only for authorized setup.
|
|
311
|
+
Keys are transmitted to the authenticated backend for Branded/Ping custody, not copied into
|
|
312
|
+
project settings or output. Enter Later to defer and continue building.
|
|
313
|
+
|
|
314
|
+
`notify status` is read-only and needs no key files; `--refresh` checks providers live.
|
|
315
|
+
Backend readiness does not prove notification delivery. This setup does not rewrite native
|
|
316
|
+
configuration, select a Ping family, build a binary, register a device or send a notification.
|
|
317
|
+
Continue building and publishing app content. Customer iOS push testing through `himi dist`
|
|
318
|
+
is blocked until the hosted build service supports customer signing keys; the current Wix-managed QA
|
|
319
|
+
binary cannot test the customer's saved push configuration. After an uncertain setup response, inspect status before
|
|
320
|
+
retrying; the CLI does not automatically repeat provisioning.
|
|
321
|
+
|
|
322
|
+
Full inputs, script flags and status meanings: `himi docs push-cli-onboarding`
|
|
323
|
+
(https://apps.wix.com/_api/himi-serve/docs/push-cli-onboarding.md). The guide is bundled with the public npm package
|
|
324
|
+
and is also served at that public URL. No repository access is required. This is notification setup; `himi push` publishes
|
|
325
|
+
app content. Existing `notify send|tokens|doctor` commands use the local notification server.
|
|
326
|
+
|
|
327
|
+
## Shipping — over the air by default, a binary only for a native delta
|
|
328
|
+
|
|
329
|
+
`himi push` → `himi promote` ships screens, Tier-5 bundles, tokens and app-config in **seconds**,
|
|
330
|
+
with no App Store / Play release. That is the normal path and it covers almost every change.
|
|
331
|
+
|
|
332
|
+
You need an actual **binary** only for a *native* delta: a new SDUI component, a newly declared
|
|
333
|
+
capability/entitlement, a new bundle id, or a `minBinaryVersion` floor bump. For that there is
|
|
334
|
+
`himi dist` — Wix builds and signs a
|
|
335
|
+
real IPA/APK for you and hands back an install link:
|
|
336
|
+
|
|
337
|
+
```sh
|
|
338
|
+
himi dist --app my-app --platform ios,android --target wix # waits, prints the install link
|
|
339
|
+
himi dist --app my-app --platform ios --no-wait --target wix # returns a jobId instead
|
|
340
|
+
himi dist status <jobId> --app my-app --target wix # or: list --app my-app | cancel <jobId>
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
The binary is **offline-capable**: the pool bakes the serve release into it — every screen and
|
|
344
|
+
Tier-5 bundle, plus tokens, app-config and the icon — so a fresh install paints with no network.
|
|
345
|
+
iOS returns an **https install page** whose button carries the `itms-services:` URL (chat clients
|
|
346
|
+
won't linkify that scheme, so the page is what you share); open it in Safari on the device.
|
|
347
|
+
|
|
348
|
+
**Wix-managed QA signing needs no customer signing files.** The pool MINTS a provisioning profile for the app's own
|
|
349
|
+
bundle id per job — there is no profile to pre-provision and nothing to borrow. `--borrow-ios-id
|
|
350
|
+
<bundleId>` still exists as an escape hatch (the binary then installs under *that* id, which is
|
|
351
|
+
fine for QA and wrong for anything else), but it is rarely what you want.
|
|
352
|
+
For customer push credentials, the binary's Apple team, bundle ID and APNs environment must
|
|
353
|
+
match the saved delivery configuration. The current self-serve `himi dist` path uses Wix's
|
|
354
|
+
Apple team and a `com.wix.himi.<app>` bundle ID, so its QA binary cannot test customer iOS
|
|
355
|
+
push. `--signing byo` is not supported. Testing through `himi dist` must wait for the hosted build service
|
|
356
|
+
to support customer signing keys. Notification setup can verify backend configuration now,
|
|
357
|
+
but does not make a matching customer-signed build available.
|
|
358
|
+
|
|
359
|
+
**Android signing needs nothing either.** `--android-signing` defaults to `qa-keystore` — the
|
|
360
|
+
repo's committed QA key, identical on every pool machine, so a new build installs *over* the last
|
|
361
|
+
one. `--android-signing wix-keystore` signs with the Wix key the pool machine carries and fails
|
|
362
|
+
loudly if it carries none; `debug` is the old per-machine key, where QA must uninstall first.
|
|
363
|
+
|
|
364
|
+
`--release` is optional: omit it and the plane builds whatever is **live** for the app, recording
|
|
365
|
+
the concrete id it chose. A build takes roughly **4 minutes** (iOS) or **3.5** (Android), and the
|
|
366
|
+
pool parallelises, so dispatching many at once costs about the same as dispatching one.
|
|
367
|
+
|
|
368
|
+
Full pipeline, signing constraints and how to read a failure: `himi docs qa-builds`.
|
|
369
|
+
|
|
370
|
+
## Bootstrap a coding agent
|
|
371
|
+
|
|
372
|
+
Paste this into your coding agent (Claude Code, Cursor, …):
|
|
373
|
+
|
|
374
|
+
```
|
|
375
|
+
I want to create a mobile app for my business. Follow this skill:
|
|
376
|
+
https://apps.wix.com/_api/himi-serve/skill.md
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
## Native UX evidence gate
|
|
380
|
+
|
|
381
|
+
Before declaring a multi-screen app ready, run `himi ux audit --content . --strict` and resolve its findings. After driving each available native shell, persist the actual checks with `himi ux record`; record an unavailable platform with its reason rather than claiming coverage.
|
package/guides/index.json
CHANGED
|
@@ -289,6 +289,10 @@
|
|
|
289
289
|
],
|
|
290
290
|
"componentReferenceFile": "component-reference.json",
|
|
291
291
|
"sdkReferenceFile": "sdk-reference.json",
|
|
292
|
+
"skills": {
|
|
293
|
+
"customer": "skill.md",
|
|
294
|
+
"technical": "himi-skill.md"
|
|
295
|
+
},
|
|
292
296
|
"example": {
|
|
293
297
|
"serviceFile": "counter.service.ts",
|
|
294
298
|
"descriptorFile": "counter-t5.descriptor.json",
|
|
@@ -6,8 +6,8 @@ stitches together three pieces that are each documented separately but easy to m
|
|
|
6
6
|
a unit: worker array state → `itemsPath` → an `$item.` row template.
|
|
7
7
|
|
|
8
8
|
Mined from the in-repo reference apps: `apps/himi-owner-lite` (products/services/events/posts
|
|
9
|
-
lists) and `apps/family-cart` (cart list). The `examples/dynamic-list.*` pair
|
|
10
|
-
`himi agent-init`
|
|
9
|
+
lists) and `apps/family-cart` (cart list). The `examples/dynamic-list.*` pair in
|
|
10
|
+
the app's `.agents/skills/himalaya/examples/` (written by `himi init` and `himi agent-init`) is a distilled, runnable version of this recipe.
|
|
11
11
|
|
|
12
12
|
**Which components?** `LazyList` (vertical list, swipe actions, virtualized) or
|
|
13
13
|
`Grid` with `columns: 1` (simple stacked rows; bump `columns`/`columnsMedium` for
|
|
@@ -251,4 +251,4 @@ Mechanics and the prod caveat in full: `himi docs tier-5-add-a-screen`.
|
|
|
251
251
|
- `himi docs tier-5-add-a-screen` — the full worker/descriptor authoring loop.
|
|
252
252
|
- `himi docs designing-himi-screens` — layout idioms + screen-state patterns.
|
|
253
253
|
- `himi components LazyList` / `himi components Grid` — the full prop surface.
|
|
254
|
-
-
|
|
254
|
+
- `.agents/skills/himalaya/examples/dynamic-list.*` (written into the app by `himi init` / `himi agent-init`) — this recipe, runnable.
|
|
@@ -7,8 +7,8 @@ half of CRUD (new product, edit post, contact form…). The load-bearing contrac
|
|
|
7
7
|
per-keystroke state.
|
|
8
8
|
|
|
9
9
|
Mined from `apps/himi-owner-lite` (product/post/service/event forms — `buildForm` +
|
|
10
|
-
the `himi-owner-lite-*-form` workers). The `examples/form-submit.*` pair
|
|
11
|
-
`himi agent-init`
|
|
10
|
+
the `himi-owner-lite-*-form` workers). The `examples/form-submit.*` pair in
|
|
11
|
+
the app's `.agents/skills/himalaya/examples/` (written by `himi init` and `himi agent-init`) is a distilled, runnable version.
|
|
12
12
|
|
|
13
13
|
## 1. The descriptor: `Form` + `FormField`s + a submit `Button`
|
|
14
14
|
|
|
@@ -171,4 +171,4 @@ shape (heading swap, `savedScreenId`, back-navigation).
|
|
|
171
171
|
- `himi docs recipe-four-state` — the state-machine idiom this recipe leans on.
|
|
172
172
|
- `himi docs recipe-dynamic-list` — the list the created entity lands in.
|
|
173
173
|
- `himi components Form` / `FormField` / `TextField` / `Toggle` / `Picker`.
|
|
174
|
-
-
|
|
174
|
+
- `.agents/skills/himalaya/examples/form-submit.*` (written into the app by `himi init` / `himi agent-init`) — this recipe, runnable.
|
|
@@ -8,8 +8,8 @@ separate onboarding screen to route around, works identically on iOS, Android
|
|
|
8
8
|
and web.
|
|
9
9
|
|
|
10
10
|
Mined from `apps/himi-branded-lite` (the home screen's first-run card). The
|
|
11
|
-
`examples/onboarding.*` pair
|
|
12
|
-
runnable version.
|
|
11
|
+
`examples/onboarding.*` pair in the app's `.agents/skills/himalaya/examples/` (written by `himi init` and `himi agent-init`)
|
|
12
|
+
is a distilled, runnable version.
|
|
13
13
|
|
|
14
14
|
## 1. The worker: read the flag at boot, persist on dismiss
|
|
15
15
|
|
|
@@ -128,4 +128,4 @@ const svc = defineService<State, {
|
|
|
128
128
|
|
|
129
129
|
- `himi docs recipe-four-state` — the same `hiddenWhen`/display-string idiom.
|
|
130
130
|
- `himi docs designing-himi-screens` — copy + hierarchy guidance for the card.
|
|
131
|
-
-
|
|
131
|
+
- `.agents/skills/himalaya/examples/onboarding.*` (written into the app by `himi init` / `himi agent-init`) — this recipe, runnable.
|
package/guides/recipe-search.md
CHANGED
|
@@ -6,8 +6,8 @@ network round-trip per keystroke, instant results, and the empty state can say
|
|
|
6
6
|
*why* it's empty.
|
|
7
7
|
|
|
8
8
|
Mined from the Himi Blog app's `himi-blog-feed` worker (search + category chips
|
|
9
|
-
over posts). The `examples/search-list.*` pair
|
|
10
|
-
distilled, runnable version. Builds on `himi docs recipe-dynamic-list` — read that
|
|
9
|
+
over posts). The `examples/search-list.*` pair in the app's `.agents/skills/himalaya/examples/` (written by `himi init`
|
|
10
|
+
and `himi agent-init`) is a distilled, runnable version. Builds on `himi docs recipe-dynamic-list` — read that
|
|
11
11
|
first; this recipe only adds the query layer.
|
|
12
12
|
|
|
13
13
|
## 1. The descriptor: `SearchField` → one debounced action
|
|
@@ -108,4 +108,4 @@ change — only the action's body.
|
|
|
108
108
|
- `himi docs recipe-dynamic-list` — the list this recipe filters.
|
|
109
109
|
- `himi docs recipe-four-state` — the emptyText/error/loading strings.
|
|
110
110
|
- `himi components SearchField` / `FilterChips` / `Tabs`.
|
|
111
|
-
-
|
|
111
|
+
- `.agents/skills/himalaya/examples/search-list.*` (written into the app by `himi init` / `himi agent-init`) — this recipe, runnable.
|