@wix/himalaya-cli 0.1098.0 → 0.1100.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/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/comments-v1/src/extensions.d.ts +13 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk-auto/_shared/runtime.generated.d.ts +27 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk-auto/_shared/types.generated.d.ts +829 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk-auto/comments/categories.generated.d.ts +113 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk-auto/comments/commentContexts.generated.d.ts +43 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk-auto/comments/comments.generated.d.ts +553 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk-auto/comments/contentRevisions.generated.d.ts +100 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk-auto/comments/index.generated.d.ts +7 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk-auto/comments/ratings.generated.d.ts +72 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk-auto/comments/widgets.generated.d.ts +138 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-comments.mjs +280 -7
- package/dist/authoring-runtime/node_modules/@wix/himalaya/package.json +1 -1
- package/dist/cli.mjs +93 -17
- package/guides/getting-started.md +26 -9
- package/guides/himi-skill.md +26 -9
- package/guides/push-cli-onboarding.md +21 -5
- package/guides/qa-builds.md +43 -7
- package/guides/release-notes.md +9 -0
- package/guides/sdk-reference.json +291 -1
- package/guides/skill.md +4 -2
- package/guides/wix-api-usage.md +34 -1
- package/package.json +2 -2
- package/templates/beauty-salon/dev/index.ts +394 -514
- package/templates/beauty-salon/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/beauty-salon/tier5-src/himi-blog-post/index.ts +14 -4
- package/templates/beauty-salon-owner/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/branded-lite/dev/index.ts +394 -514
- package/templates/branded-lite/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/branded-lite/tier5-src/himi-blog-post/index.ts +14 -4
- package/templates/community-club/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/community-club/tier5-src/himi-blog-post/index.ts +14 -4
- package/templates/community-club-owner/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/events-meetups/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/events-meetups/tier5-src/himi-blog-post/index.ts +14 -4
- package/templates/events-meetups-owner/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/gym-fitness/dev/index.ts +394 -514
- package/templates/gym-fitness/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/gym-fitness/tier5-src/himi-blog-post/index.ts +14 -4
- package/templates/gym-fitness-owner/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/nonprofit-cause/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/nonprofit-cause/tier5-src/himi-blog-post/index.ts +14 -4
- package/templates/nonprofit-cause-owner/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/owner-lite/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/podcast-creator/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/podcast-creator/tier5-src/himi-blog-post/index.ts +14 -4
- package/templates/podcast-creator-owner/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/portfolio-creative/dev/index.ts +396 -516
- package/templates/portfolio-creative/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/portfolio-creative/tier5-src/himi-blog-post/index.ts +14 -4
- package/templates/portfolio-creative-owner/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/restaurant/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/restaurant/tier5-src/himi-blog-post/index.ts +14 -4
- package/templates/restaurant-owner/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/retail-store/dev/index.ts +396 -516
- package/templates/retail-store/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/retail-store/tier5-src/himi-blog-post/index.ts +14 -4
- package/templates/retail-store-owner/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/yoga-studio/tier5-src/_shared/collection-contract.ts +8 -1
- package/templates/yoga-studio/tier5-src/himi-blog-post/index.ts +14 -4
- package/templates/yoga-studio-owner/tier5-src/_shared/collection-contract.ts +8 -1
package/dist/cli.mjs
CHANGED
|
@@ -125,6 +125,7 @@ function resolveTarget(opts = {}) {
|
|
|
125
125
|
}
|
|
126
126
|
const base = { ...fromBuiltin, ...fromFile };
|
|
127
127
|
return {
|
|
128
|
+
previewRoute: env.HIMI_SERVE_PREVIEW_ROUTE ?? base.previewRoute,
|
|
128
129
|
serve: opts.serveUrl ?? env.HIMI_SERVE_URL ?? base.serve ?? "",
|
|
129
130
|
telemetry: opts.telemetryUrl ?? env.HIMI_TELEMETRY_URL ?? base.telemetry ?? "",
|
|
130
131
|
control: opts.controlUrl ?? env.HIMI_CONTROL_URL ?? base.control ?? "",
|
|
@@ -4289,6 +4290,17 @@ var init_splash = __esm({
|
|
|
4289
4290
|
}
|
|
4290
4291
|
});
|
|
4291
4292
|
|
|
4293
|
+
// ../../core/dev-server/tier5-bundles-src/wix-sdk-auto-aliases.generated.mjs
|
|
4294
|
+
var AUTO_WIX_SDK;
|
|
4295
|
+
var init_wix_sdk_auto_aliases_generated = __esm({
|
|
4296
|
+
"../../core/dev-server/tier5-bundles-src/wix-sdk-auto-aliases.generated.mjs"() {
|
|
4297
|
+
"use strict";
|
|
4298
|
+
AUTO_WIX_SDK = {
|
|
4299
|
+
"@himalaya/wix-comments": { pkg: "comments", index: "stdlib/wix-sdk-auto/comments/index.generated.ts", curated: "comments-v1" }
|
|
4300
|
+
};
|
|
4301
|
+
}
|
|
4302
|
+
});
|
|
4303
|
+
|
|
4292
4304
|
// ../../core/dev-server/tier5-bundles-src/build-lib.mjs
|
|
4293
4305
|
var build_lib_exports = {};
|
|
4294
4306
|
__export(build_lib_exports, {
|
|
@@ -4881,6 +4893,7 @@ var _compilerP, __dirname, REPO_ROOT4, SDK, alias, sourceAliases, SRC_DIR, OUT_D
|
|
|
4881
4893
|
var init_build_lib = __esm({
|
|
4882
4894
|
"../../core/dev-server/tier5-bundles-src/build-lib.mjs"() {
|
|
4883
4895
|
"use strict";
|
|
4896
|
+
init_wix_sdk_auto_aliases_generated();
|
|
4884
4897
|
__dirname = dirname8(fileURLToPath5(import.meta.url));
|
|
4885
4898
|
REPO_ROOT4 = resolve8(__dirname, "../../..");
|
|
4886
4899
|
SDK = (d) => resolve8(REPO_ROOT4, `stdlib/wix-sdk/${d}/src/index.ts`);
|
|
@@ -4972,7 +4985,6 @@ var init_build_lib = __esm({
|
|
|
4972
4985
|
"@himalaya/wix-ecom": SDK("ecom"),
|
|
4973
4986
|
"@himalaya/wix-redirects": SDK("redirects-v1"),
|
|
4974
4987
|
"@himalaya/wix-blog": SDK("blog-v3"),
|
|
4975
|
-
"@himalaya/wix-comments": SDK("comments-v1"),
|
|
4976
4988
|
"@himalaya/wix-users": SDK("users"),
|
|
4977
4989
|
"@himalaya/wix-new-releases": SDK("new-releases"),
|
|
4978
4990
|
"@himalaya/wix-business-feed": SDK("business-feed"),
|
|
@@ -5020,6 +5032,10 @@ var init_build_lib = __esm({
|
|
|
5020
5032
|
"@himalaya/wix-notifications": SDK("notifications-v3"),
|
|
5021
5033
|
"@himalaya/wix-seo": SDK("seo-v1")
|
|
5022
5034
|
};
|
|
5035
|
+
for (const [key2, e] of Object.entries(AUTO_WIX_SDK)) {
|
|
5036
|
+
if (key2 in alias) throw new Error(`build-lib.mjs: ${key2} is hand-listed AND in wix-sdk-auto-aliases.generated.mjs \u2014 delete the hand-listed entry`);
|
|
5037
|
+
alias[key2] = resolve8(REPO_ROOT4, e.index);
|
|
5038
|
+
}
|
|
5023
5039
|
sourceAliases = Object.fromEntries(Object.entries(alias).flatMap(([name, target]) => [
|
|
5024
5040
|
[name, target],
|
|
5025
5041
|
[name.replace(/^@himalaya\//, "@wix/himalaya/"), target]
|
|
@@ -6740,7 +6756,6 @@ function walk(node, registry, path2, out2) {
|
|
|
6740
6756
|
var SYSTEM_FONT_FAMILY, TONAL_ELEVATION_ALPHA;
|
|
6741
6757
|
var init_tokens = __esm({
|
|
6742
6758
|
"../../core/ts/src/tokens.ts"() {
|
|
6743
|
-
"use strict";
|
|
6744
6759
|
SYSTEM_FONT_FAMILY = "$system";
|
|
6745
6760
|
TONAL_ELEVATION_ALPHA = [0, 0.05, 0.08, 0.11, 0.12, 0.14];
|
|
6746
6761
|
}
|
|
@@ -6767,7 +6782,6 @@ function resolveTranslation(value, catalog, sourceCatalog) {
|
|
|
6767
6782
|
var BINDING_SIGILS, BINDING_SIGIL_RE, TRANSLATION_PREFIX, TRANSLATION_KEY_RE;
|
|
6768
6783
|
var init_bindings = __esm({
|
|
6769
6784
|
"../../core/ts/src/bindings.ts"() {
|
|
6770
|
-
"use strict";
|
|
6771
6785
|
BINDING_SIGILS = ["service", "flag", "item", "t"];
|
|
6772
6786
|
BINDING_SIGIL_RE = new RegExp(
|
|
6773
6787
|
`^\\$(?:${BINDING_SIGILS.filter((s) => s !== "t").join("|")})\\b|^\\$t:`
|
|
@@ -19012,11 +19026,16 @@ var init_himi_package = __esm({
|
|
|
19012
19026
|
// ../../packages/serve/src/claude-plugin.ts
|
|
19013
19027
|
var claude_plugin_exports = {};
|
|
19014
19028
|
__export(claude_plugin_exports, {
|
|
19029
|
+
CONNECTOR_PLUGIN_DESCRIPTION: () => CONNECTOR_PLUGIN_DESCRIPTION,
|
|
19030
|
+
CONNECTOR_PLUGIN_NAME: () => CONNECTOR_PLUGIN_NAME,
|
|
19015
19031
|
HIMI_MARKETPLACE_NAME: () => HIMI_MARKETPLACE_NAME,
|
|
19016
19032
|
HIMI_MCP_SERVER: () => HIMI_MCP_SERVER,
|
|
19017
19033
|
HIMI_NPM_PACKAGE: () => HIMI_NPM_PACKAGE,
|
|
19018
19034
|
HIMI_PLUGIN_DESCRIPTION: () => HIMI_PLUGIN_DESCRIPTION,
|
|
19019
19035
|
HIMI_PLUGIN_NAME: () => HIMI_PLUGIN_NAME,
|
|
19036
|
+
connectorMarketplaceEntry: () => connectorMarketplaceEntry,
|
|
19037
|
+
connectorPluginFiles: () => connectorPluginFiles,
|
|
19038
|
+
connectorPluginManifest: () => connectorPluginManifest,
|
|
19020
19039
|
himiMarketplace: () => himiMarketplace,
|
|
19021
19040
|
himiPluginFiles: () => himiPluginFiles,
|
|
19022
19041
|
himiPluginManifest: () => himiPluginManifest,
|
|
@@ -19054,6 +19073,31 @@ function himiMarketplace(archiveUrl, sha2565) {
|
|
|
19054
19073
|
]
|
|
19055
19074
|
};
|
|
19056
19075
|
}
|
|
19076
|
+
function connectorPluginManifest() {
|
|
19077
|
+
return {
|
|
19078
|
+
name: CONNECTOR_PLUGIN_NAME,
|
|
19079
|
+
displayName: "Wix Native App Builder",
|
|
19080
|
+
description: CONNECTOR_PLUGIN_DESCRIPTION,
|
|
19081
|
+
author: { name: "Wix" },
|
|
19082
|
+
keywords: ["wix", "mobile", "ios", "android", "app-builder", "himi", "connector"]
|
|
19083
|
+
};
|
|
19084
|
+
}
|
|
19085
|
+
function connectorPluginFiles(mcpUrl, skillMd) {
|
|
19086
|
+
const json6 = (o) => `${JSON.stringify(o, null, 2)}
|
|
19087
|
+
`;
|
|
19088
|
+
return [
|
|
19089
|
+
{ path: ".claude-plugin/plugin.json", text: json6(connectorPluginManifest()) },
|
|
19090
|
+
{ path: ".mcp.json", text: json6({ mcpServers: { [CONNECTOR_PLUGIN_NAME]: { type: "http", url: mcpUrl } } }) },
|
|
19091
|
+
{ path: `skills/${CONNECTOR_PLUGIN_NAME}/SKILL.md`, text: skillMd }
|
|
19092
|
+
];
|
|
19093
|
+
}
|
|
19094
|
+
function connectorMarketplaceEntry(archiveUrl, sha2565) {
|
|
19095
|
+
return {
|
|
19096
|
+
name: CONNECTOR_PLUGIN_NAME,
|
|
19097
|
+
description: CONNECTOR_PLUGIN_DESCRIPTION,
|
|
19098
|
+
source: { source: "archive", url: archiveUrl, ...sha2565 ? { sha256: sha2565 } : {} }
|
|
19099
|
+
};
|
|
19100
|
+
}
|
|
19057
19101
|
function storeZip(files) {
|
|
19058
19102
|
const enc = new TextEncoder();
|
|
19059
19103
|
const entries = files.map((f) => ({ name: enc.encode(f.path), data: enc.encode(f.text) }));
|
|
@@ -19115,7 +19159,7 @@ function storeZip(files) {
|
|
|
19115
19159
|
}
|
|
19116
19160
|
return out2;
|
|
19117
19161
|
}
|
|
19118
|
-
var HIMI_PLUGIN_NAME, HIMI_MARKETPLACE_NAME, HIMI_NPM_PACKAGE, HIMI_MCP_SERVER, HIMI_PLUGIN_DESCRIPTION;
|
|
19162
|
+
var HIMI_PLUGIN_NAME, HIMI_MARKETPLACE_NAME, HIMI_NPM_PACKAGE, HIMI_MCP_SERVER, HIMI_PLUGIN_DESCRIPTION, CONNECTOR_PLUGIN_NAME, CONNECTOR_PLUGIN_DESCRIPTION;
|
|
19119
19163
|
var init_claude_plugin = __esm({
|
|
19120
19164
|
"../../packages/serve/src/claude-plugin.ts"() {
|
|
19121
19165
|
init_himi_package();
|
|
@@ -19124,6 +19168,8 @@ var init_claude_plugin = __esm({
|
|
|
19124
19168
|
HIMI_NPM_PACKAGE = "@wix/himalaya-cli";
|
|
19125
19169
|
HIMI_MCP_SERVER = { command: "npx", args: ["-y", HIMI_NPM_PACKAGE, "mcp"] };
|
|
19126
19170
|
HIMI_PLUGIN_DESCRIPTION = "Build native iOS + Android apps with Wix: the himi skill plus the himi MCP tools \u2014 validate, test, render, a live preview in your IDE, and draft publishing to Himi Player.";
|
|
19171
|
+
CONNECTOR_PLUGIN_NAME = "wix-native-app-builder";
|
|
19172
|
+
CONNECTOR_PLUGIN_DESCRIPTION = "Build native iOS + Android apps with Wix from a conversation: the Wix Native App Builder connector plus its skill. Publishes private drafts you preview in chat or on your phone with Himi Player.";
|
|
19127
19173
|
}
|
|
19128
19174
|
});
|
|
19129
19175
|
|
|
@@ -24589,7 +24635,6 @@ function shouldRevealError(args) {
|
|
|
24589
24635
|
var EMAIL_RE, URL_HOST_RE, INTEGER_RE, NUMBER_RE;
|
|
24590
24636
|
var init_validation = __esm({
|
|
24591
24637
|
"../../core/ts/src/validation.ts"() {
|
|
24592
|
-
"use strict";
|
|
24593
24638
|
EMAIL_RE = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*\.[A-Za-z]{2,}$/;
|
|
24594
24639
|
URL_HOST_RE = /^[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*(:[0-9]+)?$/;
|
|
24595
24640
|
INTEGER_RE = /^[+-]?[0-9]+$/;
|
|
@@ -28210,7 +28255,6 @@ function validateWorkerSubtree(raw, slotId, policy, actionCatalog) {
|
|
|
28210
28255
|
var WORKER_SUBTREE_CEILINGS, ID_PART, ACTION_ID;
|
|
28211
28256
|
var init_worker_subtree = __esm({
|
|
28212
28257
|
"../../core/ts/src/worker-subtree.ts"() {
|
|
28213
|
-
"use strict";
|
|
28214
28258
|
init_worker_subtree_safe_types_generated();
|
|
28215
28259
|
WORKER_SUBTREE_CEILINGS = Object.freeze({
|
|
28216
28260
|
maxEncodedBytes: 65536,
|
|
@@ -67572,6 +67616,10 @@ var ServeCliClient = class {
|
|
|
67572
67616
|
}
|
|
67573
67617
|
async request(plane, method, path2, opts = {}) {
|
|
67574
67618
|
const headers2 = { ...opts.headers };
|
|
67619
|
+
if (this.target.previewRoute) {
|
|
67620
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$/.test(this.target.previewRoute)) throw new Error("invalid_dist_preview_route");
|
|
67621
|
+
headers2["x-wix-route-serve"] = this.target.previewRoute;
|
|
67622
|
+
}
|
|
67575
67623
|
if (opts.body !== void 0) headers2["content-type"] = "application/json";
|
|
67576
67624
|
const carriesCredential = Object.keys(headers2).some((h2) => CREDENTIAL_HEADERS.has(h2.toLowerCase()));
|
|
67577
67625
|
const res = await this.fetchImpl(this.baseFor(plane) + path2, {
|
|
@@ -67874,8 +67922,19 @@ var ServeCliClient = class {
|
|
|
67874
67922
|
}
|
|
67875
67923
|
// ---- himi dist (QA binary builds brokered onto the Job Service Mac pool) ----
|
|
67876
67924
|
/** Request a QA build (POST /v1/admin/dist). Returns one job per requested platform. */
|
|
67877
|
-
|
|
67878
|
-
|
|
67925
|
+
assertWixAuthorizationTarget() {
|
|
67926
|
+
const url = new URL(this.baseFor("control"));
|
|
67927
|
+
const host = url.hostname.toLowerCase();
|
|
67928
|
+
const local = ["127.0.0.1", "localhost", "[::1]"].includes(host) && ["http:", "https:"].includes(url.protocol);
|
|
67929
|
+
const wix = url.protocol === "https:" && (host === "wix.com" || host.endsWith(".wix.com"));
|
|
67930
|
+
if (!local && !wix) throw new Error("customer_signing_untrusted_control_origin");
|
|
67931
|
+
}
|
|
67932
|
+
distCreate(body, options = {}) {
|
|
67933
|
+
if (options.wixAuthorization) this.assertWixAuthorizationTarget();
|
|
67934
|
+
return this.request("control", "POST", "/v1/admin/dist", {
|
|
67935
|
+
body,
|
|
67936
|
+
headers: { ...this.ctrlHeaders(), ...options.wixAuthorization ? { authorization: options.wixAuthorization } : {} }
|
|
67937
|
+
});
|
|
67879
67938
|
}
|
|
67880
67939
|
/** One job's record, refreshed from Job Service while it is still in flight. */
|
|
67881
67940
|
distStatus(jobId) {
|
|
@@ -70055,8 +70114,8 @@ var USAGE = `himi \u2014 the Himalaya authoring CLI (remote dev loop)
|
|
|
70055
70114
|
owner-lite | brandy | player | demo-app). --signing defaults to
|
|
70056
70115
|
wix-managed: the Wix Apple account mints a per-app
|
|
70057
70116
|
identity for the build, so you provision nothing.
|
|
70058
|
-
--signing byo
|
|
70059
|
-
|
|
70117
|
+
--signing byo --site <id> reuses your existing customer
|
|
70118
|
+
ad-hoc profile and certificate for iOS. --android-signing picks the KEYSTORE for an APK (a
|
|
70060
70119
|
separate axis from --signing, which is the Apple account):
|
|
70061
70120
|
qa-keystore (default, the repo's committed key \u2014 same on
|
|
70062
70121
|
every pool machine, so a build installs over the last one),
|
|
@@ -70341,7 +70400,7 @@ var COMMANDS = [
|
|
|
70341
70400
|
{ name: "patch", summary: 'change ONE item of a published app \u2014 a screen descriptor, a Tier-5 bundle, tokens, or the app-config baseline \u2014 from a RAW FILE, with no content package and no build. The low-level door: it does not lint your package, because there is no package here; `himi push --only <selector>` is the same edit with the full build + lint gate and is what to reach for when the package is in hand. Derives a new release from the app\'s current LIVE release, or from `--from-release <id>`. An explicit `--draft` or `--live` is REQUIRED \u2014 a patch has no default blast radius \u2014 and `--notes` is required with `--live` on a screen or app-config patch, because off-repo `gitSha` is "dev" and the ledger notes are then the only durable record of bytes that correspond to no commit. A branch does not merge: activating one derived from an older release reverts every item the patch does not move, so that case is refused until `--accept-regressions`. A bundle patch must repoint a screen (`--for-screen`) or the bytes land under a manifest key nothing reads. It cannot ADD a screen (screens are git-only, RFC 0012), never claims a slug \u2014 the app must already be published \u2014 and carries no attestation, source archive, assets, icon or minBinaryVersion, each named in the output.', required: "screen <id> --file <descriptor.json> [--bundle <sha256|none>] | bundle --file <bundle.js> (--for-screen <id>[,<id>] | --no-rebind) | tokens --file <tokens.json> | app-config --file <app-config.json> ; (--draft|--live) --app <a> [--from-release <id>] [--accept-regressions] [--label <n>] [--notes <t>] [--force] [--target <t>] (--control-token)" },
|
|
70342
70401
|
{ name: "flags", summary: "read and change the app's OPERATIONAL flags (RFC 0013) \u2014 `list` prints what the DEVICE door serves, `set <key> --definition` creates or replaces one, `ramp <key>` moves its rollout share or kills it, `rm <key>` deletes it and echoes the definition back so the removal is reversible. Every write is followed by a read of the same door the device uses, and the answer is reported as `servedNow`: flags are stored in the app's git-committed flags.json, so a control plane with no checkout accepts a write it will never serve.", required: "list|set|ramp|rm [<key>] [--definition <json|@file>] [--percent 0-100] [--enabled true|false] [--app <a>] (--control-token)" },
|
|
70343
70402
|
{ name: "visibility", summary: "read (no value) or set whether the public registry (/v1/apps + the Himi Player picker) LISTS the app. `public` lists it for everyone; `unlisted` hides it from listings while direct reads by app id \u2014 deep links, previews \u2014 keep working. App from --app or the content dir. Setting it needs no republish.", required: "[public|unlisted] [--app <a>] [--content <dir>] (--control-token)" },
|
|
70344
|
-
{ name: "dist", summary: "build an INSTALLABLE QA binary (signed IPA / APK) on the Wix Job Service Mac pool and return an install link \u2014 the serve plane brokers the job, the pool builds it. WAITS for the build by default (~4 min) and prints the install link; `--no-wait` returns a jobId immediately instead. Omitting `--release` builds whatever is LIVE for the app. A named draft is refused unless `--allow-draft` makes that exceptional build explicit. `status <jobId>` / `watch <jobId>` / `list --app <a>` / `cancel <jobId>` inspect and stop builds (`watch` reports up front whether the job mints its own signing identity or borrows one, so a doomed iOS build is cancellable in seconds rather than after the archive). Off-repo, name a target \u2014 `--target wix` for a self-serve Wix login or `--target bo` for the internal employee path (the in-repo default is a local dev plane that isn't reachable off-repo); self-serve callers may build their OWN apps under a tighter budget (2 in flight / 5 per 24h), while a manage-only owner-role credential is refused. `--shell` picks the native host to sign into (branded-lite | owner-lite | brandy | player | demo-app); `brandy` is the site shell \u2014 the customer's own website as native-framed tabs. `--signing` defaults to `wix-managed` \u2014 the Wix Apple account mints a per-app signing identity for the build, so the caller provisions no Apple credentials of their own; `--signing byo
|
|
70403
|
+
{ name: "dist", summary: "build an INSTALLABLE QA binary (signed IPA / APK) on the Wix Job Service Mac pool and return an install link \u2014 the serve plane brokers the job, the pool builds it. WAITS for the build by default (~4 min) and prints the install link; `--no-wait` returns a jobId immediately instead. Omitting `--release` builds whatever is LIVE for the app. A named draft is refused unless `--allow-draft` makes that exceptional build explicit. `status <jobId>` / `watch <jobId>` / `list --app <a>` / `cancel <jobId>` inspect and stop builds (`watch` reports up front whether the job mints its own signing identity or borrows one, so a doomed iOS build is cancellable in seconds rather than after the archive). Off-repo, name a target \u2014 `--target wix` for a self-serve Wix login or `--target bo` for the internal employee path (the in-repo default is a local dev plane that isn't reachable off-repo); self-serve callers may build their OWN apps under a tighter budget (2 in flight / 5 per 24h), while a manage-only owner-role credential is refused. `--shell` picks the native host to sign into (branded-lite | owner-lite | brandy | player | demo-app); `brandy` is the site shell \u2014 the customer's own website as native-framed tabs. `--signing` defaults to `wix-managed` \u2014 the Wix Apple account mints a per-app signing identity for the build, so the caller provisions no Apple credentials of their own; `--signing byo --site <id>` reuses an existing customer ad-hoc profile and certificate for iOS; requires an owned site and a completed personal signing binding. `--android-signing` is the Android counterpart and a SEPARATE axis (a keystore, not an Apple account): `qa-keystore` (default \u2014 the repo's committed QA key, identical on every pool machine, so a build installs over the previous one), `wix-keystore` (the Wix key the pool machine carries; the build FAILS naming the paths searched if it carries none, rather than quietly signing with something else), or `debug` (the old per-machine key \u2014 QA must uninstall any previous build first). NOT the normal way to ship: screens, Tier-5 bundles, tokens and app-config all go over the air with `himi push` in seconds \u2014 a binary trip is only needed for a NATIVE delta (a new SDUI component, a new declared capability/entitlement, a new bundle id, or a minBinaryVersion floor bump). Refuses to build an app whose launcher icon is missing, a placeholder, or one a store would reject \u2014 the one thing a binary carries that no later OTA push can fix; `--force` builds anyway", required: "[--app <a>] [--platform ios,android] [--release <id>] [--allow-draft] [--target <t>] [--shell branded-lite|owner-lite|brandy|player|demo-app] [--signing wix-managed|byo] [--site <id>] [--android-signing qa-keystore|wix-keystore|debug] [--borrow-ios-id <bundleId>] [--no-wait] [--force] | status <jobId> [--target <t>] | watch <jobId> [--target <t>] [--interval <ms>] | list --app <a> [--target <t>] | cancel <jobId> [--target <t>]" },
|
|
70345
70404
|
{ name: "testflight", summary: 'build, sign and upload an app to TestFlight (internal testers \u2014 no Beta App Review), then WAIT until App Store Connect finishes processing it. Sugar for `store upload --track testflight`. Prompts first: a build number is consumed permanently on a real Apple account and cannot be reused \u2014 `--yes` for CI, `--dry-run` to see the plan without touching anything. The wait is the real check, not a nicety: fastlane prints "Successfully uploaded" for a binary App Store Connect then rejects in processing, and a rejected binary leaves NO build record at all (the reason is emailed). Public App Store review is deliberately NOT automatable here \u2014 `--track appstore` is refused; use /submit-ios-app when you mean to go public', required: "<app> [--track testflight|internal] [--profile <name>] [--yes] [--dry-run] [--skip-build] [--no-wait] [--json]" },
|
|
70346
70405
|
{ name: "store", summary: "the App Store Connect group behind `testflight`. `preflight <app>` checks readiness offline (icon, entitlements, encryption flag, version, store.config ids, listing + review record); `upload <app>` is what `testflight` runs; `status <app>` reads live build + processing state. `--profile` selects WHICH App Store Connect account: an app built for a Wix customer ships under the CUSTOMER's Apple team (Apple guideline 4.2.6 forbids an app-generation service submitting on a client's behalf), declared per-app as ios.credentialProfile in store.config.yaml and resolved from ~/.himalaya/store-credentials/<name>.json \u2014 the .p8 itself never enters the repo", required: "preflight <app> [--profile <n>] | upload <app> [--track <t>] [--profile <n>] [--yes] [--dry-run] | status <app> [--profile <n>]" },
|
|
70347
70406
|
{ name: "guide", summary: "print the Himalaya overview + headless dev loop + available topics (offline)", required: "[--json]" },
|
|
@@ -76499,7 +76558,7 @@ ${label2}`);
|
|
|
76499
76558
|
if (!flags.json) {
|
|
76500
76559
|
io.log(` app ${rec.app} \xB7 ${rec.platform} \xB7 shell ${rec.shell ?? "?"} \xB7 ${String(rec.gitCommitSha ?? "").slice(0, 12)}`);
|
|
76501
76560
|
io.log(
|
|
76502
|
-
rec.platform !== "ios" ? " signing: n/a (android signs with its own keystore)" : minted ? " signing: MINTED \u2014 the job fetches its own identity; it will build under the app's own bundle id" : borrowed ? ` signing: BORROWED ${borrowed} \u2014 the binary carries another app's identifier and REPLACES it on the device` : " signing: none dispatched \u2014 the pool must find a profile itself, which fails when it has none.\n Minting is ON by default, so this means the serve plane either has HIMI_DIST_APPLE_SIGNING set to 0/false/off/no, or predates the minting route."
|
|
76561
|
+
rec.platform !== "ios" ? " signing: n/a (android signs with its own keystore)" : rec.signing === "byo" ? " signing: CUSTOMER \u2014 pinned personal team and ad-hoc profile; registered devices only" : minted ? " signing: MINTED \u2014 the job fetches its own identity; it will build under the app's own bundle id" : borrowed ? ` signing: BORROWED ${borrowed} \u2014 the binary carries another app's identifier and REPLACES it on the device` : " signing: none dispatched \u2014 the pool must find a profile itself, which fails when it has none.\n Minting is ON by default, so this means the serve plane either has HIMI_DIST_APPLE_SIGNING set to 0/false/off/no, or predates the minting route."
|
|
76503
76562
|
);
|
|
76504
76563
|
if (rec.buildUrl) io.log(` log ${rec.buildUrl}`);
|
|
76505
76564
|
}
|
|
@@ -76579,6 +76638,19 @@ ${label2}`);
|
|
|
76579
76638
|
}
|
|
76580
76639
|
const { captchaContentInput: captchaContentInput2 } = await Promise.resolve().then(() => (init_captcha2(), captcha_exports));
|
|
76581
76640
|
const captchaSiteId = str7(flags.site) ?? captchaContentInput2(contentDir(flags)).siteId;
|
|
76641
|
+
let wixAuthorization;
|
|
76642
|
+
if (str7(flags.signing)?.trim().toLowerCase() === "byo") {
|
|
76643
|
+
try {
|
|
76644
|
+
c.assertWixAuthorizationTarget();
|
|
76645
|
+
wixAuthorization = await accountToken();
|
|
76646
|
+
} catch {
|
|
76647
|
+
print({
|
|
76648
|
+
error: "customer_signing_authorization_unavailable",
|
|
76649
|
+
hint: "BYO requires a Wix control URL (or loopback) and an existing Wix CLI login. Run `wix login`, then retry."
|
|
76650
|
+
});
|
|
76651
|
+
return 1;
|
|
76652
|
+
}
|
|
76653
|
+
}
|
|
76582
76654
|
let r;
|
|
76583
76655
|
try {
|
|
76584
76656
|
r = await c.distCreate({
|
|
@@ -76597,13 +76669,14 @@ ${label2}`);
|
|
|
76597
76669
|
...str7(flags["borrow-ios-id"]) ? { borrowIosBundleId: str7(flags["borrow-ios-id"]) } : {},
|
|
76598
76670
|
...str7(flags.destination) ? { destination: str7(flags.destination) } : {},
|
|
76599
76671
|
...str7(flags.signing) ? { signing: str7(flags.signing) } : {},
|
|
76672
|
+
...str7(flags.site) ? { site: str7(flags.site) } : {},
|
|
76600
76673
|
// WHICH KEYSTORE signs the APK. A separate axis from --signing (that one is the Apple
|
|
76601
76674
|
// account), so a `--platform ios,android` build can say "Wix-managed on iOS, the QA
|
|
76602
76675
|
// keystore on Android" — the normal combination — with one command.
|
|
76603
76676
|
// flags["android-signing"], NOT flags.androidSigning: parseFlags does no kebab→camel
|
|
76604
76677
|
// conversion, so the camel form reads undefined and the flag is a silent no-op.
|
|
76605
76678
|
...str7(flags["android-signing"]) ? { androidSigning: str7(flags["android-signing"]) } : {}
|
|
76606
|
-
});
|
|
76679
|
+
}, { wixAuthorization });
|
|
76607
76680
|
} catch (e) {
|
|
76608
76681
|
return distUnreachable(e);
|
|
76609
76682
|
}
|
|
@@ -76612,6 +76685,7 @@ ${label2}`);
|
|
|
76612
76685
|
return 1;
|
|
76613
76686
|
}
|
|
76614
76687
|
const jobs = r.json?.jobs ?? [];
|
|
76688
|
+
const failures = r.json?.failures ?? [];
|
|
76615
76689
|
for (const line of shellShaDivergenceWarnings(jobs)) (flags.json === true ? io.error : io.log)(line);
|
|
76616
76690
|
const noWait = flags["no-wait"] === true || flags.wait === false;
|
|
76617
76691
|
if (noWait) {
|
|
@@ -76620,8 +76694,9 @@ ${label2}`);
|
|
|
76620
76694
|
const t = str7(flags.target);
|
|
76621
76695
|
const targetArg = t ? ` --target ${t}` : "";
|
|
76622
76696
|
for (const j of jobs) io.log(` ${j.platform} ${j.jobId} \u2192 himi dist status ${j.jobId}${targetArg}`);
|
|
76697
|
+
for (const f of failures) io.error(` ${f.platform} ${f.error}: ${f.message}`);
|
|
76623
76698
|
}
|
|
76624
|
-
return 0;
|
|
76699
|
+
return failures.length ? 1 : 0;
|
|
76625
76700
|
}
|
|
76626
76701
|
const intervalMs = Number(str7(flags.interval)) || 2e4;
|
|
76627
76702
|
const timeoutMs = Number(str7(flags.timeout)) || 45 * 6e4;
|
|
@@ -76636,7 +76711,8 @@ ${label2}`);
|
|
|
76636
76711
|
error: "dist_wait_timeout",
|
|
76637
76712
|
waitedMs: timeoutMs,
|
|
76638
76713
|
pending: [...pending.keys()],
|
|
76639
|
-
finished: flags.json === true ? done : done.map(humanDistJob)
|
|
76714
|
+
finished: flags.json === true ? done : done.map(humanDistJob),
|
|
76715
|
+
...failures.length ? { failures } : {}
|
|
76640
76716
|
});
|
|
76641
76717
|
return 1;
|
|
76642
76718
|
}
|
|
@@ -76655,8 +76731,8 @@ ${label2}`);
|
|
|
76655
76731
|
}
|
|
76656
76732
|
}
|
|
76657
76733
|
}
|
|
76658
|
-
const allOk = done.every((d) => d.status === "SUCCESS");
|
|
76659
|
-
print({ ok: allOk, jobs: flags.json === true ? done : done.map(humanDistJob) });
|
|
76734
|
+
const allOk = failures.length === 0 && done.every((d) => d.status === "SUCCESS");
|
|
76735
|
+
print({ ok: allOk, jobs: flags.json === true ? done : done.map(humanDistJob), ...failures.length ? { failures } : {} });
|
|
76660
76736
|
await printDistQrsForJobs(done);
|
|
76661
76737
|
return allOk ? 0 : 1;
|
|
76662
76738
|
}
|
|
@@ -285,10 +285,10 @@ project settings or output. Enter Later to defer and continue building.
|
|
|
285
285
|
`notify status` is read-only and needs no key files; `--refresh` checks providers live.
|
|
286
286
|
Backend readiness does not prove notification delivery. This setup does not rewrite native
|
|
287
287
|
configuration, select a Ping family, build a binary, register a device or send a notification.
|
|
288
|
-
Continue building and publishing app content.
|
|
289
|
-
|
|
290
|
-
binary
|
|
291
|
-
retrying; the CLI does not automatically repeat provisioning.
|
|
288
|
+
Continue building and publishing app content. For a customer push test, use the
|
|
289
|
+
`himi dist --signing byo` flow below with existing signing assets and matching native configuration.
|
|
290
|
+
The default Wix-managed binary does not match the customer's Apple identity. After an uncertain
|
|
291
|
+
setup response, inspect status before retrying; the CLI does not automatically repeat provisioning.
|
|
292
292
|
|
|
293
293
|
Full inputs, script flags and status meanings: `himi docs push-cli-onboarding`
|
|
294
294
|
(https://apps.wix.com/_api/himi-serve/docs/push-cli-onboarding.md). The guide is bundled with the public npm package
|
|
@@ -321,11 +321,28 @@ bundle id per job — there is no profile to pre-provision and nothing to borrow
|
|
|
321
321
|
<bundleId>` still exists as an escape hatch (the binary then installs under *that* id, which is
|
|
322
322
|
fine for QA and wrong for anything else), but it is rarely what you want.
|
|
323
323
|
For customer push credentials, the binary's Apple team, bundle ID and APNs environment must
|
|
324
|
-
match the saved delivery configuration.
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
324
|
+
match the saved delivery configuration. Use the app owner's account for both logins and
|
|
325
|
+
select the deployed customer target explicitly:
|
|
326
|
+
|
|
327
|
+
```sh
|
|
328
|
+
himi login --browser --target wix
|
|
329
|
+
wix login
|
|
330
|
+
himi dist --app <app> --release <release-id> --site <owned-site-id> \
|
|
331
|
+
--platform ios,android --signing byo --android-signing qa-keystore --wait --target wix
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
The deployed backend and reachable runner source must support BYO. iOS reuses the customer's
|
|
335
|
+
existing distribution certificate and ad-hoc profile, which must include the test iPhone and
|
|
336
|
+
production APNs entitlement; the build does not create or revoke Apple assets. The remote runner
|
|
337
|
+
imports the identity into its agent keychain and removes the imported identity and profile copies
|
|
338
|
+
afterward, preserving that keychain.
|
|
339
|
+
|
|
340
|
+
For Android, this customer flow currently supports the `branded-lite` shell and retrieves the
|
|
341
|
+
site's package-matched Firebase `google-services.json`. `--android-signing qa-keystore` signs
|
|
342
|
+
the APK with Himi's stable QA key, not a customer Play signing key. Firebase configuration enables
|
|
343
|
+
push registration; it does not sign the APK. Native Ping wiring, member/device registration,
|
|
344
|
+
and a targeted delivery/tap test are still required after installation. A ready backend or a
|
|
345
|
+
successful build alone does not prove push delivery.
|
|
329
346
|
|
|
330
347
|
**Android signing needs nothing either.** `--android-signing` defaults to `qa-keystore` — the
|
|
331
348
|
repo's committed QA key, identical on every pool machine, so a new build installs *over* the last
|
package/guides/himi-skill.md
CHANGED
|
@@ -314,10 +314,10 @@ project settings or output. Enter Later to defer and continue building.
|
|
|
314
314
|
`notify status` is read-only and needs no key files; `--refresh` checks providers live.
|
|
315
315
|
Backend readiness does not prove notification delivery. This setup does not rewrite native
|
|
316
316
|
configuration, select a Ping family, build a binary, register a device or send a notification.
|
|
317
|
-
Continue building and publishing app content.
|
|
318
|
-
|
|
319
|
-
binary
|
|
320
|
-
retrying; the CLI does not automatically repeat provisioning.
|
|
317
|
+
Continue building and publishing app content. For a customer push test, use the
|
|
318
|
+
`himi dist --signing byo` flow below with existing signing assets and matching native configuration.
|
|
319
|
+
The default Wix-managed binary does not match the customer's Apple identity. After an uncertain
|
|
320
|
+
setup response, inspect status before retrying; the CLI does not automatically repeat provisioning.
|
|
321
321
|
|
|
322
322
|
Full inputs, script flags and status meanings: `himi docs push-cli-onboarding`
|
|
323
323
|
(https://apps.wix.com/_api/himi-serve/docs/push-cli-onboarding.md). The guide is bundled with the public npm package
|
|
@@ -350,11 +350,28 @@ bundle id per job — there is no profile to pre-provision and nothing to borrow
|
|
|
350
350
|
<bundleId>` still exists as an escape hatch (the binary then installs under *that* id, which is
|
|
351
351
|
fine for QA and wrong for anything else), but it is rarely what you want.
|
|
352
352
|
For customer push credentials, the binary's Apple team, bundle ID and APNs environment must
|
|
353
|
-
match the saved delivery configuration.
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
353
|
+
match the saved delivery configuration. Use the app owner's account for both logins and
|
|
354
|
+
select the deployed customer target explicitly:
|
|
355
|
+
|
|
356
|
+
```sh
|
|
357
|
+
himi login --browser --target wix
|
|
358
|
+
wix login
|
|
359
|
+
himi dist --app <app> --release <release-id> --site <owned-site-id> \
|
|
360
|
+
--platform ios,android --signing byo --android-signing qa-keystore --wait --target wix
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
The deployed backend and reachable runner source must support BYO. iOS reuses the customer's
|
|
364
|
+
existing distribution certificate and ad-hoc profile, which must include the test iPhone and
|
|
365
|
+
production APNs entitlement; the build does not create or revoke Apple assets. The remote runner
|
|
366
|
+
imports the identity into its agent keychain and removes the imported identity and profile copies
|
|
367
|
+
afterward, preserving that keychain.
|
|
368
|
+
|
|
369
|
+
For Android, this customer flow currently supports the `branded-lite` shell and retrieves the
|
|
370
|
+
site's package-matched Firebase `google-services.json`. `--android-signing qa-keystore` signs
|
|
371
|
+
the APK with Himi's stable QA key, not a customer Play signing key. Firebase configuration enables
|
|
372
|
+
push registration; it does not sign the APK. Native Ping wiring, member/device registration,
|
|
373
|
+
and a targeted delivery/tap test are still required after installation. A ready backend or a
|
|
374
|
+
successful build alone does not prove push delivery.
|
|
358
375
|
|
|
359
376
|
**Android signing needs nothing either.** `--android-signing` defaults to `qa-keystore` — the
|
|
360
377
|
repo's committed QA key, identical on every pool machine, so a new build installs *over* the last
|
|
@@ -84,11 +84,27 @@ native distribution. Native push configuration, member authentication, device-to
|
|
|
84
84
|
registration and a delivery/tap test are still required. This command does not enable
|
|
85
85
|
native capabilities, choose a Ping family, send notifications or verify phone delivery.
|
|
86
86
|
|
|
87
|
-
**Customer
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
87
|
+
**Customer push QA builds use `himi dist --signing byo`.** After publishing an approved
|
|
88
|
+
release, use a backend and reachable runner source that support the customer-signing flow.
|
|
89
|
+
Use the app owner's account for both logins and explicitly select the deployed customer target:
|
|
90
|
+
|
|
91
|
+
```sh
|
|
92
|
+
himi login --browser --target wix
|
|
93
|
+
wix login
|
|
94
|
+
himi dist --app <app> --release <release-id> --site <owned-site-id> \
|
|
95
|
+
--platform ios,android --signing byo --android-signing qa-keystore --wait --target wix
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
iOS reuses the customer's existing distribution certificate and ad-hoc profile. The profile
|
|
99
|
+
must include the test iPhone and production APNs entitlement; Apple team, bundle ID and APNs
|
|
100
|
+
environment must match the saved push configuration. The build does not create or revoke Apple
|
|
101
|
+
assets. The default Wix-managed binary uses a different Apple identity.
|
|
102
|
+
|
|
103
|
+
Android currently requires the `branded-lite` shell and the site's package-matched Firebase
|
|
104
|
+
`google-services.json`. The APK is signed with Himi's stable QA keystore; Firebase does not sign it,
|
|
105
|
+
and this flow does not retrieve a customer Play signing key. Native push wiring, member/device
|
|
106
|
+
registration and a targeted delivery/tap test remain required. Backend readiness and a successful
|
|
107
|
+
build do not prove device delivery. See [QA builds](qa-builds.md) for prerequisites and diagnostics.
|
|
92
108
|
|
|
93
109
|
`himi notify send|tokens|doctor` keep their existing local admin-server behavior; they
|
|
94
110
|
are separate from the backend `setup|status` commands.
|
package/guides/qa-builds.md
CHANGED
|
@@ -143,13 +143,49 @@ The chosen policy is written to the job record (`signing`), so `himi dist status
|
|
|
143
143
|
answer "whose certificate is on this binary" without re-deriving it from serve config that may
|
|
144
144
|
have changed since.
|
|
145
145
|
|
|
146
|
-
**`--signing byo`**
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
146
|
+
**`--signing byo`** uses an owned Wix site and its existing personal Apple distribution certificate
|
|
147
|
+
and ad-hoc profile. Himi checks site ownership, the app's recorded native ID, profile
|
|
148
|
+
type, certificate match, expiry, registered devices and production APNs entitlement before dispatch.
|
|
149
|
+
It selects an existing compatible ad-hoc profile; the build does not create or revoke Apple assets.
|
|
150
|
+
The runner fetches the certificate and profile using both its job token and a short-lived Buildkite
|
|
151
|
+
identity token; the job token alone cannot authorize the download.
|
|
152
|
+
|
|
153
|
+
On the Job Service `nodeCommandOptions` runner, Himi imports the customer's signing identity into
|
|
154
|
+
the agent's **existing keychain**, using the agent-provided `KEYCHAIN_PASSWORD`. It checks identity
|
|
155
|
+
discovery and noninteractive signing before archiving, then verifies the finished IPA. Cleanup
|
|
156
|
+
deletes the imported customer identity (certificate and private key), the profile copies installed
|
|
157
|
+
by this job, and its temporary files. It preserves the agent's keychain; it does not revoke the
|
|
158
|
+
certificate or delete the original profile in Apple/Branded. A matching identity already in the
|
|
159
|
+
keychain is refused before import so cleanup cannot delete a pre-existing identity.
|
|
160
|
+
|
|
161
|
+
Outside that runner mode, Himi creates a temporary keychain and deletes it during cleanup. A
|
|
162
|
+
missing password or keychain in agent-keychain mode fails the build instead of silently switching
|
|
163
|
+
modes. Private key material does not enter job parameters or the public job record. The runner
|
|
164
|
+
source SHA must advertise support for this protocol and be reachable from the pool before BYO
|
|
165
|
+
dispatch is accepted. See [runner authentication](apple-signing-provisioning.md#customer-qa-runner-authentication-protocol-2).
|
|
166
|
+
|
|
167
|
+
For an owned app using push, `himi notify setup --content <dir> --site <site-id>` provisions the
|
|
168
|
+
backend and `himi notify status --content <dir> --site <site-id> --refresh` checks its current
|
|
169
|
+
Branded/Ping configuration. These commands require both a Himi control
|
|
170
|
+
credential and Wix account authorization. A `ready` setup record is a backend checkpoint, not proof
|
|
171
|
+
that a binary installed, registered a member, received a notification or opened its destination.
|
|
172
|
+
After publishing an approved release, use the app owner's account for both logins and explicitly
|
|
173
|
+
select the deployed customer target for the paired QA build:
|
|
174
|
+
|
|
175
|
+
```sh
|
|
176
|
+
himi login --browser --target wix
|
|
177
|
+
wix login
|
|
178
|
+
himi dist --app <app> --release <release-id> --site <owned-site-id> \
|
|
179
|
+
--platform ios,android --signing byo --android-signing qa-keystore --wait --target wix
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
The Android customer-config path currently supports the `branded-lite` shell. It reads that site's
|
|
183
|
+
`BrandedApp.buildConfig.android.googleServicesJson` and refuses an unsupported shell, a missing file,
|
|
184
|
+
or a wrong-package Firebase client. It builds with the customer file and signs with the
|
|
185
|
+
stable QA keystore. Each platform has its own job status and artifact link. If one platform cannot
|
|
186
|
+
dispatch or build, the CLI returns a nonzero result while preserving the other platform's completed
|
|
187
|
+
job and link. A successful artifact upload proves only that the recorded binary was built and stored;
|
|
188
|
+
device installation, Ping registration, delivery and destination routing require separate checks.
|
|
153
189
|
|
|
154
190
|
**`himi dist` waits by default** and prints the install link; `--no-wait` gives you a job id back
|
|
155
191
|
immediately plus a Buildkite URL for the live log. Waiting is the right shape for ONE build;
|
package/guides/release-notes.md
CHANGED
|
@@ -14,6 +14,15 @@ 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-28
|
|
18
|
+
|
|
19
|
+
### Logic, data & SDKs
|
|
20
|
+
|
|
21
|
+
- **`@himalaya/wix-comments` now exposes every `@wix/comments` module as a namespace**
|
|
22
|
+
(`comments`, `ratings`, `widgets`, `categories`, `commentContexts`, `contentRevisions`), called
|
|
23
|
+
with the REST request object — e.g. `comments.createComment({ comment })`. Existing imports are
|
|
24
|
+
unchanged. (#3476)
|
|
25
|
+
|
|
17
26
|
## 2026-09-25
|
|
18
27
|
|
|
19
28
|
### Preview, push & release
|