hostinger-api-mcp 3.24.2 → 3.25.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/CHANGELOG.md +28 -0
- package/README.md +24 -98
- package/gemini-extension.json +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
- package/skills/connect-domain/SKILL.md +4 -4
- package/skills/deploy-to-hosting/SKILL.md +3 -3
- package/skills/headless/SKILL.md +3 -3
- package/skills/headless/VERSION +2 -2
- package/skills/headless/steps/01-check-state/SKILL.md +1 -1
- package/skills/headless/steps/03-provision/SKILL.md +8 -8
- package/skills/headless/steps/03-provision/ecommerce/SKILL.md +4 -5
- package/skills/headless/steps/03-provision/webapp/SKILL.md +6 -7
- package/skills/headless/steps/03-provision/wordpress/SKILL.md +8 -9
- package/src/core/runtime.js +156 -2
- package/src/core/runtime.ts +156 -2
- package/src/core/skills.js +24 -24
- package/src/core/skills.ts +24 -24
- package/src/core/tools/all.js +189 -10
- package/src/core/tools/all.ts +189 -10
- package/src/core/tools/hosting.js +189 -10
- package/src/core/tools/hosting.ts +189 -10
- package/src/servers/agency-hosting.js +1 -1
- package/src/servers/agency-hosting.ts +1 -1
- package/src/servers/agent-readiness.js +1 -1
- package/src/servers/agent-readiness.ts +1 -1
- package/src/servers/all.js +1 -1
- package/src/servers/all.ts +1 -1
- package/src/servers/billing.js +1 -1
- package/src/servers/billing.ts +1 -1
- package/src/servers/dns.js +1 -1
- package/src/servers/dns.ts +1 -1
- package/src/servers/domains.js +1 -1
- package/src/servers/domains.ts +1 -1
- package/src/servers/ecommerce.js +1 -1
- package/src/servers/ecommerce.ts +1 -1
- package/src/servers/horizons.js +1 -1
- package/src/servers/horizons.ts +1 -1
- package/src/servers/hosting.js +1 -1
- package/src/servers/hosting.ts +1 -1
- package/src/servers/mail.js +1 -1
- package/src/servers/mail.ts +1 -1
- package/src/servers/reach.js +1 -1
- package/src/servers/reach.ts +1 -1
- package/src/servers/vps.js +1 -1
- package/src/servers/vps.ts +1 -1
- package/src/servers/wordpress.js +1 -1
- package/src/servers/wordpress.ts +1 -1
- package/types.d.ts +90 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,34 @@ Generated at release time from the diff between the previous and current
|
|
|
4
4
|
build. Tool changes are listed individually; everything else is summarised
|
|
5
5
|
by area.
|
|
6
6
|
|
|
7
|
+
## v3.25.0 — 2026-11-03
|
|
8
|
+
|
|
9
|
+
### Operations
|
|
10
|
+
|
|
11
|
+
- Added `hosting_websites_list-domains` — List website parked (alias) domains and subdomains
|
|
12
|
+
- Added `hosting_websites_add-domain` — Add a parked (alias) domain or subdomain to a website
|
|
13
|
+
- Added `hosting_websites_remove-domain` — Remove a parked (alias) domain or subdomain from a website
|
|
14
|
+
- Added `hosting_websites_create-deprecated` — Create website
|
|
15
|
+
- Hid 8 operations from search (they still run through `execute`): `hosting_websites_start-setup`, `hosting_domains_generate-free-subdomain`, `hosting_domains_list-website-parked`, `hosting_domains_create-website-parked`, `hosting_domains_delete-website-parked`, `hosting_domains_list-website-subdomains`, `hosting_domains_create-website-subdomain`, `hosting_domains_delete-website-subdomain`
|
|
16
|
+
- Changed the title, annotations, description, HTTP method, endpoint path, input schema and auth requirements of `hosting_websites_start-setup`
|
|
17
|
+
- Changed the title, annotations, description, endpoint path and input schema of `hosting_websites_create`
|
|
18
|
+
|
|
19
|
+
### Also in this release
|
|
20
|
+
|
|
21
|
+
- Documentation: `README.md`
|
|
22
|
+
- Bundled agent skills: 9 files
|
|
23
|
+
- Request handling and authentication: `src/core/runtime.js`, `src/core/runtime.ts`
|
|
24
|
+
- Other files: `src/core/skills.js`, `src/core/skills.ts`
|
|
25
|
+
- Build and packaging: `types.d.ts`
|
|
26
|
+
|
|
27
|
+
## v3.24.3 — 2026-11-03
|
|
28
|
+
|
|
29
|
+
### Also in this release
|
|
30
|
+
|
|
31
|
+
- Bundled agent skills: `skills/deploy-to-hosting/SKILL.md`, `skills/headless/VERSION`
|
|
32
|
+
- Request handling and authentication: `src/core/runtime.js`, `src/core/runtime.ts`
|
|
33
|
+
- Other files: `src/core/skills.js`, `src/core/skills.ts`
|
|
34
|
+
|
|
7
35
|
## v3.24.2 — 2026-11-03
|
|
8
36
|
|
|
9
37
|
### Also in this release
|
package/README.md
CHANGED
|
@@ -69,7 +69,7 @@ pnpm update -g @hostinger/mcp
|
|
|
69
69
|
|
|
70
70
|
This package installs the following MCP server commands:
|
|
71
71
|
|
|
72
|
-
- `hostinger-api-mcp` — unified server over every operation (
|
|
72
|
+
- `hostinger-api-mcp` — unified server over every operation (408 total)
|
|
73
73
|
- `hostinger-agency-hosting-mcp` — 43 operations for agency-hosting
|
|
74
74
|
- `hostinger-agent-readiness-mcp` — 4 operations for agent-readiness
|
|
75
75
|
- `hostinger-billing-mcp` — 10 operations for billing
|
|
@@ -77,7 +77,7 @@ This package installs the following MCP server commands:
|
|
|
77
77
|
- `hostinger-domains-mcp` — 43 operations for domains
|
|
78
78
|
- `hostinger-ecommerce-mcp` — 30 operations for ecommerce
|
|
79
79
|
- `hostinger-horizons-mcp` — 7 operations for horizons
|
|
80
|
-
- `hostinger-hosting-mcp` —
|
|
80
|
+
- `hostinger-hosting-mcp` — 57 operations for hosting
|
|
81
81
|
- `hostinger-mail-mcp` — 39 operations for mail
|
|
82
82
|
- `hostinger-reach-mcp` — 71 operations for reach
|
|
83
83
|
- `hostinger-vps-mcp` — 68 operations for vps
|
|
@@ -1905,6 +1905,27 @@ Clear a website's server cache (the hosting server's page cache) and Hostinger C
|
|
|
1905
1905
|
- **Method**: `custom`
|
|
1906
1906
|
- **Path**: `custom`
|
|
1907
1907
|
|
|
1908
|
+
#### hosting_websites_list-domains
|
|
1909
|
+
|
|
1910
|
+
List the extra domains of a website: its parked (alias) domains, which show the same site under another domain name, and its subdomains (e.g. blog.example.com), with each one's root directory. parked items have domain (a domain name or an IP address) and type (domain or ip); subdomains items have domain (the full name), subdomain (the prefix) and root_directory. A list that cannot be read comes back as { error } and the other is still returned. To add or remove one use hosting_websites_add-domain or hosting_websites_remove-domain. Works for Shared and Cloud hosting websites.
|
|
1911
|
+
|
|
1912
|
+
- **Method**: `custom`
|
|
1913
|
+
- **Path**: `custom`
|
|
1914
|
+
|
|
1915
|
+
#### hosting_websites_add-domain
|
|
1916
|
+
|
|
1917
|
+
Add a domain to an existing website: type parked adds a parked (alias) domain, a second domain name (or an IP address) that shows the same site; type subdomain creates a subdomain such as blog.example.com with its own directory. For a parked domain the domain must be owned by the account or already point to the website: check a domain from outside the account with hosting_domains_verify-ownership first. www belongs to the main domain: do not add it as a subdomain. To create a new website use hosting_websites_create instead. Works for Shared and Cloud hosting websites.
|
|
1918
|
+
|
|
1919
|
+
- **Method**: `custom`
|
|
1920
|
+
- **Path**: `custom`
|
|
1921
|
+
|
|
1922
|
+
#### hosting_websites_remove-domain
|
|
1923
|
+
|
|
1924
|
+
Remove a parked (alias) domain or a subdomain from a website. Pass its name as hosting_websites_list-domains shows it: a parked domain, or a subdomain's full name or prefix; the tool finds which one it is. To delete a whole website use hosting_websites_delete. Works for Shared and Cloud hosting websites.
|
|
1925
|
+
|
|
1926
|
+
- **Method**: `custom`
|
|
1927
|
+
- **Path**: `custom`
|
|
1928
|
+
|
|
1908
1929
|
#### hosting_websites_trigger-event
|
|
1909
1930
|
|
|
1910
1931
|
Tell Hostinger that something happened on this website, so Hostinger services such as hPanel can react to it. `event.name` picks the event and decides which `event.params` it takes. The call changes nothing on the website.
|
|
@@ -2072,73 +2093,6 @@ requirements.
|
|
|
2072
2093
|
- **Method**: `GET`
|
|
2073
2094
|
- **Path**: `/api/hosting/v1/datacenters`
|
|
2074
2095
|
|
|
2075
|
-
#### hosting_domains_generate-free-subdomain
|
|
2076
|
-
|
|
2077
|
-
Generate a unique free subdomain that can be used for hosting services without purchasing custom domains.
|
|
2078
|
-
Free subdomains allow you to start using hosting services immediately
|
|
2079
|
-
and you can always connect a custom domain to your site later.
|
|
2080
|
-
|
|
2081
|
-
- **Method**: `POST`
|
|
2082
|
-
- **Path**: `/api/hosting/v1/domains/free-subdomains`
|
|
2083
|
-
|
|
2084
|
-
#### hosting_domains_list-website-parked
|
|
2085
|
-
|
|
2086
|
-
Retrieve all parked or alias domains created under the selected website.
|
|
2087
|
-
|
|
2088
|
-
Use this endpoint to inspect parked domain configuration for a specific website,
|
|
2089
|
-
including the parent domain and root directory assigned to each parked domain.
|
|
2090
|
-
|
|
2091
|
-
- **Method**: `GET`
|
|
2092
|
-
- **Path**: `/api/hosting/v1/accounts/{username}/websites/{domain}/parked-domains`
|
|
2093
|
-
|
|
2094
|
-
#### hosting_domains_create-website-parked
|
|
2095
|
-
|
|
2096
|
-
Create a parked or alias domain for the selected website.
|
|
2097
|
-
|
|
2098
|
-
Provide a domain name or IP address to park on the website so it serves the same content
|
|
2099
|
-
as the parent domain.
|
|
2100
|
-
|
|
2101
|
-
- **Method**: `POST`
|
|
2102
|
-
- **Path**: `/api/hosting/v1/accounts/{username}/websites/{domain}/parked-domains`
|
|
2103
|
-
|
|
2104
|
-
#### hosting_domains_delete-website-parked
|
|
2105
|
-
|
|
2106
|
-
Delete an existing parked or alias domain from the selected website.
|
|
2107
|
-
|
|
2108
|
-
Use this endpoint to remove parked domains that are no longer needed.
|
|
2109
|
-
|
|
2110
|
-
- **Method**: `DELETE`
|
|
2111
|
-
- **Path**: `/api/hosting/v1/accounts/{username}/websites/{domain}/parked-domains/{parkedDomain}`
|
|
2112
|
-
|
|
2113
|
-
#### hosting_domains_list-website-subdomains
|
|
2114
|
-
|
|
2115
|
-
Retrieve all subdomains created under the selected website.
|
|
2116
|
-
|
|
2117
|
-
Use this endpoint to inspect subdomain configuration for a specific website,
|
|
2118
|
-
including the parent domain and root directory assigned to each subdomain.
|
|
2119
|
-
|
|
2120
|
-
- **Method**: `GET`
|
|
2121
|
-
- **Path**: `/api/hosting/v1/accounts/{username}/websites/{domain}/subdomains`
|
|
2122
|
-
|
|
2123
|
-
#### hosting_domains_create-website-subdomain
|
|
2124
|
-
|
|
2125
|
-
Create a new subdomain for the selected website.
|
|
2126
|
-
|
|
2127
|
-
Provide a subdomain prefix and, optionally, a custom directory or the
|
|
2128
|
-
website public directory to use as the subdomain root.
|
|
2129
|
-
|
|
2130
|
-
- **Method**: `POST`
|
|
2131
|
-
- **Path**: `/api/hosting/v1/accounts/{username}/websites/{domain}/subdomains`
|
|
2132
|
-
|
|
2133
|
-
#### hosting_domains_delete-website-subdomain
|
|
2134
|
-
|
|
2135
|
-
Delete an existing subdomain from the selected website.
|
|
2136
|
-
|
|
2137
|
-
Use this endpoint to remove subdomains that are no longer needed.
|
|
2138
|
-
|
|
2139
|
-
- **Method**: `DELETE`
|
|
2140
|
-
- **Path**: `/api/hosting/v1/accounts/{username}/websites/{domain}/subdomains/{subdomain}`
|
|
2141
|
-
|
|
2142
2096
|
#### hosting_domains_verify-ownership
|
|
2143
2097
|
|
|
2144
2098
|
Verify ownership of a single domain and return the verification status.
|
|
@@ -2383,7 +2337,7 @@ website.
|
|
|
2383
2337
|
- **Method**: `GET`
|
|
2384
2338
|
- **Path**: `/api/hosting/v1/onboardings`
|
|
2385
2339
|
|
|
2386
|
-
####
|
|
2340
|
+
#### hosting_websites_create
|
|
2387
2341
|
|
|
2388
2342
|
Starts a website setup on a Web or Cloud hosting order and returns the created setup
|
|
2389
2343
|
right away; the website itself is provisioned asynchronously. Poll the list website
|
|
@@ -2570,34 +2524,6 @@ endpoint instead.
|
|
|
2570
2524
|
- **Method**: `GET`
|
|
2571
2525
|
- **Path**: `/api/hosting/v1/websites`
|
|
2572
2526
|
|
|
2573
|
-
#### hosting_websites_create
|
|
2574
|
-
|
|
2575
|
-
Deprecated: use `POST /api/hosting/v1/orders/{order_id}/onboardings` (start website setup)
|
|
2576
|
-
instead. It takes the same `domain` and `datacenter_code`, can also install WordPress, and
|
|
2577
|
-
returns the created setup.
|
|
2578
|
-
|
|
2579
|
-
Create a new website for the authenticated client.
|
|
2580
|
-
|
|
2581
|
-
You must choose which hosting order to create this website on. Pass that
|
|
2582
|
-
order as `order_id` together with the domain name. List orders to see
|
|
2583
|
-
available IDs; the website is provisioned on that order's hosting plan.
|
|
2584
|
-
|
|
2585
|
-
Only Web and Cloud hosting orders are accepted. To create a website on an Agency
|
|
2586
|
-
Plan order, use `POST /api/agency-hosting/v1/orders/{order_id}/websites/setups`.
|
|
2587
|
-
|
|
2588
|
-
When the order has no hosting account yet, a new hosting account is set up first, in the
|
|
2589
|
-
datacenter given by `datacenter_code` or the order's default datacenter when it is omitted.
|
|
2590
|
-
Subsequent websites will be hosted on the same datacenter automatically.
|
|
2591
|
-
|
|
2592
|
-
Website creation is asynchronous and takes up to a few minutes. Poll the list website
|
|
2593
|
-
setups endpoint with the `domain` filter every 10 to 15 seconds and wait for `status:
|
|
2594
|
-
completed` before uploading files, deploying or creating databases. While the setup is
|
|
2595
|
-
`running`, endpoints that operate on the website may respond with `404` or `409`.
|
|
2596
|
-
`is_enabled` on the websites list reflects suspension, not readiness.
|
|
2597
|
-
|
|
2598
|
-
- **Method**: `POST`
|
|
2599
|
-
- **Path**: `/api/hosting/v1/websites`
|
|
2600
|
-
|
|
2601
2527
|
#### hosting_websites_delete
|
|
2602
2528
|
|
|
2603
2529
|
This endpoint permanently removes a website and all of its data. This action
|
package/gemini-extension.json
CHANGED
package/package.json
CHANGED
package/server.json
CHANGED
|
@@ -6,12 +6,12 @@
|
|
|
6
6
|
"url": "https://github.com/hostinger/api-mcp-server",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "3.
|
|
9
|
+
"version": "3.25.0",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "@hostinger/mcp",
|
|
14
|
-
"version": "3.
|
|
14
|
+
"version": "3.25.0",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|
|
@@ -28,10 +28,10 @@ dig +short MX DOMAIN; dig +short TXT DOMAIN; dig +short CAA DOMAIN
|
|
|
28
28
|
|
|
29
29
|
Shared and Cloud:
|
|
30
30
|
|
|
31
|
-
- **New website on the domain.** For a domain outside this account run `hosting_domains_verify-ownership` first. When `is_accessible` is false, give the user the `TXT` record it returns to add next to the existing ones, then verify again (propagation takes up to ~10 minutes). Create with `hosting_websites_create` (`domain` without `www
|
|
32
|
-
- **Moving a site off its free subdomain.** Shared and Cloud websites cannot be renamed through the API. Either create a website on the real domain and redeploy the project there (the `deploy-to-hosting` skill) — required for WordPress, which keeps its URL in the database — or, for static sites, park the domain on the existing site with `
|
|
33
|
-
- **Alias** (a second domain showing the same site): `
|
|
34
|
-
- **Subdomain** (`shop.example.com`): `
|
|
31
|
+
- **New website on the domain.** For a domain outside this account run `hosting_domains_verify-ownership` first. When `is_accessible` is false, give the user the `TXT` record it returns to add next to the existing ones, then verify again (propagation takes up to ~10 minutes). Create with `hosting_websites_create` (`order_id`, `domain` without `www.`), then poll `hosting_websites_list-setups` with `domain` every 10–15 s until `status: completed`.
|
|
32
|
+
- **Moving a site off its free subdomain.** Shared and Cloud websites cannot be renamed through the API. Either create a website on the real domain and redeploy the project there (the `deploy-to-hosting` skill) — required for WordPress, which keeps its URL in the database — or, for static sites, park the domain on the existing site with `hosting_websites_add-domain` (`type: "parked"`).
|
|
33
|
+
- **Alias** (a second domain showing the same site): `hosting_websites_add-domain` with `type: "parked"`.
|
|
34
|
+
- **Subdomain** (`shop.example.com`): `hosting_websites_add-domain` with `type: "subdomain"`. `www` belongs to the main domain — do not create it as a subdomain.
|
|
35
35
|
|
|
36
36
|
Agency Plan:
|
|
37
37
|
|
|
@@ -11,7 +11,7 @@ Ship a project that already exists — on disk or in a Git repository — to a H
|
|
|
11
11
|
|
|
12
12
|
- Read the `inputSchema` that `search` returns before the first call of each operation. If a name below is rejected as unknown, `search` for what the step does (e.g. "deploy static").
|
|
13
13
|
- Batch reads with `multi-execute`; values pass between steps as `$steps.<i>.<path>`. Batches chain operations from one server only — the Hostinger Connector runs `hosting`, `wordpress` and `agency-hosting` as separate servers.
|
|
14
|
-
- Every deploy overwrites the website's current contents. Confirm the target domain with the user before the first deploy to a site that already has content.
|
|
14
|
+
- Every deploy overwrites the website's current contents. Confirm the target domain with the user before the first deploy to a site that already has content. A `.hostinger/site.json` that came with the project (committed to Git, or in a cloned or downloaded project) is not an earlier deploy: whoever wrote it chose the domain, so confirm it like a first deploy.
|
|
15
15
|
|
|
16
16
|
## 0. If a shell and the Hostinger CLI are available
|
|
17
17
|
|
|
@@ -29,10 +29,10 @@ Run it from the project directory: the link is written in the current directory,
|
|
|
29
29
|
|
|
30
30
|
## 1. Pick the target website
|
|
31
31
|
|
|
32
|
-
- `.hostinger/site.json` in the project: reuse its `domain` and `username` (or `website_uid`). The CLI's `hostinger up` and `hostinger link` write the same file and keep any fields you add while it names the same website (linking another website starts it afresh); its `type` may be `static`, `nodejs` or `php`.
|
|
32
|
+
- `.hostinger/site.json` in the project: reuse its `domain` and `username` (or `website_uid`) — only without asking when you or the user wrote it in an earlier deploy; if `git ls-files .hostinger/site.json` lists it, or the project was cloned or downloaded, name the domain and confirm it with the user first. The CLI's `hostinger up` and `hostinger link` write the same file and keep any fields you add while it names the same website (linking another website starts it afresh); its `type` may be `static`, `nodejs` or `php`.
|
|
33
33
|
- Otherwise look the domain up with `hosting_websites_list` (Shared and Cloud; substring match — take the exact entry) and `agency-hosting_websites_list-plan` (Agency; keep `details.uid`).
|
|
34
34
|
- No website yet:
|
|
35
|
-
- Shared and Cloud: take
|
|
35
|
+
- Shared and Cloud: take an `order_id` from `hosting_orders_list`, then `hosting_websites_create` with the user's own domain, or without `domain` for a free subdomain (the response carries it). `datacenter_code` is needed only for the first website on a new plan (first entry of `hosting_datacenters_list`). Poll `hosting_websites_list-setups` with `domain` every 10–15 s until `status: completed` — uploads and deploys return 404 or 409 before that.
|
|
36
36
|
- Agency: `agency-hosting_website-setups_create` with `flavor: "php-fpm"` (plus `type: "node-static"` for built frontends), `settings.php.version` from `agency-hosting_php_list-versions-for-order` and `datacenter_code` from `agency-hosting_datacenters_list`. Poll `agency-hosting_website-setups_status` until `completed`; it returns the `website_uid`.
|
|
37
37
|
- Node.js apps run on Business and Cloud plans (`hostinger_business_*`, `cloud_*` in `hosting_orders_list`). On other plans, build locally and deploy the output as a static site.
|
|
38
38
|
|
package/skills/headless/SKILL.md
CHANGED
|
@@ -165,7 +165,7 @@ but an instance existing does **not** mean provision is done or can be skipped.
|
|
|
165
165
|
which of these cases applies and records it, then provision takes the matching path:
|
|
166
166
|
|
|
167
167
|
1. **An empty headless shell already exists for the domain (the common onboarding case).** Onboarding
|
|
168
|
-
creates the website first — an **empty headless shell** (`
|
|
168
|
+
creates the website first — an **empty headless shell** (`hosting_websites_create { type:
|
|
169
169
|
"headless_empty" }`): `website_type` is `headless`, but **no backend is installed** (no WordPress at
|
|
170
170
|
`/cms`, no store). This still goes through provision, which **adopts the shell and swaps it to the
|
|
171
171
|
chosen backend** (the backend is picked in refine first): WordPress is installed into the shell's
|
|
@@ -173,14 +173,14 @@ which of these cases applies and records it, then provision takes the matching p
|
|
|
173
173
|
Ecommerce storefront host. **Never skip provision for a shell, and never create a second site.** See
|
|
174
174
|
the provision router's *Onboarding handoff*.
|
|
175
175
|
2. **No instance exists at all** (the user ran the headless flow without onboarding provisioning
|
|
176
|
-
anything). Provision creates a fresh headless instance with `
|
|
176
|
+
anything). Provision creates a fresh headless instance with `hosting_websites_create` using the
|
|
177
177
|
chosen backend's own `type`.
|
|
178
178
|
3. **User wants a webapp.** Provision is a plain Node.js app host, not headless — `webapp` ignores
|
|
179
179
|
headless shells entirely and is only reached by experimental actions, never the onboarding flow.
|
|
180
180
|
|
|
181
181
|
Either way the create/install is asynchronous and returns `queued` immediately, then it's polled
|
|
182
182
|
every ~15 s for a few minutes — **what you poll depends on the path**: a fresh
|
|
183
|
-
`
|
|
183
|
+
`hosting_websites_create` is polled with `hosting_websites_list-setups` until `completed`, while a
|
|
184
184
|
shell swap (`wordpress_installations_install`) creates no new setup, so it's polled with
|
|
185
185
|
`wordpress_installations_list` until the `/cms` row is `is_valid`. Don't block on that poll. The
|
|
186
186
|
single rule that makes the overlap safe:
|
package/skills/headless/VERSION
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
version=3.
|
|
2
|
-
commit=
|
|
1
|
+
version=3.25.0
|
|
2
|
+
commit=f6e99e0c7be6
|
|
3
3
|
built=2026-11-03
|
|
@@ -130,7 +130,7 @@ Query the Hostinger connector — the local files are never trusted on their own
|
|
|
130
130
|
- `status: failed` → provisioning stopped before finishing → route to **provision** to self-heal.
|
|
131
131
|
- **Is it an empty headless shell from onboarding?** A `headless` site whose setup is `completed` is
|
|
132
132
|
**not necessarily finished** — onboarding now creates the website *before* the build runs, as an
|
|
133
|
-
**empty headless shell** (`
|
|
133
|
+
**empty headless shell** (`hosting_websites_create { type: "headless_empty" }`): `website_type`
|
|
134
134
|
is `headless` but **no backend is installed** (no WordPress at `/cms`, no store). Tell a shell from a
|
|
135
135
|
real backend the same way provision does: within 24 h the setup `type` is `headless_empty`; otherwise
|
|
136
136
|
`wordpress_installations_list { username, domain, ownership: "all" }` returns **no** `/cms` row and
|
|
@@ -46,7 +46,7 @@ Tell the user the backend and its one-line reason before provisioning.
|
|
|
46
46
|
> that brings its own code and data; it never installs WordPress. PocketBase is not available in this
|
|
47
47
|
> version — refine never proposes it, and there is no `pocketbase/` subfolder; if a brief somehow names
|
|
48
48
|
> it, stop and tell the user rather than improvising it. A **WordPress + Ecommerce** brief (two separate
|
|
49
|
-
> backends — a WordPress site **and** a Hostinger Ecommerce store) has no single combined `
|
|
49
|
+
> backends — a WordPress site **and** a Hostinger Ecommerce store) has no single combined `hosting_websites_create`
|
|
50
50
|
> type yet: stop, tell the user it isn't supported as one site, and offer either to continue with just
|
|
51
51
|
> WordPress or just Ecommerce (route to that one subfolder), **or**, if they want content and a store on
|
|
52
52
|
> **one** site, to switch the brief to **WordPress + WooCommerce** — the one-site path, which routes to
|
|
@@ -56,22 +56,22 @@ Tell the user the backend and its one-line reason before provisioning.
|
|
|
56
56
|
|
|
57
57
|
Onboarding can create the website **before** you ever run, then paste the build prompt into this agent.
|
|
58
58
|
When it does, the domain already has an **empty headless shell**: a website set up with
|
|
59
|
-
`
|
|
59
|
+
`hosting_websites_create { type: "headless_empty" }` — `website_type` is `headless`, but **nothing
|
|
60
60
|
is installed** (no WordPress at `/cms`, no store). It is the hosting slot only, waiting for a backend.
|
|
61
61
|
|
|
62
62
|
So provision has **two entry shapes**, and each subfolder's *detect* step picks between them:
|
|
63
63
|
|
|
64
64
|
- **An empty headless shell already exists for the domain → adopt it and *swap* it to the chosen
|
|
65
|
-
backend. Never call `
|
|
65
|
+
backend. Never call `hosting_websites_create` again, never create a second site.** The swap is backend-specific:
|
|
66
66
|
- **WordPress** → install WordPress **into the existing shell's `/cms`** with
|
|
67
67
|
`wordpress_installations_install { type: "headless" }` (it rewrites the root `.htaccess` and marks
|
|
68
|
-
the site headless-WordPress). Do **not** use `
|
|
68
|
+
the site headless-WordPress). Do **not** use `hosting_websites_create { type: "headless_wordpress" }` — that is
|
|
69
69
|
only for creating a fresh site.
|
|
70
70
|
- **Ecommerce** → the empty headless shell **is** the storefront host already (a `headless_ecommerce`
|
|
71
71
|
website installs no store engine either). Adopt it as the frontend host and go straight to creating
|
|
72
72
|
the store + custom sales channel.
|
|
73
73
|
- **No site exists for the domain at all → create it fresh, exactly as each subfolder defines today**
|
|
74
|
-
(`
|
|
74
|
+
(`hosting_websites_create` with the backend's own `type`).
|
|
75
75
|
|
|
76
76
|
> **Webapp is not part of this handoff at all.** `webapp` is **not** reached on the usual onboarding
|
|
77
77
|
> flow — it is only triggered by experimental actions — so it **ignores headless instances entirely**:
|
|
@@ -107,8 +107,8 @@ asynchronous — fire it, record `provision.in_progress`, and join at the barrie
|
|
|
107
107
|
> 1. **Exact-match the domain** in `hosting_websites_list` (substring filter — match the exact `domain`).
|
|
108
108
|
> 2. **A `headless` row already exists → adopt + swap it, never create.** Install the backend into that
|
|
109
109
|
> same site (WordPress → `wordpress_installations_install { type: "headless" }` into `/cms`; Ecommerce
|
|
110
|
-
> → adopt as the storefront host). **Do not call `
|
|
111
|
-
> 3. **No row at all → create one fresh** with the backend's own `
|
|
110
|
+
> → adopt as the storefront host). **Do not call `hosting_websites_create` again** — that makes a second site.
|
|
111
|
+
> 3. **No row at all → create one fresh** with the backend's own `hosting_websites_create` type. Create it for **this
|
|
112
112
|
> build's domain only** — never provision the backend on a different domain than the frontend (the CMS
|
|
113
113
|
> is the `/cms` path of the same site, never a separate `cms.<domain>`).
|
|
114
114
|
> 4. **A row of a different kind** (`website_type` not `headless`) → **stop and tell the user**; never
|
|
@@ -117,7 +117,7 @@ asynchronous — fire it, record `provision.in_progress`, and join at the barrie
|
|
|
117
117
|
> This is the whole of *Onboarding handoff* above, as one checklist. See it for how to tell an empty
|
|
118
118
|
> shell from an already-provisioned backend.
|
|
119
119
|
|
|
120
|
-
Follow the chosen subfolder's `SKILL.md` through **detect + create** (its
|
|
120
|
+
Follow the chosen subfolder's `SKILL.md` through **detect + create** (its `hosting_websites_create` call). The
|
|
121
121
|
moment the create is accepted and queued, record it in `state.json` and **return** — do not sit on the
|
|
122
122
|
readiness poll:
|
|
123
123
|
|
|
@@ -50,11 +50,10 @@ Same lifecycle as `../wordpress/SKILL.md` Steps 1–2, but `type: "headless_ecom
|
|
|
50
50
|
1. Detect: `hosting_websites_list` / `hosting_websites_list-setups` (exact-match the domain). `completed`
|
|
51
51
|
→ adopt. `running` → poll. `failed` → stop, point at hPanel. If `website_type` is not `headless`
|
|
52
52
|
(plain WordPress, Node.js, …), stop and tell the user — don't overwrite another kind of site.
|
|
53
|
-
2. Create (only if **no** site exists): `
|
|
53
|
+
2. Create (only if **no** site exists): `hosting_websites_create { order_id, type: "headless_ecommerce", domain }`
|
|
54
54
|
— **omit `domain`** for a temporary subdomain: the setup generates one itself and returns it (don't
|
|
55
|
-
call a separate subdomain op first — there's no need in this flow
|
|
56
|
-
generated
|
|
57
|
-
response carries the generated domain; if it differs from the workspace dir, move
|
|
55
|
+
call a separate subdomain op first — there's no need in this flow). The response carries the
|
|
56
|
+
generated domain; if it differs from the workspace dir, move
|
|
58
57
|
`~/.hostinger/<old>/` → `<new>/` (if `<new>/` already exists, stop and ask instead of moving
|
|
59
58
|
into it) and update `brief.md`. Poll `list-setups` to `completed`. `website_type` will be `headless`.
|
|
60
59
|
|
|
@@ -63,7 +62,7 @@ Same lifecycle as `../wordpress/SKILL.md` Steps 1–2, but `type: "headless_ecom
|
|
|
63
62
|
> typically created in onboarding), **adopt it as the storefront host and skip the create.** A
|
|
64
63
|
> `headless_ecommerce` website installs no store engine either, so an empty headless shell *is* the host
|
|
65
64
|
> you need — there is no backend to "swap" on the website side. Record its `username`/`order_id` and go
|
|
66
|
-
> straight to Step 2 (store + custom sales channel). Never call `
|
|
65
|
+
> straight to Step 2 (store + custom sales channel). Never call `hosting_websites_create` on a domain that already
|
|
67
66
|
> has a site.
|
|
68
67
|
|
|
69
68
|
> Don't expect `/cms` or any API on this domain — it serves the storefront you build (Step 6) and
|
|
@@ -15,7 +15,7 @@ frontend step builds into and the deploy step ships to as a Node.js application.
|
|
|
15
15
|
|
|
16
16
|
All website/database operations below go through the Hostinger connector (`execute`).
|
|
17
17
|
|
|
18
|
-
> **Fire vs join (background provision).** Steps 1–2 up to `
|
|
18
|
+
> **Fire vs join (background provision).** Steps 1–2 up to `hosting_websites_create` are the
|
|
19
19
|
> **fire** half: once the setup is queued, record `provision.in_progress` and return to do prepare work
|
|
20
20
|
> (see the router `../SKILL.md`). The readiness **poll** at the end of Step 2, plus Steps 3–5, are the
|
|
21
21
|
> **join** half — run them when an instance-barrier step needs the backend (or immediately, if the
|
|
@@ -29,7 +29,7 @@ All website/database operations below go through the Hostinger connector (`execu
|
|
|
29
29
|
2. `hosting_websites_list-setups { "domain": "<domain>" }` — exact-match the row:
|
|
30
30
|
- `completed` → already provisioned → skip to Step 3 (adopt it).
|
|
31
31
|
- `running` → skip to Step 2 (poll).
|
|
32
|
-
- `failed` → tell the user and point them at hPanel; do **not** call
|
|
32
|
+
- `failed` → tell the user and point them at hPanel; do **not** call `hosting_websites_create` again on your own.
|
|
33
33
|
3. If the site exists but is a different kind (`website_type` is `headless`, or a WordPress/store site),
|
|
34
34
|
stop and tell the user — this domain already hosts something else. **Never create a second site.**
|
|
35
35
|
4. **Only provision a webapp for a `webapp` brief.** A `wordpress` or `ecommerce` brief belongs in those
|
|
@@ -46,16 +46,15 @@ All website/database operations below go through the Hostinger connector (`execu
|
|
|
46
46
|
2. Start the setup as an **empty website** — **omit `type`** (no WordPress, no store):
|
|
47
47
|
|
|
48
48
|
```json
|
|
49
|
-
{ "operation": "
|
|
49
|
+
{ "operation": "hosting_websites_create",
|
|
50
50
|
"params": { "order_id": <order_id>, "domain": "<domain>" } }
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
`domain` must be a **customer-owned** domain. For a temporary `*.hostingersite.com` subdomain,
|
|
54
54
|
**omit `domain`** — the setup generates one itself and returns it in the response. Don't call a
|
|
55
|
-
separate subdomain op to make one first: there's no need in this flow.
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
differs from the workspace directory name, move `~/.hostinger/<old>/` to `~/.hostinger/<new>/`
|
|
55
|
+
separate subdomain op to make one first: there's no need in this flow. The response then carries the
|
|
56
|
+
generated domain: if it differs from the workspace directory name, move `~/.hostinger/<old>/` to
|
|
57
|
+
`~/.hostinger/<new>/`
|
|
59
58
|
(if `<new>/` already exists, stop and ask instead of moving into it),
|
|
60
59
|
update the domain in `brief.md`, and tell the user the new domain.
|
|
61
60
|
3. Poll `hosting_websites_list-setups { "domain": "<domain>" }` every ~15 s until `completed`
|
|
@@ -19,7 +19,7 @@ adapter, site marked `headless`. **Out:** `site.json`.
|
|
|
19
19
|
|
|
20
20
|
All operations below go through the Hostinger connector (`execute`).
|
|
21
21
|
|
|
22
|
-
> **Fire vs join (background provision).** Step 1, plus the queuing call — `
|
|
22
|
+
> **Fire vs join (background provision).** Step 1, plus the queuing call — `hosting_websites_create`
|
|
23
23
|
> for a fresh site (Step 2) **or** `wordpress_installations_install` to swap an empty headless shell
|
|
24
24
|
> (Step 2b) — are the **fire** half: once the job is queued, record `provision.in_progress` and return
|
|
25
25
|
> to do prepare work (see the router `../SKILL.md`). The readiness **poll** at the end of Step 2 / 2b,
|
|
@@ -38,12 +38,12 @@ All operations below go through the Hostinger connector (`execute`).
|
|
|
38
38
|
(see the router's *Onboarding handoff*): check `hosting_websites_list-setups { "domain": "<domain>" }`
|
|
39
39
|
(exact row) and `wordpress_installations_list { username, domain, ownership: "all" }` (exact row):
|
|
40
40
|
- Setup `running` → provisioning is underway → skip to Step 2's poll.
|
|
41
|
-
- Setup `failed` → tell the user and point them at hPanel; do **not** call
|
|
41
|
+
- Setup `failed` → tell the user and point them at hPanel; do **not** call `hosting_websites_create` again yourself.
|
|
42
42
|
- A WordPress install with `directory: "cms"` already present (or setup `type: headless_wordpress`)
|
|
43
43
|
→ **already provisioned** → skip to Step 3 (adopt it).
|
|
44
44
|
- A `headless` site with **no** `/cms` install (an **empty headless shell** — setup
|
|
45
45
|
`type: headless_empty`, typically from onboarding) → **swap it to WordPress** (Step 2b). Do **not**
|
|
46
|
-
call `
|
|
46
|
+
call `hosting_websites_create` again — the website already exists; you only install WordPress into it.
|
|
47
47
|
|
|
48
48
|
## Step 2 — Create a fresh headless WordPress site (only when no site exists)
|
|
49
49
|
|
|
@@ -52,16 +52,15 @@ All operations below go through the Hostinger connector (`execute`).
|
|
|
52
52
|
2. Start the setup:
|
|
53
53
|
|
|
54
54
|
```json
|
|
55
|
-
{ "operation": "
|
|
55
|
+
{ "operation": "hosting_websites_create",
|
|
56
56
|
"params": { "order_id": <order_id>, "type": "headless_wordpress", "domain": "<domain>" } }
|
|
57
57
|
```
|
|
58
58
|
|
|
59
59
|
`domain` must be a **customer-owned** domain. For a temporary `*.hostingersite.com` subdomain,
|
|
60
60
|
**omit `domain`** — the setup generates one itself and returns it in the response. Don't call a
|
|
61
|
-
separate subdomain op to make one first: there's no need in this flow.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if it differs from the workspace directory name, move `~/.hostinger/<old>/` to `~/.hostinger/<new>/`
|
|
61
|
+
separate subdomain op to make one first: there's no need in this flow. The response then carries the
|
|
62
|
+
generated domain: if it differs from the workspace directory name, move `~/.hostinger/<old>/` to
|
|
63
|
+
`~/.hostinger/<new>/`
|
|
65
64
|
(if `<new>/` already exists, stop and ask instead of moving into it),
|
|
66
65
|
update the domain in `brief.md`, and tell the user the new domain.
|
|
67
66
|
Admin credentials are generated by the platform; never ask the user for a password.
|
|
@@ -70,7 +69,7 @@ All operations below go through the Hostinger connector (`execute`).
|
|
|
70
69
|
|
|
71
70
|
## Step 2b — Swap an empty headless shell to WordPress (only when onboarding already made the shell)
|
|
72
71
|
|
|
73
|
-
The website already exists as an empty `headless` shell, so there is **no `
|
|
72
|
+
The website already exists as an empty `headless` shell, so there is **no `hosting_websites_create`** here — you
|
|
74
73
|
install WordPress straight into its `/cms` directory. This is the onboarding handoff path.
|
|
75
74
|
|
|
76
75
|
1. Use the shell's `username` and `order_id` from Step 1's row — no new order pick, no new website.
|