webcake-landing-mcp 1.0.35 → 1.0.37

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.
@@ -1,4 +1,18 @@
1
1
  [
2
+ {
3
+ "v": "1.0.37",
4
+ "d": "08/06/2026",
5
+ "type": "Changed",
6
+ "en": "get_generation_guide now includes a HEADER section build hint directing the agent to place every header child (logo, brand text, CTA button) on a…",
7
+ "vi": "get_generation_guide nay bổ sung gợi ý dựng section HEADER yêu cầu agent đặt mọi phần tử con trong header (logo, tên thương hiệu, nút CTA) trên cùng…"
8
+ },
9
+ {
10
+ "v": "1.0.36",
11
+ "d": "08/06/2026",
12
+ "type": "Changed",
13
+ "en": "The GET / web guide page now lists \"Claude · Codex · Cursor, etc.\" instead of only \"Claude · Cursor\" in the AI assistant flow diagram, reflecting…",
14
+ "vi": "Trang hướng dẫn GET / nay hiển thị \"Claude · Codex · Cursor, v.v.\" thay vì chỉ \"Claude · Cursor\" trong sơ đồ luồng AI assistant, phản ánh danh sách…"
15
+ },
2
16
  {
3
17
  "v": "1.0.35",
4
18
  "d": "08/06/2026",
@@ -26,19 +40,5 @@
26
40
  "type": "Fixed",
27
41
  "en": "get_element for select now marks specials.field_placeholder as required (the published renderer crashes without it), the element seed now emits a…",
28
42
  "vi": "get_element cho select nay đánh dấu specials.field_placeholder là bắt buộc (renderer đã xuất bản sẽ crash nếu thiếu trường này), seed phần tử nay…"
29
- },
30
- {
31
- "v": "1.0.31",
32
- "d": "08/06/2026",
33
- "type": "Fixed",
34
- "en": "get_element for spin_wheel now correctly documents specials.code as a newline-delimited string (one line per segment in couponCode|Prize…",
35
- "vi": "get_element cho spin_wheel nay ghi lại đúng specials.code là chuỗi phân cách bằng dấu xuống dòng (mỗi dòng một segment theo định dạng couponCode|Tên…"
36
- },
37
- {
38
- "v": "1.0.30",
39
- "d": "08/06/2026",
40
- "type": "Changed",
41
- "en": "The server instructions now direct the agent to gather all get_element and get_generation_guide results before assembling the page source, build the…",
42
- "vi": "Hướng dẫn cho agent nay yêu cầu thu thập toàn bộ kết quả get_element và get_generation_guide trước khi lắp ráp nguồn trang, xây dựng cây phần tử đầy…"
43
43
  }
44
44
  ]
@@ -68,6 +68,7 @@ VISUAL VARIETY (make two pages of the SAME type still look different — driven
68
68
 
69
69
  SECTION BUILD HINTS (apply to whichever sections the chosen archetype uses)
70
70
  - Each section is one visual band: height that comfortably holds its content (taller on mobile since things stack), background that contrasts its text.
71
+ - HEADER — logo/brand on the left, nav/CTA on the right, all on ONE shared vertical centerline: give every header child the SAME vertical center (match top + height/2 across the logo, brand text, and CTA button) so nothing sits higher/lower than the rest. Keep the same left/right margins as the sections below so the header lines up with the page's horizontal axis.
71
72
  - HERO — always a clear H1, a short supporting line, and the primary CTA visible without scrolling.
72
73
  - FEATURES / BENEFITS — a row of equal cards (icon + title + text) or a 2-column list. Center the row with the ROW math; on mobile shrink to one canvas width or stack.
73
74
  - PRODUCT / OFFER — image beside name + price + benefit list + CTA (swap sides per balance). Price and CTA stand out.
@@ -79,7 +80,7 @@ RULES
79
80
  - Visible content goes in "specials" (text-block.specials.text, image-block.specials.src…), NEVER in "styles".
80
81
  - Colors as rgba(r,g,b,a). fontSize/borderWidth/top/left/width/height are NUMBERS (px).
81
82
  - IMAGES: a real landing page has images (hero/product shot, feature icons, about photo). PREFER REAL PHOTOS: call search_images with a short English subject (e.g. 'fresh coffee cup', 'modern office team') and put a returned URL into image-block specials.src — use src.large for a hero/banner, src.medium for a card/thumb (avg_color helps pick a matching section background). ONLY if search_images returns ok:false (or is unreachable) FALL BACK to a PLACEHOLDER sized to the box: "https://placehold.co/<width>x<height>". NEVER leave src empty — it renders blank and the page looks broken. gallery.media = array of OBJECTS {type:'image', link:'<real-or-placeholder-url>', linkVideo:'', typeVideo:'youtube', imageCompression:true} (NOT plain URL strings — the gallery reads item.link); video.specials.img = a poster image (real photo, else placeholder).
82
- - CONTRAST: text must contrast with the section background (dark text on light sections, light text on dark sections). Don't put light-gray text on white or faint text on a dark background.
83
+ - CONTRAST (check EVERY text element against the band it sits on, especially SATURATED / mid-tone bands like yellow, orange, teal, pink — there "light vs dark text" is not obvious, so decide by the band's luminance): light bands → near-black text (e.g. rgba(20,30,25,1)); dark bands → near-white text; a saturated/mid-tone band → whichever of near-black or near-white actually reads (for a bright yellow/amber band that means DARK text, not white/grey). NEVER use muted-grey, low-alpha (alpha < ~0.85), or near-white text on a colored band — that is exactly what makes labels look faded/sunken. Muted-grey is ONLY for secondary text on a white/very-light band. Icons and their captions follow the SAME rule as the text beside them.
83
84
  - movable:false for section/slide/grid-item/popup; otherwise true. runtime is always {}.
84
85
  - Every form input MUST have a unique specials.field_name.
85
86
  - events item: { "id", "type", "action", "target", ...action-specific extra fields }. TRIGGER (type): click & hover on any element; success & error on a FORM (success = after a successful submit, error = on validation failure); delay on any element (when it scrolls into view); unset on init. Action vocab per trigger: click→CLICK_ACTIONS, hover→HOVER_ACTIONS, success→SUCCESS_ACTIONS, error→ERROR_ACTIONS, delay→DELAY_ACTIONS (all returned by get_generation_guide). For element-targeting actions (open_popup, close_popup, scroll_to, show_section, hide_section, show_hide_element, change_tab, collapse) target = the target element's id; open_link/download_file target = URL; open_sms/send_email/phone_call target = phone/email; copy target = text (or element id when copyType='elementValue'); set_field_value target = field_name; target may be null (e.g. animation_hover). Each action also reads extra fields (e.g. open_link→targetURL/delayTime, scroll_to→scrollMore, change_tab→moveTo/tabIndex, lightbox→typeLightbox/alt, show_hide_element→onlyMode, open_app→appTarget+provider fields, set_field_value→set_value) — see the action maps for the full list.
package/dist/web-guide.js CHANGED
@@ -149,7 +149,7 @@ const T = {
149
149
  flowH2: "Mô hình hoạt động",
150
150
  flow: [
151
151
  { icon: "bulb", t: "Bạn", s: "ý tưởng" },
152
- { icon: "brain", t: "Trợ lý AI", s: "Claude · Cursor" },
152
+ { icon: "brain", t: "Trợ lý AI", s: "Claude · Codex · Cursor,etc..." },
153
153
  { icon: "server", t: "MCP", s: "webcake-landing" },
154
154
  { icon: "window", t: "WebCake", s: "trang thật" },
155
155
  ],
@@ -174,12 +174,36 @@ const T = {
174
174
  ],
175
175
  buildH2: "Bạn dựng được những gì",
176
176
  uses: [
177
- { icon: "magnet", t: "Trang thu lead", e: '"Trang waitlist cho SaaS — hero, 3 lợi ích, form thu email."' },
178
- { icon: "cart", t: "Bán hàng COD / online", e: '"Trang một sản phẩm — gallery, giá, biến thể, form đặt hàng có giỏ."' },
179
- { icon: "ticket", t: "Sự kiện / webinar", e: '"Trang đăng ký — đếm ngược, agenda, form đăng ký."' },
180
- { icon: "mail", t: "Thiệp mời", e: '"Thiệp cưới tên, ngày, bản đồ, form RSVP."' },
181
- { icon: "phone", t: "Quảng bá app", e: '"Mockup điện thoại, danh sách tính năng, nút App Store + Google Play."' },
182
- { icon: "flame", t: "Flash sale", e: '"Đồng hồ đếm ngược to, lưới sản phẩm giảm giá, nút Mua dính."' },
177
+ {
178
+ icon: "magnet",
179
+ t: "Trang thu lead",
180
+ e: '"Trang waitlist cho SaaShero, 3 lợi ích, form thu email."',
181
+ },
182
+ {
183
+ icon: "cart",
184
+ t: "Bán hàng COD / online",
185
+ e: '"Trang một sản phẩm — gallery, giá, biến thể, form đặt hàng có giỏ."',
186
+ },
187
+ {
188
+ icon: "ticket",
189
+ t: "Sự kiện / webinar",
190
+ e: '"Trang đăng ký — đếm ngược, agenda, form đăng ký."',
191
+ },
192
+ {
193
+ icon: "mail",
194
+ t: "Thiệp mời",
195
+ e: '"Thiệp cưới — tên, ngày, bản đồ, form RSVP."',
196
+ },
197
+ {
198
+ icon: "phone",
199
+ t: "Quảng bá app",
200
+ e: '"Mockup điện thoại, danh sách tính năng, nút App Store + Google Play."',
201
+ },
202
+ {
203
+ icon: "flame",
204
+ t: "Flash sale",
205
+ e: '"Đồng hồ đếm ngược to, lưới sản phẩm giảm giá, nút Mua dính."',
206
+ },
183
207
  ],
184
208
  connectH2: "Kết nối — chọn 1 trong 2 cách",
185
209
  m1Tag: "Cách ① · npx — chạy trên máy bạn",
@@ -196,15 +220,24 @@ const T = {
196
220
  m2Steps: [
197
221
  '<b>Lấy link cá nhân</b> (đã gắn sẵn token) — mở trang sau rồi bấm <b>Copy</b>:<a class="btn" href="{REMOTE}">Mở {REMOTE_HOST} {ARROW}</a>',
198
222
  '<b>Mở phần thêm connector</b> trong client:<br>• claude.ai: <i>Settings → Connectors → Add custom connector</i><br>• Cursor / Claude Code: mở file <code class="inl">.mcp.json</code>',
199
- '<b>Dán link</b> vừa copy (có dạng):<pre>{ENDPOINT}?jwt=&lt;TOKEN&gt;</pre>',
223
+ "<b>Dán link</b> vừa copy (có dạng):<pre>{ENDPOINT}?jwt=&lt;TOKEN&gt;</pre>",
200
224
  "<b>Bấm Add</b> (hoặc lưu file) → đợi kết nối → xong. Icon Webcake xanh hiện lên là chạy được.",
201
225
  ],
202
226
  m2Note: "⚠️ Link chứa token cá nhân — coi như mật khẩu, đừng chia sẻ, luôn dùng HTTPS.",
203
227
  afterH2: "Sau khi kết nối, bạn nói được",
204
228
  examples: [
205
- { icon: "wand", t: '"Dựng landing bán khoá học, tông xanh, có form đăng ký + nút Zalo."' },
206
- { icon: "edit", t: '"Mở trang <i>sale-hè</i>, đổi tiêu đề thành \'Giảm 50%\', nút sang màu đỏ."' },
207
- { icon: "clock", t: '"Thêm section đếm ngược + 3 testimonial vào cuối trang."' },
229
+ {
230
+ icon: "wand",
231
+ t: '"Dựng landing bán khoá học, tông xanh, form đăng ký + nút Zalo."',
232
+ },
233
+ {
234
+ icon: "edit",
235
+ t: "\"Mở trang <i>sale-hè</i>, đổi tiêu đề thành 'Giảm 50%', nút sang màu đỏ.\"",
236
+ },
237
+ {
238
+ icon: "clock",
239
+ t: '"Thêm section đếm ngược + 3 testimonial vào cuối trang."',
240
+ },
208
241
  ],
209
242
  newH2: "Có gì mới",
210
243
  newBadge: "MỚI",
@@ -227,7 +260,7 @@ const T = {
227
260
  flowH2: "How it flows",
228
261
  flow: [
229
262
  { icon: "bulb", t: "You", s: "your idea" },
230
- { icon: "brain", t: "AI assistant", s: "Claude · Cursor" },
263
+ { icon: "brain", t: "AI assistant", s: "Claude · Codex · Cursor,etc..." },
231
264
  { icon: "server", t: "MCP", s: "webcake-landing" },
232
265
  { icon: "window", t: "WebCake", s: "a real page" },
233
266
  ],
@@ -237,7 +270,7 @@ const T = {
237
270
  {
238
271
  icon: "brain",
239
272
  t: "AI learns the real model",
240
- d: 'Webcake\'s element catalog, <code class="inl">specials</code>, coordinate system and events — pulled straight from this server\'s tools.',
273
+ d: "Webcake's element catalog, <code class=\"inl\">specials</code>, coordinate system and events — pulled straight from this server's tools.",
241
274
  },
242
275
  {
243
276
  icon: "check2",
@@ -252,12 +285,36 @@ const T = {
252
285
  ],
253
286
  buildH2: "What you can build",
254
287
  uses: [
255
- { icon: "magnet", t: "Lead-gen page", e: '"A SaaS waitlist — hero, 3 benefits, an email-capture form."' },
256
- { icon: "cart", t: "COD / online store", e: '"A one-product page — gallery, price, variations, an order form with cart."' },
257
- { icon: "ticket", t: "Event / webinar", e: '"A registration page — countdown, agenda, sign-up form."' },
258
- { icon: "mail", t: "Invitation", e: '"A wedding invitenames, date, a map, an RSVP form."' },
259
- { icon: "phone", t: "App promo", e: '"Phone mockups, feature list, App Store + Google Play buttons."' },
260
- { icon: "flame", t: "Flash sale", e: '"A big countdown, a discounted product grid, a sticky Buy button."' },
288
+ {
289
+ icon: "magnet",
290
+ t: "Lead-gen page",
291
+ e: '"A SaaS waitlisthero, 3 benefits, an email-capture form."',
292
+ },
293
+ {
294
+ icon: "cart",
295
+ t: "COD / online store",
296
+ e: '"A one-product page — gallery, price, variations, an order form with cart."',
297
+ },
298
+ {
299
+ icon: "ticket",
300
+ t: "Event / webinar",
301
+ e: '"A registration page — countdown, agenda, sign-up form."',
302
+ },
303
+ {
304
+ icon: "mail",
305
+ t: "Invitation",
306
+ e: '"A wedding invite — names, date, a map, an RSVP form."',
307
+ },
308
+ {
309
+ icon: "phone",
310
+ t: "App promo",
311
+ e: '"Phone mockups, feature list, App Store + Google Play buttons."',
312
+ },
313
+ {
314
+ icon: "flame",
315
+ t: "Flash sale",
316
+ e: '"A big countdown, a discounted product grid, a sticky Buy button."',
317
+ },
261
318
  ],
262
319
  connectH2: "Connect — pick one of two ways",
263
320
  m1Tag: "Way ① · npx — runs on your machine",
@@ -274,15 +331,24 @@ const T = {
274
331
  m2Steps: [
275
332
  '<b>Get your personal link</b> (token baked in) — open the page below and hit <b>Copy</b>:<a class="btn" href="{REMOTE}">Open {REMOTE_HOST} {ARROW}</a>',
276
333
  '<b>Open the add-connector area</b> in your client:<br>• claude.ai: <i>Settings → Connectors → Add custom connector</i><br>• Cursor / Claude Code: open <code class="inl">.mcp.json</code>',
277
- '<b>Paste the link</b> you copied (looks like):<pre>{ENDPOINT}?jwt=&lt;TOKEN&gt;</pre>',
334
+ "<b>Paste the link</b> you copied (looks like):<pre>{ENDPOINT}?jwt=&lt;TOKEN&gt;</pre>",
278
335
  "<b>Hit Add</b> (or save the file) → wait for it to connect → done. A green Webcake icon means it's live.",
279
336
  ],
280
337
  m2Note: "⚠️ The link carries your personal token — treat it like a password, never share it, always use HTTPS.",
281
338
  afterH2: "Once connected, you can say",
282
339
  examples: [
283
- { icon: "wand", t: '"Build a landing page to sell a course, green theme, a sign-up form + a Zalo button."' },
284
- { icon: "edit", t: "\"Open the <i>summer-sale</i> page, change the headline to 'Save 50%', make the button red.\"" },
285
- { icon: "clock", t: '"Add a countdown section + 3 testimonials to the bottom of the page."' },
340
+ {
341
+ icon: "wand",
342
+ t: '"Build a landing page to sell a course, green theme, a sign-up form + a Zalo button."',
343
+ },
344
+ {
345
+ icon: "edit",
346
+ t: "\"Open the <i>summer-sale</i> page, change the headline to 'Save 50%', make the button red.\"",
347
+ },
348
+ {
349
+ icon: "clock",
350
+ t: '"Add a countdown section + 3 testimonials to the bottom of the page."',
351
+ },
286
352
  ],
287
353
  newH2: "What's new",
288
354
  newBadge: "NEW",
@@ -319,7 +385,7 @@ const CL_TYPE_VI = {
319
385
  function clTag(type, lang) {
320
386
  if (!type)
321
387
  return "";
322
- const label = lang === "vi" ? CL_TYPE_VI[type] ?? "" : type;
388
+ const label = lang === "vi" ? (CL_TYPE_VI[type] ?? "") : type;
323
389
  return label ? ` <span class="cl-tag">${label}</span>` : "";
324
390
  }
325
391
  function steps(items) {
@@ -354,11 +420,20 @@ export function guideHtml(origin, lang = "vi") {
354
420
  url: canonical,
355
421
  image: ogImage,
356
422
  offers: { "@type": "Offer", price: "0", priceCurrency: "USD" },
357
- author: { "@type": "Organization", name: "Webcake", url: "https://webcake.io" },
423
+ author: {
424
+ "@type": "Organization",
425
+ name: "Webcake",
426
+ url: "https://webcake.io",
427
+ },
358
428
  softwareHelp: DOCS_URL,
359
429
  installUrl: NPM_URL,
360
430
  },
361
- { "@type": "WebSite", name: "Webcake Landing MCP", url: `${origin}/`, inLanguage: L },
431
+ {
432
+ "@type": "WebSite",
433
+ name: "Webcake Landing MCP",
434
+ url: `${origin}/`,
435
+ inLanguage: L,
436
+ },
362
437
  {
363
438
  "@type": "FAQPage",
364
439
  mainEntity: faq.map((f) => ({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webcake-landing-mcp",
3
- "version": "1.0.35",
3
+ "version": "1.0.37",
4
4
  "description": "MCP server exposing Webcake landing-page element schemas + AI usage hints, and persisting LLM-generated page sources to a Webcake backend.",
5
5
  "type": "module",
6
6
  "license": "MIT",