@wix/agent-skills 1.15.0 → 1.15.1
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/README.md +8 -0
- package/package.json +1 -1
- package/skills/wix-app/references/DATA_COLLECTION.md +5 -3
- package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +2 -0
- package/skills/wix-app/references/STORES_VERSIONING.md +9 -211
- package/skills/wix-app/references/backend-event/COMMON-EVENTS.md +5 -0
- package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +151 -0
- package/skills/wix-app/references/editor-react-component/COMPONENT-PREVIEW.md +57 -0
- package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +6 -0
- package/skills/wix-app/references/editor-react-component/REACT-GUIDELINES.md +3 -1
- package/skills/wix-app/references/stores/CATEGORIES.md +22 -0
- package/skills/wix-app/references/stores/GET_PRODUCT.md +99 -0
- package/skills/wix-app/references/stores/INVENTORY.md +37 -0
- package/skills/wix-app/references/stores/QUERY.md +87 -0
- package/skills/wix-app/references/stores/WRITE.md +55 -0
- package/skills/wix-headless/SKILL.md +6 -1
- package/skills/wix-headless/entry/bootstrap.mjs +2 -2
- package/skills/wix-headless/entry/skill.md +0 -2
- package/skills/wix-headless/references/CAPABILITIES.md +6 -4
- package/skills/wix-headless/references/DISCOVERY.md +1 -1
- package/skills/wix-headless/references/FEEDBACK.md +16 -5
- package/skills/wix-headless/references/SDK_HANDOFF.md +2 -0
- package/skills/wix-headless/references/SEED.md +3 -1
- package/skills/wix-headless/references/SETUP.md +1 -1
- package/skills/wix-headless/references/inline-recipes/how-to-code-restaurant-reservations.md +42 -2
- package/skills/wix-headless/references/inline-recipes/setup-bookings.md +5 -1
- package/skills/wix-headless/references/inline-recipes/setup-forms.md +1 -1
- package/skills/wix-headless/references/inline-recipes/setup-online-store.md +21 -5
- package/skills/wix-headless/references/inline-recipes/setup-portfolio.md +3 -1
- package/skills/wix-headless/references/inline-recipes/setup-restaurant-experiences.md +73 -0
- package/skills/wix-headless/references/inline-recipes/setup-restaurant-orders.md +38 -2
- package/skills/wix-headless/references/inline-recipes/setup-restaurant-reservations.md +20 -1
- package/skills/wix-headless/references/inline-recipes/setup-restaurants.md +1 -1
- package/skills/wix-headless/references/managed/CONNECT.md +1 -1
- package/skills/wix-headless/references/managed/CREATE.md +1 -1
- package/skills/wix-headless/references/managed/DEPLOYMENT.md +22 -0
- package/skills/wix-headless/references/self-managed/DEPLOYMENT.md +8 -0
- package/skills/wix-headless/references/stripe/DEPLOYMENT.md +8 -0
- package/skills/wix-manage/SKILL.md +8 -5
- package/skills/wix-manage/references/analytics/query-site-analytics.md +66 -9
- package/skills/wix-manage/references/app-installation/install-wix-apps.md +3 -0
- package/skills/wix-manage/references/bookings/create-booking-service-from-prompt.md +6 -5
- package/skills/wix-manage/references/bookings/create-course-service.md +30 -5
- package/skills/wix-manage/references/bookings/diagnose-availability-issues.md +76 -42
- package/skills/wix-manage/references/cms/cms-schema-management.md +6 -0
- package/skills/wix-manage/references/get-paid/how-to-setup-wix-payments.md +30 -7
- package/skills/wix-manage/references/marketing/create-and-publish-social-post.md +225 -144
- package/skills/wix-manage/references/marketing/generate-and-publish-marketing-plan.md +19 -10
- package/skills/wix-manage/references/sites/site-import.md +270 -0
- package/skills/wix-manage/references/stores/create-product-from-image.md +8 -6
- package/skills/wix-manage/references/stores/create-product-with-options-catalog-v3.md +16 -10
- package/skills/wix-vibe-headless/SKILL.md +6 -0
- package/skills/wix-vibe-headless/platforms/README.md +22 -0
- package/skills/wix-vibe-headless/platforms/base44.md +142 -0
- package/skills/wix-vibe-headless/platforms/generic.md +87 -0
- package/skills/wix-vibe-headless/references/bookings/INSTRUCTIONS.md +5 -1
- package/skills/wix-vibe-headless/references/bookings/wix-bookings-services.js +3 -1
- package/skills/wix-vibe-headless/references/events/wix-events-browse.js +2 -1
- package/skills/wix-vibe-headless/references/portfolio/wix-portfolio.js +84 -55
- package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +11 -2
- package/skills/wix-vibe-headless/references/storefront/wix-store-catalog.js +5 -1
|
@@ -4,6 +4,22 @@ description: "End-to-end flow to generate an AI-powered social media marketing p
|
|
|
4
4
|
---
|
|
5
5
|
# RECIPE: Generate a Marketing Plan and Schedule Its Posts
|
|
6
6
|
|
|
7
|
+
## THE PROTOCOL (read this first — every rule is mandatory)
|
|
8
|
+
|
|
9
|
+
Walk every marketing-plan request through this conversation, in this order. Skip a step only when the user's own words in this conversation already answered it.
|
|
10
|
+
|
|
11
|
+
1. **Open with the current state.** Fetch the plan (STEP 3 endpoint) and the marketing settings (`GET .../marketing-settings`). Tell the user what the plan is shaped by and what they can change: goal, marketing tools, content pillars (topics), tone of voice, point of view, business profile, and per-tool cadence. Say which inputs are site-derived and **read-only**: language, business/target locations, industry — those change in the site's Language & Region / SEO business-location settings, never through marketing settings (details in STEP 1).
|
|
12
|
+
2. **Decide the settings with the user.** For each setting they want to change, use their words. If they want help choosing, fetch the selectable values (`GET .../marketing-settings/plan-goal-options`, `GET .../marketing-settings/defaults`) and propose suggestions for them to confirm. Write only values the user gave or confirmed; leave everything else to the site defaults. Never fabricate a goal, tone, or topic list on their behalf, and never put `language`, `targetLocations`, or `businessLocation` in the request or claim the call changed them.
|
|
13
|
+
3. **Save, then offer to generate.** Upsert the confirmed settings (STEP 1, `fieldMask` as a comma-separated string matching exactly what you send), then offer to generate the plan — or, if a plan already exists, to regenerate it so the new settings take effect (settings are read only at generation time; use the keyword-research variant when `topics` changed). Poll until `ACTIVE` (STEPs 2-3).
|
|
14
|
+
4. **Present the plan from the API data only.** Show the returned activities and their post drafts. Never invent activities, dates, or captions and present them as "the plan" — if it isn't in the response, it isn't in the plan (also applies to STEP 5's post generation).
|
|
15
|
+
5. **Show before scheduling.** Scheduling publishes AI-generated drafts. Before Schedule Drafts (STEP 4), show each draft's caption and media (render the image inline, or give its URL) and get explicit approval. Schedule exactly what was approved — never regenerate after approval.
|
|
16
|
+
6. **Diff the schedule response.** Only drafts for Publisher-connected channels are scheduled; the rest silently stay `DRAFT`. Compare the returned `SCHEDULED` ids against the ids you sent, and tell the user which drafts didn't schedule and which channel needs connecting (STEP 4).
|
|
17
|
+
7. **Respect cutoffs and gates.** Skip `TWITTER` drafts dated after July 31, 2026. `FAILED_PRECONDITION` on Schedule Drafts means the plan lacks the premium scheduling feature: say so once and stop; it is not a transient error to retry.
|
|
18
|
+
|
|
19
|
+
The rest of this recipe is the reference for executing each step.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
7
23
|
This recipe generates a site's AI marketing plan — a schedule of marketing activities (social campaigns, blog posts, emails) from today through the end of next month — and schedules the social posts it generates. Generation is **asynchronous and non-deterministic**: you fire it, poll until it's ready, then act on the results.
|
|
8
24
|
|
|
9
25
|
Base URL for all endpoints: `https://www.wixapis.com/promote/marketing-plan-service/v1`.
|
|
@@ -20,7 +36,7 @@ For a first-time plan, configure marketing settings **before** generating (STEP
|
|
|
20
36
|
|
|
21
37
|
**API Endpoint:** `POST https://www.wixapis.com/promote/marketing-plan-service/v1/marketing-settings`
|
|
22
38
|
|
|
23
|
-
Both `marketingSettings` and `fieldMask` are **required**. `fieldMask`
|
|
39
|
+
Both `marketingSettings` and `fieldMask` are **required**. `fieldMask` is a **single comma-separated string** of the paths to write (proto3 field-mask form) — **not a JSON array**. Sending it as an array (`["settings.marketingPlanGoal", …]`) fails with `400` `"Failed to parse request message"`. Every path in `fieldMask` must also be present in `marketingSettings`, or the call fails with `INVALID_FIELD_MASK_ERROR`.
|
|
24
40
|
|
|
25
41
|
**Language and location cannot be set here.** If the request targets a language or a place ("posts in Spanish", "customers near Berlin"), those are site-derived, read-only fields on marketing settings — never put `language`, `targetLocations`, or `businessLocation` in the request, and never tell the user this call changed them. Set the fields that do belong here (goal, tone, audience description), and direct the user to the site-level settings for the rest — see **What you can't set here** below.
|
|
26
42
|
|
|
@@ -39,15 +55,7 @@ Both `marketingSettings` and `fieldMask` are **required**. `fieldMask` lists the
|
|
|
39
55
|
"socialMarketing": { "frequency": { "interval": "WEEK", "count": 3 } }
|
|
40
56
|
}
|
|
41
57
|
},
|
|
42
|
-
"fieldMask":
|
|
43
|
-
"settings.marketingPlanGoal",
|
|
44
|
-
"settings.marketingTools",
|
|
45
|
-
"settings.topics",
|
|
46
|
-
"settings.toneOfVoice",
|
|
47
|
-
"settings.pointOfView",
|
|
48
|
-
"settings.businessProfile",
|
|
49
|
-
"overrides.socialMarketing.frequency"
|
|
50
|
-
]
|
|
58
|
+
"fieldMask": "settings.marketingPlanGoal,settings.marketingTools,settings.topics,settings.toneOfVoice,settings.pointOfView,settings.businessProfile,overrides.socialMarketing.frequency"
|
|
51
59
|
}
|
|
52
60
|
```
|
|
53
61
|
|
|
@@ -189,6 +197,7 @@ For activities that have no `items` yet, generate their posts, then schedule the
|
|
|
189
197
|
| Symptom | Cause | Fix |
|
|
190
198
|
| --- | --- | --- |
|
|
191
199
|
| Plan `status: FAILED`, or `ACTIVE` with no posts | Site not published, or `SOCIAL_MARKETING` not enabled in settings | Publish the site; ensure `settings.marketingTools` includes `SOCIAL_MARKETING`, then regenerate (STEP 2) |
|
|
200
|
+
| `400` `"Failed to parse request message"` on Upsert Marketing Settings | `fieldMask` sent as a JSON array (or `{ "paths": [...] }`) instead of a comma-separated string | Send `fieldMask` as a single comma-separated string, e.g. `"settings.marketingPlanGoal,settings.toneOfVoice"` |
|
|
192
201
|
| `INVALID_FIELD_MASK_ERROR` on Upsert Marketing Settings | A `fieldMask` path is missing from `marketingSettings` | Include every `fieldMask` path in the `marketingSettings` body |
|
|
193
202
|
| Language, region, or location "won't change" via Upsert Marketing Settings | Those fields are read-only here (site-derived) | Change them in the site's Language & Region / SEO business-location settings, then regenerate |
|
|
194
203
|
| `FAILED_PRECONDITION` on Schedule Drafts | Plan lacks the schedule-posts premium feature | Advise upgrading the social media marketing plan |
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: "Site Import"
|
|
3
|
+
description: Drive the Wix Site Import agent to migrate an existing store or site from another platform (Shopify, WooCommerce, Magento, or any URL) into Wix. Use this skill whenever the user wants to import, migrate, or clone a store/site into Wix, mentions moving off Shopify/WooCommerce/Magento, or gives a source store URL and asks to bring it into Wix. Covers starting the import, polling progress, answering the agent's mid-import questions, handling deploy/failure/auth-expiry states, and sending post-deploy follow-up changes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Site Import
|
|
7
|
+
|
|
8
|
+
Drives an autonomous Wix-hosted import agent over REST to migrate a store/site
|
|
9
|
+
from another platform into Wix. You act as the relay between the user and the
|
|
10
|
+
agent: start the job, poll it, surface its questions and progress like a chat,
|
|
11
|
+
and report the final result.
|
|
12
|
+
|
|
13
|
+
## Golden rules — apply to every single message
|
|
14
|
+
|
|
15
|
+
1. **Only `DEPLOYED` means the site is live.** Any other status — including
|
|
16
|
+
`AUTH_EXPIRED` — means there is NO finished site yet. Never declare
|
|
17
|
+
success, completion, or "your site is live" otherwise, and never present a
|
|
18
|
+
URL from any other source as the result.
|
|
19
|
+
2. **Never show the user ids** (`importId`), raw JSON, or HTTP codes. Track
|
|
20
|
+
them silently.
|
|
21
|
+
3. **Never offer menus of monitoring or technical options** — pick the right
|
|
22
|
+
behavior yourself and do it quietly.
|
|
23
|
+
4. **Plain language only** — write for a shopkeeper, not an engineer.
|
|
24
|
+
5. **This API is the only site-creation tool for this task** — never
|
|
25
|
+
substitute other Wix site-builder tools (see Scope).
|
|
26
|
+
|
|
27
|
+
Base URL: `https://www.wixapis.com/site-import`. All calls are scoped to the
|
|
28
|
+
signed-in Wix user's account (use the Wix API tool available in this
|
|
29
|
+
environment for auth — never handle credentials directly). A full import
|
|
30
|
+
typically takes 15–60 minutes.
|
|
31
|
+
|
|
32
|
+
Example: Start is `POST https://www.wixapis.com/site-import/v1/imports`;
|
|
33
|
+
all endpoint paths below are relative to the base URL.
|
|
34
|
+
|
|
35
|
+
## Calling the API (important — read before your first call)
|
|
36
|
+
|
|
37
|
+
This API is **deliberately not listed in the public Wix REST documentation**,
|
|
38
|
+
so do NOT search the Wix docs / API spec for it — the search will come up
|
|
39
|
+
empty every time. That is expected and is NOT a reason to stop, ask the user
|
|
40
|
+
for "special permissions", or switch to a different import product. This
|
|
41
|
+
skill is the documentation; the endpoints below are real and live.
|
|
42
|
+
|
|
43
|
+
With the Wix MCP in Claude, call them through `ExecuteWixAPI` using
|
|
44
|
+
`wix.request` with `scope: "account"` and the **full URL**. Cite
|
|
45
|
+
`sourceDocUrls: ["user-provided"]` (the user supplied this skill). Set
|
|
46
|
+
`hasMutations: true` for Start/Reply/Cancel and `false` for Poll.
|
|
47
|
+
|
|
48
|
+
In environments with a different Wix connector (e.g. ChatGPT), use its
|
|
49
|
+
account-level API tool the same way — the `ManageWixSite` tool accepts
|
|
50
|
+
`{method, url, body}` with the full URL directly.
|
|
51
|
+
|
|
52
|
+
Platform quirk: if the chat UI shows a rendering error like *"Failed to load
|
|
53
|
+
MCP app: HTML exceeds the maximum supported size"*, that is the connector's
|
|
54
|
+
optional visual widget failing to display — NOT the API call. If the tool
|
|
55
|
+
result contains the JSON, the call succeeded: continue normally and never
|
|
56
|
+
report it to the user as a failure.
|
|
57
|
+
|
|
58
|
+
**Every call goes through that tool, from your side of the conversation.**
|
|
59
|
+
Never call this API from an artifact, a web page, or any browser/client-side
|
|
60
|
+
code — those run in a sandboxed frame and fail with CORS. Do not build
|
|
61
|
+
monitoring dashboards, status widgets, or any UI for this flow: the entire
|
|
62
|
+
experience is plain chat — tool calls plus short messages. If an approach
|
|
63
|
+
fails, quietly switch to plain tool-call polling; never present the user a
|
|
64
|
+
menu of technical workarounds.
|
|
65
|
+
|
|
66
|
+
Example — Start:
|
|
67
|
+
|
|
68
|
+
```js
|
|
69
|
+
async () => {
|
|
70
|
+
return await wix.request({
|
|
71
|
+
scope: "account",
|
|
72
|
+
method: "POST",
|
|
73
|
+
url: "https://www.wixapis.com/site-import/v1/imports",
|
|
74
|
+
body: { request: "Import https://example-store.com into a new Wix site" },
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Example — Poll:
|
|
80
|
+
|
|
81
|
+
```js
|
|
82
|
+
async () => {
|
|
83
|
+
return await wix.request({
|
|
84
|
+
scope: "account",
|
|
85
|
+
method: "GET",
|
|
86
|
+
url: "https://www.wixapis.com/site-import/v1/imports/<importId>",
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Scope — this skill drives the import service, nothing else
|
|
92
|
+
|
|
93
|
+
While an import is the task at hand, ALL site-creation work goes through this
|
|
94
|
+
API. Never fall back to other site-building tools (site-builder/template/AI
|
|
95
|
+
site-generation tools from your Wix connector) to "compensate" — not when the
|
|
96
|
+
import is slow, and especially not when it FAILS.
|
|
97
|
+
|
|
98
|
+
**Status comes ONLY from this API's Poll endpoint.** Never call
|
|
99
|
+
`WixSiteBuilder`, `CreateSiteFromTemplate`, `pullSiteCreationJob`, or any
|
|
100
|
+
other connector tool to "check on the build" — `WixSiteBuilder` in particular
|
|
101
|
+
STARTS a new site build on every call, even when the prompt asks for status;
|
|
102
|
+
"checking" with it silently creates sites the user never asked for. A failed import ends with a
|
|
103
|
+
clear failure report and a full stop; the user must never discover a
|
|
104
|
+
different site in their account that they didn't ask for. If an alternative
|
|
105
|
+
(e.g. building an original site instead of importing) makes sense, propose it
|
|
106
|
+
AFTER reporting the failure and act only on the user's explicit yes. If you
|
|
107
|
+
already know the import agent refused the source (see `message`), don't
|
|
108
|
+
retry the same source with other tools — relay the reason and let the user
|
|
109
|
+
decide.
|
|
110
|
+
|
|
111
|
+
## Before starting an import
|
|
112
|
+
|
|
113
|
+
This creates real infrastructure and will eventually write to the user's Wix
|
|
114
|
+
account. Before calling **Start**, confirm with the user:
|
|
115
|
+
- The source URL and platform are correct
|
|
116
|
+
- They understand this will run for up to ~60 minutes and may ask them
|
|
117
|
+
questions mid-way
|
|
118
|
+
|
|
119
|
+
Also confirm before calling **Cancel** — it's a mutating, irreversible action
|
|
120
|
+
on a running job.
|
|
121
|
+
|
|
122
|
+
## What the user sees (presentation rules)
|
|
123
|
+
|
|
124
|
+
You are the user experience; the API is plumbing. Keep the protocol invisible:
|
|
125
|
+
|
|
126
|
+
- **Never show identifiers or raw protocol data**: `importId`, raw JSON
|
|
127
|
+
responses, HTTP status codes, the `tasks[]` rows, or
|
|
128
|
+
`sourcePlatform`/`sourceConfidence` values. Track them silently — you need
|
|
129
|
+
them for the API calls, the user never does. Never offer ids as a
|
|
130
|
+
"check back later" reference either.
|
|
131
|
+
- **Write for a non-technical audience.** No jargon: no "endpoint", "API",
|
|
132
|
+
"poll", "HTTP", "429", "rate limit", "headers", "JSON", "scraping",
|
|
133
|
+
"session". Translate events into outcomes a shopkeeper understands —
|
|
134
|
+
"the source store limits how fast it can be read, so this step is taking a
|
|
135
|
+
minute" instead of "hit Cloudflare rate limit (HTTP 429)".
|
|
136
|
+
- **Monitor quietly by default — do not ask the user to choose a monitoring
|
|
137
|
+
mode.** Quiet means low-noise, never uninformed: the user should always know
|
|
138
|
+
what stage their import is in. Match your environment:
|
|
139
|
+
- **If you can keep working between user messages** (background polling),
|
|
140
|
+
poll continuously and speak up only on meaningful milestones: the source
|
|
141
|
+
platform is identified, a plan step completes, the agent asks a question,
|
|
142
|
+
the site deploys, or something fails. A short update every few minutes is
|
|
143
|
+
plenty; never narrate each poll ("let me poll again", "retrying") or
|
|
144
|
+
transient errors — retry those silently.
|
|
145
|
+
- **If you can only act while answering a message** (turn-based clients):
|
|
146
|
+
before ending each turn, poll a few times over ~a minute and close with
|
|
147
|
+
one concrete update of what the import is doing right now, then remind the
|
|
148
|
+
user the import keeps running on Wix's side and they can ask "how's it
|
|
149
|
+
going?" anytime. On EVERY later user message, poll first and answer with
|
|
150
|
+
current specifics.
|
|
151
|
+
- **Status answers must be substantive.** When the user asks how it's going,
|
|
152
|
+
never answer with a bare "still in progress". While the import is running,
|
|
153
|
+
the poll's `message` field is a ready-made plain-language progress line
|
|
154
|
+
("Now: Importing products (2 of 6 steps done) — Latest update: …") — relay
|
|
155
|
+
it (lightly rephrased is fine), and add anything fresh from `recentActivity`
|
|
156
|
+
/ `todos`. If `message` is empty it's still early — say the import is
|
|
157
|
+
setting up and check again on the next message.
|
|
158
|
+
- **Never announce or describe the monitoring itself.** No "background monitor
|
|
159
|
+
is live", no feature lists of your polling/alerts/badges — the user asked
|
|
160
|
+
for a site import, not a monitoring product. After the one-sentence start
|
|
161
|
+
message, stay silent until the first milestone.
|
|
162
|
+
- **Keep every routine update to 1–3 short sentences.** No headers, no emoji
|
|
163
|
+
walls, no bullet lists for ordinary progress — save structure for the final
|
|
164
|
+
result or a question that needs a decision.
|
|
165
|
+
- On start, one friendly sentence: the import is underway and you'll keep them
|
|
166
|
+
posted. Mention the detected platform only when it helps ("Looks like a
|
|
167
|
+
Shopify store — I'll migrate the catalog accordingly"); never say
|
|
168
|
+
"confidence", "sandbox", "execution", or "session".
|
|
169
|
+
- Progress updates come from `recentActivity` `TEXT` entries and the `todos`
|
|
170
|
+
checklist, rephrased in plain language ("setting up your product catalog"),
|
|
171
|
+
never echoed verbatim.
|
|
172
|
+
- Ask `NEEDS_INPUT` questions conversationally, as if they were your own.
|
|
173
|
+
- On `DEPLOYED`, lead with the live URL, then the agent's closing summary
|
|
174
|
+
**rewritten for a non-technical reader**: what the user got (pages,
|
|
175
|
+
products, look & feel), any honest limitations in plain words ("the buy
|
|
176
|
+
buttons aren't connected to a real checkout yet"), and 2–3 short follow-up
|
|
177
|
+
offers they can answer in one sentence (those become Reply messages). Leave
|
|
178
|
+
out how it was built — frameworks, SDKs, workarounds, and anything from the
|
|
179
|
+
jargon list have no place in the final message either.
|
|
180
|
+
- On `FAILED` / `AUTH_EXPIRED` / `SESSION_EXPIRED`, explain what happened and
|
|
181
|
+
what you'll do next in plain words — no codes, no id dumps.
|
|
182
|
+
- **A failure is the headline, never a footnote.** The moment a poll returns
|
|
183
|
+
`FAILED`, your very next message leads with that fact and the reason (from
|
|
184
|
+
`message`) — never bury it, never keep talking as if work is ongoing, and
|
|
185
|
+
never paper over it with work done by other tools (see Scope above).
|
|
186
|
+
|
|
187
|
+
## Endpoints
|
|
188
|
+
|
|
189
|
+
**There is exactly ONE id in this API: the latest `importId`.** Requests and
|
|
190
|
+
responses carry nothing else — the service resolves everything from the
|
|
191
|
+
signed-in user.
|
|
192
|
+
|
|
193
|
+
1. **Start** — `POST /v1/imports`
|
|
194
|
+
Body: `{"request": "<natural language; MUST include the source store URL>"}`
|
|
195
|
+
Returns: `importId` (keep it — it's the import's id) and detected
|
|
196
|
+
`sourcePlatform`/`sourceConfidence`.
|
|
197
|
+
|
|
198
|
+
2. **Poll** — `GET /v1/imports/{importId}`
|
|
199
|
+
Returns: `status`, `deployUrl`, `message`, `recentActivity[]`, `todos[]`,
|
|
200
|
+
`question` (only when status is `NEEDS_INPUT`), `tasks[]`.
|
|
201
|
+
|
|
202
|
+
3. **Reply** — `POST /v1/imports/{importId}/reply`
|
|
203
|
+
Body: `{"message": "<answer or follow-up>"}`
|
|
204
|
+
Returns a **NEW `importId` — poll that one from now on.** The agent
|
|
205
|
+
continues the same conversation with full context.
|
|
206
|
+
|
|
207
|
+
4. **Cancel** — `POST /v1/imports/{importId}/cancel`
|
|
208
|
+
Body: `{}`. Only meaningful while status is `IMPORTING`.
|
|
209
|
+
|
|
210
|
+
## How to run the flow
|
|
211
|
+
|
|
212
|
+
- After Start, poll every 5–10 seconds while `status` is `IMPORTING` —
|
|
213
|
+
quietly, per the presentation rules above: polling is background work, not
|
|
214
|
+
conversation.
|
|
215
|
+
- Track progress from two fields (source material for your milestone updates,
|
|
216
|
+
not a transcript to relay):
|
|
217
|
+
- `recentActivity`: up to 20 entries `{kind, text}`, oldest first —
|
|
218
|
+
`TEXT` entries are the agent's own messages, `TOOL_USE` entries are short
|
|
219
|
+
labels of actions it took. It's a rolling window: track which entries you
|
|
220
|
+
have already covered so an update never repeats them.
|
|
221
|
+
- `todos`: the agent's plan, `{content, status, activeForm}` with status
|
|
222
|
+
`PENDING | IN_PROGRESS | COMPLETED`. Each poll returns the full latest
|
|
223
|
+
snapshot — replace your tracked list, don't append. `activeForm`
|
|
224
|
+
(e.g. "Importing products") describes the in-progress item.
|
|
225
|
+
- Empty `recentActivity`/`todos` in the first polls is normal.
|
|
226
|
+
- Act on `status`:
|
|
227
|
+
- `IMPORTING` — keep polling.
|
|
228
|
+
- `NEEDS_INPUT` — the agent is blocked on a decision. Show `question.text`
|
|
229
|
+
(and `question.options` if present) to the user, collect their answer
|
|
230
|
+
(an option or free text), send it via Reply, then poll the NEW
|
|
231
|
+
`importId` from the Reply response.
|
|
232
|
+
- `DEPLOYED` — terminal success. Deliver `deployUrl` (already verified
|
|
233
|
+
reachable server-side) and `message` per the presentation rules above.
|
|
234
|
+
- `FAILED` — terminal. `message` usually contains the agent's own
|
|
235
|
+
explanation of what happened and what it needs — relay it in plain words.
|
|
236
|
+
- `AUTH_EXPIRED` — recoverable, but **NOT a success and nothing is live**
|
|
237
|
+
(golden rule 1). The user's Wix session expired mid-import. Tell the user
|
|
238
|
+
the secure connection to their account expired and you're restarting the
|
|
239
|
+
import, then call Start again with the same request — work done so far is
|
|
240
|
+
preserved and the import continues.
|
|
241
|
+
- `CANCELLED` — terminal; stopped by Cancel.
|
|
242
|
+
- Follow-up changes after a deploy ("make the header blue", "also import the
|
|
243
|
+
blog"): send them via Reply on the latest `importId` — same mechanics as
|
|
244
|
+
answering a question. This works while the import environment is alive
|
|
245
|
+
(~60 minutes idle).
|
|
246
|
+
- If Reply returns `409 { "code": "SESSION_EXPIRED" }`, the environment was
|
|
247
|
+
reclaimed and the conversation cannot resume — tell the user and offer to
|
|
248
|
+
start a fresh import.
|
|
249
|
+
|
|
250
|
+
## Rules
|
|
251
|
+
|
|
252
|
+
- Always use the **newest** `importId` (each Reply returns a new one) —
|
|
253
|
+
it is the only id you need to track.
|
|
254
|
+
- Never invent a `deployUrl` — only report the one returned with `DEPLOYED`.
|
|
255
|
+
- Treat `NEEDS_INPUT` and `AUTH_EXPIRED` as normal turns of the conversation,
|
|
256
|
+
not errors.
|
|
257
|
+
- **Site Import is available to some accounts, not all users yet** (limited,
|
|
258
|
+
gradual rollout). If Start returns a `404` (or any response signalling the
|
|
259
|
+
API is not available for this account) or a `403` with
|
|
260
|
+
`"code": "NOT_ENABLED"`, this account is not in the rollout: tell the user
|
|
261
|
+
plainly that **site import isn't supported on their account yet, and they
|
|
262
|
+
can contact Wix support** to ask about access — then stop. Do not retry, do
|
|
263
|
+
not work around it, and do not fall back to another site-creation tool.
|
|
264
|
+
- Any other `403` means the caller is not permitted or does not own this
|
|
265
|
+
import — check that you are using the ids from this user's own Start
|
|
266
|
+
response. A `400` means a required field is missing (`request`/`message`
|
|
267
|
+
must be 1–20000 chars).
|
|
268
|
+
- `tasks[]` is low-level infrastructure progress (task ids, exit codes) — use
|
|
269
|
+
it for debugging only; `recentActivity`/`todos`/`message` are what you show
|
|
270
|
+
the user.
|
|
@@ -211,7 +211,7 @@ Store the result internally as `subscription_eligible: true/false`. If `true`, a
|
|
|
211
211
|
|
|
212
212
|
## V3 STEP 4: Present Review Card to User (INTERACTIVE)
|
|
213
213
|
|
|
214
|
-
**
|
|
214
|
+
**Present ALL generated fields to the user so they can review and refine them.** This is a content preview for editing — NOT the create approval. The single confirmation before creating happens later, in V3 STEP 6. Do not ask the user to approve creation at this step.
|
|
215
215
|
|
|
216
216
|
Present a structured review card using the markdown format below. This provides a visual product-card-style layout:
|
|
217
217
|
|
|
@@ -242,15 +242,15 @@ Present a structured review card using the markdown format below. This provides
|
|
|
242
242
|
---
|
|
243
243
|
```
|
|
244
244
|
|
|
245
|
-
After the card,
|
|
245
|
+
After the card, offer the ways they can adjust the content:
|
|
246
246
|
|
|
247
247
|
> 1. **Refine** — tell me what to change (e.g., "make the description shorter", "the price should be lower")
|
|
248
248
|
> 2. **Regenerate** — I'll start the analysis over, optionally with additional context from you
|
|
249
|
-
> 3. **
|
|
249
|
+
> 3. **Looks good** — continue to the next steps (options / subscription)
|
|
250
250
|
|
|
251
251
|
If the user provided a text note that **contradicts** what's visible in the image (e.g., image shows blue but note says "available in red"), ask the user to clarify before proceeding.
|
|
252
252
|
|
|
253
|
-
|
|
253
|
+
Apply any corrections the user requests. When they're happy (or have no changes), continue to the next step. **Do NOT treat this as the final create approval** — that single confirmation comes once, at V3 STEP 6.
|
|
254
254
|
|
|
255
255
|
---
|
|
256
256
|
|
|
@@ -342,13 +342,15 @@ If no options were detected:
|
|
|
342
342
|
|
|
343
343
|
## V3 STEP 6: Create the Product
|
|
344
344
|
|
|
345
|
-
|
|
345
|
+
> **CRITICAL — THIS IS THE ONLY CREATE CONFIRMATION. ASK EXACTLY ONCE.** The review card in V3 STEP 4 was a content preview for editing, not an approval. Here you ask for the single go-ahead before creating. Do NOT summarize-and-ask more than once — one clear confirmation is enough.
|
|
346
|
+
|
|
347
|
+
Ask the user once:
|
|
346
348
|
|
|
347
349
|
> Everything is ready. Shall I create the product now?
|
|
348
350
|
> - **Yes, create it** — I'll submit the product to your store now.
|
|
349
351
|
> - **No, go back** — return to a previous step to make changes.
|
|
350
352
|
|
|
351
|
-
**Wait for confirmation.** Only proceed with the API call if the user says Yes.
|
|
353
|
+
**Wait for confirmation.** Only proceed with the API call if the user says Yes. If the user already said something like "just create it", treat that as the confirmation and proceed without asking again.
|
|
352
354
|
|
|
353
355
|
---
|
|
354
356
|
|
|
@@ -18,20 +18,18 @@ The goal of this step is not just to create *a* product, but to help the user cr
|
|
|
18
18
|
|
|
19
19
|
### 0a. Opening the conversation
|
|
20
20
|
|
|
21
|
-
**
|
|
21
|
+
**As soon as this skill is triggered — and the user hasn't already described a product — YOU open the conversation.** Proactively send a single opening message that invites *either or both* input paths and makes clear you'll generate the full product info from whatever they provide:
|
|
22
22
|
|
|
23
|
-
> **What
|
|
23
|
+
> **What would you like to sell? Just describe your product in a few words and/or upload a photo of it — I'll generate the full product info (name, description, price, and any options) for you from there.**
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
The user can reply with a text prompt, an image, or both:
|
|
26
26
|
|
|
27
|
-
**
|
|
27
|
+
- **An image is provided (with or without text)** → follow the **[Create Product from Image](https://dev.wix.com/docs/api-reference/business-solutions/stores/skills/create-product-from-image)** recipe to generate the product info from the image(s), then continue from the gap check in 0b for anything still missing.
|
|
28
|
+
- **Text only** → continue with the gap check in 0b.
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
If the user *already* described a product when triggering the skill, skip this opening message and go straight to 0b.
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
- If the user prefers text / a prompt → continue with the gap check in 0b as usual.
|
|
33
|
-
|
|
34
|
-
> **Count this toward the 1–2 question budget.** If you ask the image-vs-text question, keep the remaining follow-ups to one so the total conversation stays short.
|
|
32
|
+
> **This opening message is the entry point, not a follow-up — it does NOT count against the 1–2 follow-up-question budget in 0b.**
|
|
35
33
|
|
|
36
34
|
### 0b. Gap check — decide what (if anything) to ask
|
|
37
35
|
|
|
@@ -59,7 +57,15 @@ You may ask **one** enrichment question to make the product more complete. Ask a
|
|
|
59
57
|
|
|
60
58
|
> **CRITICAL — ONCE A PRODUCT-CREATION CONVERSATION HAS STARTED, STAY ON IT.** Do not switch to other topics, suggest unrelated tasks, or start new workflows until the product has actually been created (saved) via STEP 1 — **unless the user explicitly asks to do something else**. If the user goes off-topic, briefly answer if needed, then steer back to finishing and saving the product.
|
|
61
59
|
|
|
62
|
-
|
|
60
|
+
### 0d. Confirm once — then create
|
|
61
|
+
|
|
62
|
+
> **CRITICAL — VALIDATE EXACTLY ONCE BEFORE CREATING.** Right before calling the Create Product API (STEP 1), show a brief summary of what you're about to create and ask for a single go-ahead. Ask **only once**. Do NOT approve-and-then-ask-again (e.g. present a summary, get a "yes", and then ask "shall I create it now?" a second time) — that double confirmation is exactly what we want to avoid. Once the user approves, go straight to STEP 1 with no further approval prompts.
|
|
63
|
+
|
|
64
|
+
For example:
|
|
65
|
+
|
|
66
|
+
> "Here's what I'll add to your store: **[name]** — **[price]**[, options: …]. Ready to create it?"
|
|
67
|
+
|
|
68
|
+
If the user already signaled approval (e.g. "just create it", "go ahead"), treat that as the single confirmation and proceed straight to STEP 1 — do not ask again.
|
|
63
69
|
|
|
64
70
|
## STEP 1: create the product with options and variants
|
|
65
71
|
|
|
@@ -40,6 +40,12 @@ This skill is the deliberately **client-only, REST-only** path. It is independen
|
|
|
40
40
|
it only mints anonymous visitor tokens. It is **not a secret**; hardcoding and committing it
|
|
41
41
|
is fine. The user provides it (their vibe/host platform surfaces a copyable prompt with the
|
|
42
42
|
id filled in). Paste it into `wix-client.js` in place of the `<YOUR-CLIENT-ID>` placeholder.
|
|
43
|
+
- **Money/price fields are objects, never scalars.** Every price/amount a Wix API returns —
|
|
44
|
+
Stores `price.actualPrice`, Bookings service `payment.fixed.price`, Events ticket
|
|
45
|
+
`registration.tickets.lowestPrice`, and the rest — has the shape `{ value, currency,
|
|
46
|
+
formattedValue }`. Render **`formattedValue`** (it already includes the currency symbol), or
|
|
47
|
+
fall back to building from `value` + `currency`. **Never** drop the object straight into the UI
|
|
48
|
+
or treat it as a number/string — that renders `[object Object]` or a bare unformatted number.
|
|
43
49
|
- **Visitor token = identity.** `wix-client.js` mints an anonymous visitor token, persists the
|
|
44
50
|
**refresh token to `localStorage`**, and refreshes on expiry. That token IS the identity of
|
|
45
51
|
the cart / reservation / member session — **never re-mint anonymously per load** or the cart
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Vibe platform handoff prompts
|
|
2
|
+
|
|
3
|
+
One file per AI-builder platform (Base44, Lovable, Bolt, v0, Manus, …). Each file is the
|
|
4
|
+
**handoff prompt** the Wix Headless funnel hands to that platform after it creates the site +
|
|
5
|
+
OAuth app: build the client, then seed/manage the business.
|
|
6
|
+
|
|
7
|
+
`generic.md` is the **platform-agnostic** version — same flow (install skills → build client →
|
|
8
|
+
seed/manage → wrap up) with no assumptions about a specific platform's tooling. Use it as the
|
|
9
|
+
default/fallback for platforms without their own tuned file; `base44.md` is the Base44-specific
|
|
10
|
+
one (its exec tool, secret store, pre-configured connector, etc.).
|
|
11
|
+
|
|
12
|
+
These are hosted (served at `https://www.wix.com/skills/vibe-headless/platforms/<platform>.md`)
|
|
13
|
+
so the funnel loader can pass a short pointer to the prompt instead of inlining the whole
|
|
14
|
+
script into the launch URL. Inlining tripped the Base44 edge WAF, which scans the POST body
|
|
15
|
+
for command-injection patterns (`curl … | tar`, `require('child_process')`, etc.); a plain
|
|
16
|
+
GET of a hosted file is not scanned that way.
|
|
17
|
+
|
|
18
|
+
**Loader contract:** the funnel sends a short prompt that names the business, passes the Wix
|
|
19
|
+
client id + metasite id, and points here — e.g. "Build a site for my Wix managed business:
|
|
20
|
+
<business>. Then fetch and follow https://www.wix.com/skills/vibe-headless/platforms/base44.md
|
|
21
|
+
exactly." The dynamic bits (business description, client id, metasite id) stay in the loader
|
|
22
|
+
prompt; everything static lives in these files.
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Wix Managed Headless — Base44 build instructions
|
|
2
|
+
|
|
3
|
+
You are building a **Wix Managed** headless site inside Base44. The business to build is
|
|
4
|
+
described in your initial prompt. The Wix connector is already configured for this app — use
|
|
5
|
+
it for all Wix API calls.
|
|
6
|
+
|
|
7
|
+
Your Wix client id is given in your prompt. It's a public, buyer/visitor-facing credential (it
|
|
8
|
+
only mints anonymous visitor tokens), so it's safe in the frontend — use that value directly for
|
|
9
|
+
the Wix client setup.
|
|
10
|
+
|
|
11
|
+
Follow the steps below exactly.
|
|
12
|
+
|
|
13
|
+
## STEP 0 — Install the Wix skills locally
|
|
14
|
+
|
|
15
|
+
Install three skills — they land under `.agents/skills/` as:
|
|
16
|
+
- **`wix-vibe-headless`** — the client build guide: how to build the frontend against the Wix
|
|
17
|
+
APIs. This is your main source of truth (STEP 1).
|
|
18
|
+
- **`wix-headless`** — a broad skill for building full Wix apps with the Wix SDK packages, **most
|
|
19
|
+
of which does not apply to how you build here**. Use it **only** as a seeding/admin recipe
|
|
20
|
+
reference — its `references/SEED.md` and `references/inline-recipes/`, for STEP 2. **Ignore
|
|
21
|
+
everything else in it** — in particular do **not** follow its authentication / `@wix/cli` /
|
|
22
|
+
"managed project" setup (e.g. anything under `references/managed/`, such as `AUTHENTICATION.md`).
|
|
23
|
+
That is **not** how auth works here — auth is handled per STEP 2 below.
|
|
24
|
+
- **`wix-docs`** — a **fallback**: how to search and read the Wix API reference docs, for anything
|
|
25
|
+
the seeding recipes above don't cover.
|
|
26
|
+
|
|
27
|
+
**Option A — skills CLI.** This is the Base44-verified install path — run it first via
|
|
28
|
+
exec_tool, exactly as written:
|
|
29
|
+
|
|
30
|
+
```js
|
|
31
|
+
const { execSync } = require('child_process');
|
|
32
|
+
const { readdirSync } = require('fs');
|
|
33
|
+
|
|
34
|
+
const skills = ['wix-headless', 'wix-vibe-headless', 'wix-docs'];
|
|
35
|
+
const results = {};
|
|
36
|
+
|
|
37
|
+
for (const skill of skills) {
|
|
38
|
+
try {
|
|
39
|
+
const out = execSync(`CI=1 npx -y skills add wix/skills/skills/${skill} --yes 2>&1`, {
|
|
40
|
+
cwd: '/app', timeout: 60000, shell: '/bin/bash', stdio: ['pipe', 'pipe', 'pipe'],
|
|
41
|
+
});
|
|
42
|
+
const text = out.toString().replace(/\x1b\[[0-9;]*m/g, '');
|
|
43
|
+
results[skill] = /installed 1 skill|found 1 skill/i.test(text)
|
|
44
|
+
? 'success'
|
|
45
|
+
: text.includes('No valid skills') ? 'not_found' : 'unknown';
|
|
46
|
+
} catch (e) {
|
|
47
|
+
results[skill] = 'error: ' + e.message;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return { results, installed: readdirSync('/app/.agents/skills') };
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**Option B — tarball.** Use this **only if Option A actually errored** (check its `results`) —
|
|
55
|
+
do not skip Option A on a guess. Run via exec_tool:
|
|
56
|
+
|
|
57
|
+
```js
|
|
58
|
+
const { execSync } = require('child_process');
|
|
59
|
+
for (const s of ['headless', 'vibe-headless', 'docs']) {
|
|
60
|
+
execSync(`mkdir -p /app/.agents/skills/wix-${s} && curl -s "https://www.wix.com/skills/${s}.tgz" | tar xz -C /app/.agents/skills/wix-${s} --strip-components=1`);
|
|
61
|
+
}
|
|
62
|
+
return 'done';
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Either way you end up with `.agents/skills/{wix-headless,wix-vibe-headless,wix-docs}`. **Read them
|
|
66
|
+
with the `read_file` tool** — it caps by line (~5000, well above these docs, so each comes through
|
|
67
|
+
whole; page with offset/limit only if ever needed), whereas `cat` through exec_tool caps output at
|
|
68
|
+
~5000 chars and silently truncates, and web-fetch tools truncate/summarise. The path form depends
|
|
69
|
+
on the tool:
|
|
70
|
+
- **`read_file` (preferred):** rooted at `/app`, so use the workspace-relative path
|
|
71
|
+
`.agents/skills/wix-vibe-headless/SKILL.md` — an absolute `/app/...` double-prefixes and fails.
|
|
72
|
+
- **exec_tool / shell** (only if you must): use the absolute path
|
|
73
|
+
`/app/.agents/skills/wix-vibe-headless/SKILL.md`.
|
|
74
|
+
|
|
75
|
+
## STEP 1 — Build the client
|
|
76
|
+
|
|
77
|
+
Read `.agents/skills/wix-vibe-headless/SKILL.md` and follow it **EXACTLY** — it is the single
|
|
78
|
+
source of truth for how the client app is built. To save time, prefer copying ready-made files
|
|
79
|
+
the `wix-vibe-headless` skill provides (e.g. the Wix client setup) and adapting them over
|
|
80
|
+
re-generating them from scratch.
|
|
81
|
+
|
|
82
|
+
## STEP 2 — Manage and seed the business
|
|
83
|
+
|
|
84
|
+
Seed the site with real content by following the **`wix-headless` skill**'s
|
|
85
|
+
`references/SEED.md` (`.agents/skills/wix-headless/references/SEED.md`). Where its seed recipes
|
|
86
|
+
don't cover what you need, **fall back to the `wix-docs` skill** (`.agents/skills/wix-docs`) to
|
|
87
|
+
search and read the relevant Wix API docs.
|
|
88
|
+
|
|
89
|
+
**Seeding is additive.** You may clean up the app install's **obvious default sample/mock data**
|
|
90
|
+
right after a fresh install, but the site may already hold **real content** (a prior run, or
|
|
91
|
+
owner-added) — if what's there isn't obviously install sample data, or you're unsure, **do not
|
|
92
|
+
delete or overwrite it without the user's explicit ask or approval** (ask first).
|
|
93
|
+
|
|
94
|
+
**Auth for these admin calls is the already-configured Wix connector — and nothing else.** Get the
|
|
95
|
+
access token from it and send it as a bearer token — do **not** hand-roll a token getter (e.g. a
|
|
96
|
+
custom `getAdminToken()`):
|
|
97
|
+
|
|
98
|
+
```js
|
|
99
|
+
const { accessToken } = await base44.asServiceRole.connectors.getConnection("wix");
|
|
100
|
+
// then: fetch(url, { headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json" }, ... })
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Do **not** install or run the Wix CLI (`@wix/cli`), do a device-login, or follow `wix-headless`'s
|
|
104
|
+
`references/managed/AUTHENTICATION.md` — that managed-project auth flow does not apply to Base44
|
|
105
|
+
and will send you down the wrong path.
|
|
106
|
+
|
|
107
|
+
When you run seed/management code **inline via exec_tool**, `base44` is already declared — use
|
|
108
|
+
it directly. Do **not** import `@base44/sdk`, re-declare `base44`, or call `createClient()` —
|
|
109
|
+
that pattern is only for standalone `.js` skill files, and inline it throws *"Identifier
|
|
110
|
+
'base44' has already been declared."*
|
|
111
|
+
|
|
112
|
+
**IMPORTANT:** the Wix connector and the `wix-headless` skill's seeding instructions are for
|
|
113
|
+
management/admin operations only (STEP 2) — they are **NOT** part of the client. The client is
|
|
114
|
+
built solely per the `wix-vibe-headless` skill.
|
|
115
|
+
|
|
116
|
+
## Parallelism
|
|
117
|
+
|
|
118
|
+
If possible, run STEP 1 and STEP 2 in parallel — building the client and seeding the business
|
|
119
|
+
are independent, so don't wait for one to start the other. Within each step, also work in
|
|
120
|
+
parallel where possible (e.g. independent API calls, seeding multiple entities) instead of
|
|
121
|
+
one-by-one, to finish faster.
|
|
122
|
+
|
|
123
|
+
## STEP 3 — Wrap up
|
|
124
|
+
|
|
125
|
+
Once the site is built and seeded:
|
|
126
|
+
|
|
127
|
+
1. **Leave a brief "Wix skills" note in `AGENTS.md`** (project root) so a future session has
|
|
128
|
+
context. If the file already exists, **`read_file` it first and only append your section** —
|
|
129
|
+
do **not** rewrite, reorder, or remove anything already there; if you can't append cleanly,
|
|
130
|
+
skip this rather than overwrite. Create the file only if none exists. Keep the note
|
|
131
|
+
high-level, e.g.: the Wix skills are installed under `.agents/skills/`; the client is built
|
|
132
|
+
per the `wix-vibe-headless` skill; seeding/management is done per the `wix-headless` +
|
|
133
|
+
`wix-docs` skills.
|
|
134
|
+
2. **Ask the user to open** this URL to complete the setup in Wix (substitute the metasite id
|
|
135
|
+
you were given): `https://manage.wix.com/dashboard/{metaSiteId}`
|
|
136
|
+
|
|
137
|
+
## Later admin requests
|
|
138
|
+
|
|
139
|
+
For any later admin/management request the user makes, work the same way as STEP 2: check the
|
|
140
|
+
`wix-headless` skill's inline recipes first (`.agents/skills/wix-headless/references/inline-recipes/`)
|
|
141
|
+
and, where the operation isn't documented there, fall back to the `wix-docs` skill to search the
|
|
142
|
+
Wix API docs — all over the Wix connector.
|