hostinger-api-mcp 3.25.1 → 3.27.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 +24 -0
- package/README.md +56 -1
- package/gemini-extension.json +1 -1
- package/package.json +2 -1
- package/server.json +2 -2
- package/skills/headless/VERSION +2 -2
- package/skills/headless/steps/05-design/SKILL.md +38 -138
- package/skills/headless/steps/06-frontend/SKILL.md +2 -1
- package/skills/headless/steps/09-done/SKILL.md +1 -1
- package/src/core/runtime.js +1 -1
- package/src/core/runtime.ts +1 -1
- package/src/core/skills.js +9 -16
- package/src/core/skills.ts +9 -16
- package/src/core/tools/all.js +167 -0
- package/src/core/tools/all.ts +167 -0
- package/src/core/tools/gpu.js +221 -0
- package/src/core/tools/gpu.ts +239 -0
- 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/gpu.js +6 -0
- package/src/servers/gpu.ts +6 -0
- 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 +70 -0
- package/skills/headless/steps/05-design/logo-kit.mjs +0 -430
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,30 @@ 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.27.0 — 2026-11-03
|
|
8
|
+
|
|
9
|
+
### Operations
|
|
10
|
+
|
|
11
|
+
- Added `gpu_catalog_pool-groups` — Get pool groups
|
|
12
|
+
- Added `gpu_catalog_pool-instance-types` — Get pool instance types
|
|
13
|
+
- Added `gpu_catalog_pool-os-templates` — Get pool OS templates
|
|
14
|
+
- Added `gpu_catalog_pool` — Get pool list
|
|
15
|
+
|
|
16
|
+
### Also in this release
|
|
17
|
+
|
|
18
|
+
- Documentation: `README.md`
|
|
19
|
+
- Dependencies: `package-lock.json`, `package.json`
|
|
20
|
+
- Request handling and authentication: `src/core/runtime.js`, `src/core/runtime.ts`
|
|
21
|
+
- Build and packaging: `types.d.ts`
|
|
22
|
+
- Server entry points: `src/servers/gpu.js`, `src/servers/gpu.ts`
|
|
23
|
+
|
|
24
|
+
## v3.26.0 — 2026-11-03
|
|
25
|
+
|
|
26
|
+
### Also in this release
|
|
27
|
+
|
|
28
|
+
- Bundled agent skills: 5 files
|
|
29
|
+
- Other files: `src/core/skills.js`, `src/core/skills.ts`
|
|
30
|
+
|
|
7
31
|
## v3.25.1 — 2026-11-03
|
|
8
32
|
|
|
9
33
|
### Operations
|
package/README.md
CHANGED
|
@@ -69,13 +69,14 @@ 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 (412 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
|
|
76
76
|
- `hostinger-dns-mcp` — 9 operations for dns
|
|
77
77
|
- `hostinger-domains-mcp` — 43 operations for domains
|
|
78
78
|
- `hostinger-ecommerce-mcp` — 30 operations for ecommerce
|
|
79
|
+
- `hostinger-gpu-mcp` — 5 operations for gpu
|
|
79
80
|
- `hostinger-horizons-mcp` — 7 operations for horizons
|
|
80
81
|
- `hostinger-hosting-mcp` — 57 operations for hosting
|
|
81
82
|
- `hostinger-mail-mcp` — 39 operations for mail
|
|
@@ -1740,6 +1741,60 @@ store currency. Returns the created variant.
|
|
|
1740
1741
|
- **Method**: `POST`
|
|
1741
1742
|
- **Path**: `/api/ecommerce/v1/stores/{store_id}/products/{product_id}/variants`
|
|
1742
1743
|
|
|
1744
|
+
### `hostinger-gpu-mcp`
|
|
1745
|
+
|
|
1746
|
+
#### changelog_list-entries
|
|
1747
|
+
|
|
1748
|
+
What's new and what's coming at Hostinger: list entries of the public Hostinger changelog (release notes, product updates, recent changes, new features and improvements) and of the public roadmap (upcoming features not released yet). Released entries come newest first; upcoming items come soonest expected release first. Reads released changelog entries by default; pick upcoming for the roadmap or all for both. Filter by product or date. Each entry has its title, summary, product, URL, status (released or upcoming), and plan when the entry states one; released entries have their date, upcoming items their expected release date when set. Needs no API token.
|
|
1749
|
+
|
|
1750
|
+
- **Method**: `custom`
|
|
1751
|
+
- **Path**: `custom`
|
|
1752
|
+
|
|
1753
|
+
#### gpu_catalog_pool-groups
|
|
1754
|
+
|
|
1755
|
+
Retrieve GPU pool groups, ordered by name.
|
|
1756
|
+
|
|
1757
|
+
Each group bundles the pools of one GPU model and lists its currently available pools,
|
|
1758
|
+
whether any of them is available and the lowest hourly price among its instance types.
|
|
1759
|
+
The price is returned even when the group is out of stock.
|
|
1760
|
+
|
|
1761
|
+
Use this endpoint to show which GPU models can be ordered and from what price.
|
|
1762
|
+
|
|
1763
|
+
- **Method**: `GET`
|
|
1764
|
+
- **Path**: `/api/gpu/v1/pools/groups`
|
|
1765
|
+
|
|
1766
|
+
#### gpu_catalog_pool-instance-types
|
|
1767
|
+
|
|
1768
|
+
Retrieve the instance types offered by a specified GPU pool, ordered by CPU core count.
|
|
1769
|
+
|
|
1770
|
+
Each instance type describes its CPU, memory and storage, and its hourly price.
|
|
1771
|
+
Only instance types that can currently be ordered are returned.
|
|
1772
|
+
|
|
1773
|
+
Use this endpoint to choose the `pool_instance_id` for a new GPU instance.
|
|
1774
|
+
|
|
1775
|
+
- **Method**: `GET`
|
|
1776
|
+
- **Path**: `/api/gpu/v1/pools/{poolId}/instances`
|
|
1777
|
+
|
|
1778
|
+
#### gpu_catalog_pool-os-templates
|
|
1779
|
+
|
|
1780
|
+
Retrieve the OS templates that can be installed on a specified GPU pool instance type.
|
|
1781
|
+
|
|
1782
|
+
Use this endpoint to choose the `os_template_id` for a new GPU instance.
|
|
1783
|
+
|
|
1784
|
+
- **Method**: `GET`
|
|
1785
|
+
- **Path**: `/api/gpu/v1/pools/{poolId}/instances/{poolInstanceId}/os-templates`
|
|
1786
|
+
|
|
1787
|
+
#### gpu_catalog_pool
|
|
1788
|
+
|
|
1789
|
+
Retrieve all available GPU pools, ordered by name.
|
|
1790
|
+
|
|
1791
|
+
A pool serves GPU accelerators of one model from a single region.
|
|
1792
|
+
|
|
1793
|
+
Use this endpoint to choose a pool before listing its instance types.
|
|
1794
|
+
|
|
1795
|
+
- **Method**: `GET`
|
|
1796
|
+
- **Path**: `/api/gpu/v1/pools`
|
|
1797
|
+
|
|
1743
1798
|
### `hostinger-horizons-mcp`
|
|
1744
1799
|
|
|
1745
1800
|
#### changelog_list-entries
|
package/gemini-extension.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hostinger-api-mcp",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.27.0",
|
|
4
4
|
"mcpName": "io.github.hostinger/hostinger-api-mcp",
|
|
5
5
|
"description": "MCP server for Hostinger API",
|
|
6
6
|
"repository": {
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"hostinger-dns-mcp": "./src/servers/dns.js",
|
|
26
26
|
"hostinger-domains-mcp": "./src/servers/domains.js",
|
|
27
27
|
"hostinger-ecommerce-mcp": "./src/servers/ecommerce.js",
|
|
28
|
+
"hostinger-gpu-mcp": "./src/servers/gpu.js",
|
|
28
29
|
"hostinger-horizons-mcp": "./src/servers/horizons.js",
|
|
29
30
|
"hostinger-hosting-mcp": "./src/servers/hosting.js",
|
|
30
31
|
"hostinger-mail-mcp": "./src/servers/mail.js",
|
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.27.0",
|
|
10
10
|
"packages": [
|
|
11
11
|
{
|
|
12
12
|
"registryType": "npm",
|
|
13
13
|
"identifier": "@hostinger/mcp",
|
|
14
|
-
"version": "3.
|
|
14
|
+
"version": "3.27.0",
|
|
15
15
|
"transport": {
|
|
16
16
|
"type": "stdio"
|
|
17
17
|
},
|
package/skills/headless/VERSION
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
version=3.
|
|
2
|
-
commit=
|
|
1
|
+
version=3.27.0
|
|
2
|
+
commit=dfa3d353b2a7
|
|
3
3
|
built=2026-11-03
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: headless-step-design
|
|
3
|
-
description: "Step 5 (design) of the Hostinger Headless flow. Derives three distinct design directions from brief.md (plus any reference sites and brand assets), lets the user pick one in a single question, checks the chosen one against the 8-point grid and WCAG 2.2 AA,
|
|
3
|
+
description: "Step 5 (design) of the Hostinger Headless flow. Derives three distinct design directions from brief.md (plus any reference sites and brand assets), lets the user pick one in a single question, checks the chosen one against the 8-point grid and WCAG 2.2 AA, draws the logo (the site name as text beside a small SVG icon that is also the favicon), following any logo wish the owner gave, then writes design.md — tokens, type, logo, components, per-page composition, accessibility and imagery — as the contract the frontend implements (the framework/stack is chosen later by the frontend step). When the brief says to keep an existing look, writes design.md from that look and its own logo instead. Prepare work: runs during the provision wait and never touches the backend."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# headless-step-design
|
|
@@ -101,13 +101,9 @@ Read `brief.md`, `state.json`, and `content-model.md` if it exists.
|
|
|
101
101
|
shade of the same hue in that role only. Spacing moves to the nearest grid value, and a font
|
|
102
102
|
without an `@fontsource` package swaps to the closest one that resolves (5.4).
|
|
103
103
|
4. **Logo.** Reuse the existing logo and favicon unchanged; never redraw or recolour them. With no
|
|
104
|
-
existing logo, the header shows the site name as text in the kept display font
|
|
105
|
-
designed.
|
|
104
|
+
existing logo, the header shows the site name as text in the kept display font; no icon is drawn.
|
|
106
105
|
5. **Write `design.md`** (Step 7) from the kept look, then hand off as usual. In **Logo**:
|
|
107
106
|
- *Files* and *Use* name the files as saved (a `.png` stays a `.png`), or say "No favicon kept".
|
|
108
|
-
- *Built from* says "Kept, not rebuilt". *Measured* still gives the width at `--logo-h-sm`
|
|
109
|
-
(≤ 192 px; else lower `--logo-h-sm` or show the name as text on small screens), and the header
|
|
110
|
-
link has `alt` = the site name and a target of at least 24 px (as in Step 6).
|
|
111
107
|
- With no logo: *Files* says "None", *Use* says the header link holds the site name as text in
|
|
112
108
|
`--font-display` and the browser's default favicon stays, and the *Don't* line is dropped.
|
|
113
109
|
|
|
@@ -118,7 +114,7 @@ Before inventing anything, gather what already constrains the design:
|
|
|
118
114
|
| Signal | Where | How it constrains |
|
|
119
115
|
|---|---|---|
|
|
120
116
|
| Tone, purpose, audience | `brief.md` → *Tone*, *Purpose*, *Audience* | Sets the mood all three directions must fit |
|
|
121
|
-
| Brand assets | `brief.md` → *Assets* | Logo, brand colours and fonts are **fixed** in every direction. Never recolour a supplied logo; Step 6 uses it instead of
|
|
117
|
+
| Brand assets | `brief.md` → *Assets* | Logo, brand colours and fonts are **fixed** in every direction. Never recolour a supplied logo; Step 6 uses it instead of drawing an icon |
|
|
122
118
|
| Pages and entities | `content-model.md` → *Navigation*, *Pages*, *Articles*; if it doesn't exist yet, `brief.md` → *Pages* | Drives the component inventory and page composition |
|
|
123
119
|
| Reference sites | URLs in the brief or the conversation | Cues to borrow (see below) |
|
|
124
120
|
| Images already sourced | `content-model.md` → the image lines under *Articles* (skip if none yet) | Glance at a few at small size; keep accents from clashing with their dominant colours |
|
|
@@ -165,9 +161,9 @@ Each direction carries exactly this:
|
|
|
165
161
|
outlines, hard 8 px offset shadows, tilted cards").
|
|
166
162
|
- **Signature element** — the one memorable move (a scrolling marquee, stickers, oversized numerals,
|
|
167
163
|
a duotone photo treatment). If it moves on its own, it gets a pause control (5.3).
|
|
168
|
-
- **Logo idea** — one line on
|
|
169
|
-
|
|
170
|
-
direction
|
|
164
|
+
- **Logo idea** — one line on the small icon beside the name ("a smiling sun in butter yellow with
|
|
165
|
+
an ink outline"). When the brief carries a logo wish (*Design direction* or *Assets*), every
|
|
166
|
+
direction's logo idea is that wish in its own style. A wish is words
|
|
171
167
|
describing a logo; a logo file in *Assets* is a supplied logo and wins (Step 6).
|
|
172
168
|
|
|
173
169
|
**Only offer what can pass.** Before asking, run two quick gates on **all three**:
|
|
@@ -175,8 +171,7 @@ Each direction carries exactly this:
|
|
|
175
171
|
1. **Contrast gate.** Every colour that will carry text (base, surfaces, and any accent used as a
|
|
176
172
|
text block) has a palette text colour reaching **4.5:1** on it. Two text colours are fine (dark on
|
|
177
173
|
light blocks, light on dark ones). Accents that only ever hold large text need 3:1.
|
|
178
|
-
2. **Font gate.** Each font resolves on npm
|
|
179
|
-
package, because the logo is built from it (5.4).
|
|
174
|
+
2. **Font gate.** Each font resolves on npm (5.4).
|
|
180
175
|
|
|
181
176
|
A direction that fails either gate gets adjusted, not offered as-is. Don't offer a look that only
|
|
182
177
|
works by breaking the rules, such as body text on a neon accent or a marquee that can't be stopped.
|
|
@@ -199,7 +194,7 @@ notes. The question may end with one plain clause saying they can add a logo ide
|
|
|
199
194
|
never suggest one or give an example: that idea would end up in the logo.
|
|
200
195
|
|
|
201
196
|
> **Sticker-book maximal** — Loud and playful, like a scrapbook: candy pink, butter yellow and lilac,
|
|
202
|
-
> chunky headlines, tilted sticker photos and a
|
|
197
|
+
> chunky headlines, tilted sticker photos and a smiling-sun logo.
|
|
203
198
|
|
|
204
199
|
> **Midnight disco** — A dark, glowing night-out feel: deep purple with neon pink, yellow and
|
|
205
200
|
> turquoise, heavy rounded headlines and a logo like a neon sign.
|
|
@@ -217,8 +212,8 @@ Then:
|
|
|
217
212
|
**Logo wish.** An answer can carry a logo idea next to the pick ("A, and make the logo a little
|
|
218
213
|
teapot"); it replaces the chosen direction's logo idea, and wins over a wish from the brief.
|
|
219
214
|
Whenever the logo follows a wish, from the answer or the brief, add it once to the line that confirms
|
|
220
|
-
the pick: *"The logo follows your idea: a little teapot."* If
|
|
221
|
-
detailed illustration, a photo),
|
|
215
|
+
the pick: *"The logo follows your idea: a little teapot."* If it can't be a small icon as said (a
|
|
216
|
+
detailed illustration, a photo), draw a simple version of it and name what you simplified in that
|
|
222
217
|
same line. Don't ask a follow-up.
|
|
223
218
|
|
|
224
219
|
Don't ask about anything else in this step.
|
|
@@ -297,9 +292,7 @@ These criteria are settled at design time. Write each answer into the **Accessib
|
|
|
297
292
|
For each family, prefer the variable package and fall back to the static one:
|
|
298
293
|
`npm view @fontsource-variable/<slug> version`, then `npm view @fontsource/<slug> version`. One must
|
|
299
294
|
answer with a version. If neither does, swap to the closest family that does. Record the exact
|
|
300
|
-
package names.
|
|
301
|
-
(`npm view @fontsource/<slug> version`): the static packages ship `.woff` files the logo kit can
|
|
302
|
-
read; the variable ones ship only `.woff2`.
|
|
295
|
+
package names.
|
|
303
296
|
|
|
304
297
|
### 5.5 The header fits on one line
|
|
305
298
|
|
|
@@ -314,7 +307,10 @@ can't build it that way.
|
|
|
314
307
|
button at the width where the logo, all nav items and the button stop fitting on one line, which is
|
|
315
308
|
usually wider than the mobile breakpoint. Estimate that width from the number of nav items and their
|
|
316
309
|
label lengths, round up to a multiple of 8, and make it the header's own breakpoint. Below it, only
|
|
317
|
-
the logo and the menu button show; the nav items and the CTA move into the opened menu.
|
|
310
|
+
the logo and the menu button show; the nav items and the CTA move into the opened menu. At 320 px
|
|
311
|
+
the icon, the site name (`--text-logo`, `white-space: nowrap`) and the menu button still fit one
|
|
312
|
+
row; lower `--text-logo` for a long name until they do. A supplied or kept logo and the menu
|
|
313
|
+
button must fit too; lower `--logo-h` (still ≥ 24 px) until they do.
|
|
318
314
|
- **Keep header labels short.** A nav label is one or two short words; a button label is a two-word
|
|
319
315
|
verb phrase at most ("Book now", not "Book an Appointment"). When the content model gives a long
|
|
320
316
|
navigation label, the header may show a shorter form ("Contact & Booking" → "Contact") while the
|
|
@@ -322,114 +318,18 @@ can't build it that way.
|
|
|
322
318
|
- Record the header breakpoint in *Grid, shape & motion* and the `nowrap` + collapse rule in the
|
|
323
319
|
**Header + nav** component row (and its `≤ 320 px` cell).
|
|
324
320
|
|
|
325
|
-
## Step 6 —
|
|
321
|
+
## Step 6 — Draw the logo
|
|
326
322
|
|
|
327
323
|
**The user supplied a logo** → copy it into `brand/` unchanged, note it in the **Logo** section, and
|
|
328
324
|
skip the rest of this step. Never redraw or recolour it.
|
|
329
325
|
|
|
330
|
-
Otherwise
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
326
|
+
Otherwise the logo is the brief's **Site name**, spelled as the user confirmed it, as text in the
|
|
327
|
+
display font, beside one small icon. Write the icon by hand as `brand/logo-mark.svg`: the chosen
|
|
328
|
+
direction's **logo idea** (or the owner's logo wish, Step 4) in palette colours, simple enough to
|
|
329
|
+
read at 16 px on light and dark tab bars, because it is also the favicon. Give it a `viewBox` and
|
|
330
|
+
no text inside: the name beside it is the text. No emoji or raster clip-art.
|
|
334
331
|
|
|
335
|
-
|
|
336
|
-
|---|---|---|
|
|
337
|
-
| **Letter swap** | One letter becomes a simple shape tied to the subject: O → smiley, sun, loaf, plate, eye; I → candle, pencil, brush; A → roof, tent. Swap **one character** only, even if the letter appears twice, and the word must still read | Playful, friendly brands |
|
|
338
|
-
| **Bounce** | Letters tilt ±3–6° and bob off the baseline, each in a palette colour, with an ink outline and hard shadow | Loud, maximal directions |
|
|
339
|
-
| **Stack** | The name split over 2–3 lines on coloured tiles, or set as a tight block | Long names, bold directions |
|
|
340
|
-
| **Tag** | The main word large; a short second word on a pill, ribbon or tab | Two-part names ("Dopamine Den") |
|
|
341
|
-
| **Seal** | The name around a ring, with a monogram or symbol in the middle | A secondary mark (footer, hero sticker, social avatar), never the header logo |
|
|
342
|
-
| **Typographic contrast** | Weight, style or case contrast between words (a light italic word next to a heavy upright one), custom tight spacing, one shared stroke or cut between letters | Quiet, refined, editorial directions |
|
|
343
|
-
|
|
344
|
-
No emoji, clip-art, gradients, or details that vanish at small sizes. Colours come only from the
|
|
345
|
-
palette (base and surface colours count).
|
|
346
|
-
|
|
347
|
-
### Build it with the logo kit
|
|
348
|
-
|
|
349
|
-
The kit (`logo-kit.mjs`, next to this file) does the error-prone parts: it outlines letters into
|
|
350
|
-
vector paths, sets text on a circle, draws the outline-and-shadow treatment, measures, validates
|
|
351
|
-
the output, checks the sizes and renders a preview. You write the composition. Copy the kit into
|
|
352
|
-
`brand/` so the build is self-contained and a redesign can re-run it:
|
|
353
|
-
|
|
354
|
-
```bash
|
|
355
|
-
mkdir -p ~/.hostinger/<domain>/brand && cd ~/.hostinger/<domain>/brand
|
|
356
|
-
cp <the folder this SKILL.md is in>/logo-kit.mjs .
|
|
357
|
-
npm init -y >/dev/null && npm i opentype.js @resvg/resvg-js @fontsource/<display-slug>
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
Write `brand/logo-build.mjs`, import from `./logo-kit.mjs`, and always run it from `brand/`
|
|
361
|
-
(packages resolve from the working directory):
|
|
362
|
-
|
|
363
|
-
| Kit function | Use |
|
|
364
|
-
|---|---|
|
|
365
|
-
| `loadFont(slug, weight, style)` | Loads a static `@fontsource` weight across all its subsets (`latin`, `latin-ext`, …), so accented letters like Ė or Ł resolve; `style` is `'normal'` or `'italic'`. Throws if that weight or style isn't in the package, so pick another |
|
|
366
|
-
| `layout(font, text, size)` | Kerned glyph positions, total width, `capHeight`, `xHeight`; place letters one by one for bounce or swap. Throws if a character isn't in the font |
|
|
367
|
-
| `glyphPath(glyph, x, baselineY, size)` / `textPath(font, text, x, baselineY, size)` | Outlined path data for one letter or a whole word. For typographic contrast, load two weights or styles and set each word with `textPath` |
|
|
368
|
-
| `pathBox(font, text, x, baselineY, size)` | Tight box around a word's outlines; size the viewBox from it plus room for outlines, shadows and tilt |
|
|
369
|
-
| `arcText(font, text, { cx, cy, r, size })` | Letters around a circle, for seals |
|
|
370
|
-
| `sticker(d, { fill, ink, strokeWidth, shadow, shadowColor, transform })` | Ink outline + hard offset shadow, for outlined directions. On dark backgrounds give the outline and shadow a palette colour that shows (`shadowColor` defaults to `ink`) |
|
|
371
|
-
| `svgDoc({ width, height, title, body })` | Root SVG with `role="img"` and a `<title>` |
|
|
372
|
-
| `check(svg)` | Throws on `NaN`, live `<text>`, a missing title or viewBox, or an `&` that isn't an XML entity. Run it on every file before writing |
|
|
373
|
-
| `tile(size, fill)` | The rounded tile for the mark and favicon; draw the symbol after it |
|
|
374
|
-
| `widthBudget(letterHeight, height)` | The widest viewBox that still fits 192 px on small screens, for a logo of that height; see below |
|
|
375
|
-
| `checkLogo({ logo, mark, favicon, letterHeight, background })` | Runs `check()` on all three files, checks their sizes and renders `brand/logo-preview.png`; see below |
|
|
376
|
-
|
|
377
|
-
Wrap every file in `svgDoc()`, never a hand-written `<svg>` or `<title>`: it escapes the site name,
|
|
378
|
-
and one bare `&` (as in "Salt & Pepper") makes the browser show nothing.
|
|
379
|
-
|
|
380
|
-
Never call opentype's `path.toPathData()` directly; the kit's serializer exists because opentype.js
|
|
381
|
-
2.0 writes `NaN` into some paths, and browsers silently stop drawing at the first `NaN`.
|
|
382
|
-
|
|
383
|
-
### Deliver four files
|
|
384
|
-
|
|
385
|
-
| File | What | Must read clearly at |
|
|
386
|
-
|---|---|---|
|
|
387
|
-
| `brand/logo.svg` | The primary, mostly horizontal logo for the header | Its header display heights (desktop and small screens) |
|
|
388
|
-
| `brand/logo-mark.svg` | A square icon from the same idea (initial, monogram or the swapped symbol) on a `tile()` in a palette colour | 32 px |
|
|
389
|
-
| `brand/favicon.svg` | The simplest form of the mark: same tile, no shadow, no thin details, outlines thickened if it has any | 16 px, on both light and dark browser tab bars |
|
|
390
|
-
| `brand/logo-build.mjs` | The script that built them, with `package.json`, kept so a redesign can adjust it | — |
|
|
391
|
-
|
|
392
|
-
Add `brand/logo-seal.svg` only if the direction uses a seal as a secondary mark. Delete
|
|
393
|
-
`brand/node_modules` when you're done; a redesign runs `npm i` in `brand/` first.
|
|
394
|
-
|
|
395
|
-
**Compose within the budget, so the first build passes.** The small-screen logo is at most 192 px
|
|
396
|
-
wide with letters at least 16 px tall, so the whole logo can be only about 10–12 times as wide as
|
|
397
|
-
its smallest letters are tall, whatever its height. On one line that's about ten letters plus a
|
|
398
|
-
symbol; a longer name stacks or tags, and a second word set at half size halves the room. Size the
|
|
399
|
-
viewBox in `logo-build.mjs` against `widthBudget(letterHeight, viewBoxHeight)`, the exact limit at
|
|
400
|
-
the heights the kit picks; with your own `heights`, the FAIL line gives the limit. Draw the mark's
|
|
401
|
-
symbol from simple, recognisable shapes that still read at 32 px; fine natural forms like petals or
|
|
402
|
-
leaves turn to mush.
|
|
403
|
-
|
|
404
|
-
**Check the sizes and look at it after every build.** `letterHeight` is in viewBox units: the
|
|
405
|
-
`xHeight` from `layout()` when the logo is mostly lowercase, `capHeight` when it's mostly capitals;
|
|
406
|
-
for mixed fonts, the smaller word's. End `logo-build.mjs` with:
|
|
407
|
-
|
|
408
|
-
```js
|
|
409
|
-
checkLogo({ logo, mark, favicon, letterHeight, background: '<page background colour>' });
|
|
410
|
-
```
|
|
411
|
-
|
|
412
|
-
It picks the header heights for you: `--logo-h-sm` is the smallest multiple of 8 that makes the
|
|
413
|
-
letters 16 px, and `--logo-h` the same but at least 48 px, both at most 80 px, so a stacked lockup
|
|
414
|
-
keeps its words large or sets the mark beside them. Pass `heights: { desktop, small }` only when the
|
|
415
|
-
direction needs a larger header logo. It first prints `--logo-h`, `--logo-h-sm` and the **Measured**
|
|
416
|
-
line for `design.md`, then PASS or FAIL for the logo's letters ≥ 16 px at both
|
|
417
|
-
heights, width ≤ 192 px on small screens, headroom around everything drawn and heights in multiples
|
|
418
|
-
of 8; for the mark and favicon sitting on a `tile()` with nothing clipped and room around
|
|
419
|
-
the symbol; and for no shadow on the favicon. Every FAIL names its fixes and the number to reach. It
|
|
420
|
-
then renders `logo-preview.png` (the logo at both heights on the page background, the mark at 32 px
|
|
421
|
-
and favicon at 16 px on light and dark strips, each also enlarged), and throws if anything failed.
|
|
422
|
-
|
|
423
|
-
Then read `logo-preview.png`; don't search for another renderer or read the SVG source. Rebuild only
|
|
424
|
-
for a FAIL line or something in the preview that reads wrong, such as collisions, a clipped or
|
|
425
|
-
clearly off-centre mark, or a favicon detail that turns to mush, and fix everything you saw in one
|
|
426
|
-
rebuild. Optical nudges of a few pixels and the header height aren't reasons to rebuild. A symbol
|
|
427
|
-
gets one redraw: if it still reads wrong, replace it with a simpler form of the idea, such as the
|
|
428
|
-
initial, in the next build. If the kit says "preview not rendered", rely on the size check and list
|
|
429
|
-
"logo not visually checked" under gaps in the final report.
|
|
430
|
-
|
|
431
|
-
The logo is exempt from text-contrast minimums, but the header link around it needs `alt` = the site
|
|
432
|
-
name and a target of at least 24 px.
|
|
332
|
+
Keep it quick: a few minutes, no installs, build scripts or preview loops.
|
|
433
333
|
|
|
434
334
|
Don't show the logo to the user in this step; they see it in the preview.
|
|
435
335
|
|
|
@@ -498,8 +398,8 @@ confirms the framework (default Next.js SSR; ecommerce must be SSR) and records
|
|
|
498
398
|
/* layout */
|
|
499
399
|
--content-max: …px; /* multiple of 8 */
|
|
500
400
|
--header-h: …px; /* header band height, multiple of 8; scroll-padding-top uses it if sticky */
|
|
501
|
-
--logo-h: …px; /* header logo height
|
|
502
|
-
--logo
|
|
401
|
+
--logo-h: …px; /* header icon (or supplied logo) height, multiple of 8, ≥ 24 */
|
|
402
|
+
--text-logo: …rem; /* site name beside the icon; icon + name + menu button fit at 320 px */
|
|
503
403
|
}
|
|
504
404
|
```
|
|
505
405
|
|
|
@@ -516,17 +416,17 @@ confirms the framework (default Next.js SSR; ecommerce must be SSR) and records
|
|
|
516
416
|
- **Body:** <family> (`@fontsource-variable/<slug>@<version>`); `--text-body` / `--leading-body`, measure ≤ 68ch
|
|
517
417
|
|
|
518
418
|
## Logo
|
|
519
|
-
- **Concept:** <
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
- **
|
|
523
|
-
- **
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
alt="<Site name>" style="height: var(--logo-h)"
|
|
528
|
-
|
|
529
|
-
- **Don't:** recolour
|
|
419
|
+
- **Concept:** <what the icon shows, plus "From the owner: '<their words>'" only when it follows
|
|
420
|
+
their wish | "Supplied by the user" | "Kept from <source>" | "No logo: owner kept the current look"
|
|
421
|
+
(header shows the site name as text in `--font-display`)>
|
|
422
|
+
- **Files:** `brand/logo-mark.svg` (header icon at `--logo-h`, and the favicon)
|
|
423
|
+
- **Use:** the frontend copies `brand/` into `public/`. Header: `<a href="/"><img src="/logo-mark.svg"
|
|
424
|
+
alt="" style="height: var(--logo-h)"><Site name></a>`, the name as text in `--font-display`, so
|
|
425
|
+
the link's accessible name is the site name. Favicon: `<link rel="icon" href="/logo-mark.svg"
|
|
426
|
+
type="image/svg+xml">`. A supplied or kept logo goes in the link alone, as
|
|
427
|
+
`<img src="/<file>" alt="<Site name>" style="height: var(--logo-h)">`, with its own favicon if one
|
|
428
|
+
was supplied or kept, else the browser default.
|
|
429
|
+
- **Don't:** recolour or stretch the icon, or replace the name text with an image of it.
|
|
530
430
|
|
|
531
431
|
## Grid, shape & motion
|
|
532
432
|
<section padding desktop/mobile (space tokens), gutters, breakpoints in px (multiples of 8), borders,
|
|
@@ -575,9 +475,9 @@ duotone…); alt text written from what the photo shows.>
|
|
|
575
475
|
nowrap`); the inline nav collapses to a menu button at the width it stops fitting, not only at the
|
|
576
476
|
mobile breakpoint (5.5).
|
|
577
477
|
- **Brand assets are fixed.** A supplied logo, colour or font appears in every direction, unchanged.
|
|
578
|
-
- **
|
|
579
|
-
|
|
580
|
-
logo shows the
|
|
478
|
+
- **The logo is the name plus a simple icon.** The site name as text in the display font beside a
|
|
479
|
+
small hand-written SVG icon that is also the favicon, or a supplied or kept logo unchanged. No
|
|
480
|
+
emoji or raster clip-art. A kept look with no logo shows the name as text and gets no icon.
|
|
581
481
|
- **Self-hosted fonts only** (`@fontsource`). No Google Fonts or other font CDN links in the output.
|
|
582
482
|
- **The tokens block is the only source of values** (breakpoints excepted). Components and pages
|
|
583
483
|
reference tokens, never raw hex codes, pixel values or font names.
|
|
@@ -83,7 +83,8 @@ accessibility — plus the logo files in `brand/`. Don't re-run design questions
|
|
|
83
83
|
|
|
84
84
|
- Treat `design.md` as the contract: the built pages should match its tokens, type scale, components and
|
|
85
85
|
per-page composition, and the 8-point grid / WCAG 2.2 AA rules it carries.
|
|
86
|
-
-
|
|
86
|
+
- Build the **logo** and favicon exactly as `design.md` → **Logo** → *Use* says; never recolour or redraw
|
|
87
|
+
what is in `brand/`.
|
|
87
88
|
- If `design.md` is **missing** (e.g. a resumed older build), fall back to `brief.md → Design direction`
|
|
88
89
|
(reference site, colours, brand, adjectives) and a tasteful, accessible default — but prefer `design.md`
|
|
89
90
|
whenever it exists.
|
|
@@ -35,7 +35,7 @@ Write it in this order:
|
|
|
35
35
|
| 2 refine | Personal travel blog about coastal towns in the UK; backend: WordPress. |
|
|
36
36
|
| 3 provision | Business plan, order 41875230; setup took 6 min; domain, SSL and WordPress checks passed. |
|
|
37
37
|
| 4 content model | 5 pages, 8 posts, 6 categories, 1 menu, 14 images (Hostinger AI), SEO titles on every page; counts re-read from the REST API. |
|
|
38
|
-
| 5 design | "Salt & Ink" direction: serif headings, sea-blue accents; `design.md` and logo written
|
|
38
|
+
| 5 design | "Salt & Ink" direction: serif headings, sea-blue accents; `design.md` and logo icon written. |
|
|
39
39
|
| 6 frontend | Next.js SSR with home, blog, post, category and contact pages wired to the REST API; local build passed. |
|
|
40
40
|
| 7 validate | Instance setup completed; REST API returned the 8 pushed posts; no preview (nobody signing off). |
|
|
41
41
|
| 8 deploy | Source uploaded, build finished in 3 min; site root returns 200. |
|
package/src/core/runtime.js
CHANGED
|
@@ -62,7 +62,7 @@ const GetSkillRequestSchema = z.object({
|
|
|
62
62
|
|
|
63
63
|
/**
|
|
64
64
|
* MCP Server for Hostinger API
|
|
65
|
-
* Generated from OpenAPI spec version 2.
|
|
65
|
+
* Generated from OpenAPI spec version 2.7.0
|
|
66
66
|
*/
|
|
67
67
|
class MCPServer {
|
|
68
68
|
constructor({ name, version, tools, instructions, skills = [] }) {
|
package/src/core/runtime.ts
CHANGED
|
@@ -94,7 +94,7 @@ interface Skill { uri: string; frontmatter: Record<string, unknown>; resources:
|
|
|
94
94
|
|
|
95
95
|
/**
|
|
96
96
|
* MCP Server for Hostinger API
|
|
97
|
-
* Generated from OpenAPI spec version 2.
|
|
97
|
+
* Generated from OpenAPI spec version 2.7.0
|
|
98
98
|
*/
|
|
99
99
|
class MCPServer {
|
|
100
100
|
private readonly name: string;
|